blob: 17658221865165b3000cb786672b57e359ec4b00 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2019 Xored Software Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Xored Software Inc - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.rcptt.logging;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import org.eclipse.core.runtime.IStatus;
public abstract class BaseFileQ7Monitor implements IQ7Monitor {
static boolean logToConsole = false;
public static void setLogToConsole(boolean value) {
logToConsole = value;
}
protected abstract String getFailMessage();
protected abstract FileHandler getFileHandle() throws IOException;
private SimpleDateFormat formatter = new SimpleDateFormat(
"yyyy/MM/dd HH:mm:ss");
private List<IQ7LogListener> listeners = null;
protected Logger logger;
public BaseFileQ7Monitor() {
super();
}
@Override
public synchronized void addListener(IQ7LogListener listener) {
if (listeners == null) {
listeners = new ArrayList<IQ7LogListener>();
}
listeners.add(listener);
}
@Override
public synchronized void removeListener(IQ7LogListener listener) {
if (listeners != null) {
listeners.remove(listener);
}
}
protected int getLogFileCount() {
return 10;
}
protected int getLogFileSize() {
return 10 * 1024 * 1024;
}
protected void reinit() {
try {
disposeLogger();
logger = Logger.getAnonymousLogger();
logger.setLevel(Level.ALL);
FileHandler fileHandler = getFileHandle();
fileHandler.setFormatter(new Formatter() {
private String lineSeparator = System
.getProperty("line.separator");
@Override
public String format(LogRecord record) {
StringBuffer sb = new StringBuffer();
// Minimize memory allocations here.
String idValue = formatter.format(new Date(record
.getMillis()));
sb.append(idValue + ": ");
String message = formatMessage(record);
message = message.replace("\n", lineSeparator);
sb.append(message);
sb.append(lineSeparator);
if (record.getThrown() != null) {
try {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
record.getThrown().printStackTrace(pw);
pw.close();
sb.append(sw.toString());
} catch (Exception ex) {
}
}
return sb.toString();
}
});
logger.addHandler(fileHandler);
log("############################## NEW SESSION #####################################",
null);
} catch (Exception e) {
Q7LoggingPlugin.error(e.getMessage(), e);
}
}
@Override
public void log(String message) {
log(message, null);
}
@Override
public synchronized void log(String message, Throwable e) {
if (logToConsole) {
System.out.println(message);
if (e != null) {
e.printStackTrace();
}
}
if (listeners != null) {
for (IQ7LogListener l : listeners) {
l.added(message);
}
}
if (this.logger == null) {
reinit();
}
if (this.logger == null) {
Q7LoggingPlugin.error(getFailMessage(), null);
return;
}
logger.log(Level.ALL, message, e);
}
@Override
public void close() {
disposeLogger();
}
private void disposeLogger() {
Logger logger2 = null;
synchronized (this) {
logger2 = logger;
logger = null;
}
if (logger2 != null) {
Handler[] targets = logger2.getHandlers();
for (int i = 0; i < targets.length; i++) {
Handler h = targets[i];
logger2.removeHandler(h);
try {
h.close();
} catch (Exception ex) {
// Problems closing a handler? Keep going...
}
}
}
}
@Override
public void log(IStatus status) {
if (logToConsole) {
System.out.println(status.toString());
}
if (listeners != null) {
for (IQ7LogListener l : listeners) {
l.added(status.getMessage());
}
}
if (this.logger == null) {
reinit();
}
if (this.logger == null) {
Q7LoggingPlugin.error(getFailMessage(), null);
return;
}
logger.log(Level.ALL, status.toString());
}
}