package ilarkesto.logging;
import ilarkesto.base.Sys;
import ilarkesto.core.logging.Log;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.MessageFormat;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
public abstract class JavaLogging {
private static final Log LOG = Log.get(JavaLogging.class);
public static void redirectToLoggers() {
java.util.logging.Logger rootLogger = java.util.logging.Logger.getLogger("");
Handler[] handlers = rootLogger.getHandlers();
for (Handler handler : handlers) {
rootLogger.removeHandler(handler);
}
rootLogger.addHandler(new LoggerRedirectionHandler());
LOG.debug("Redirecting Java Logging to ilarkesto loggers");
}
public static void redirectToHomeFile(String name) {
redirectToFile(new File(Sys.getUsersHomePath() + "/" + name + ".java.log"));
}
public static void redirectToFile(File file) {
java.util.logging.Logger rootLogger = java.util.logging.Logger.getLogger("");
Handler[] handlers = rootLogger.getHandlers();
for (Handler handler : handlers) {
rootLogger.removeHandler(handler);
}
rootLogger.addHandler(new FileRedirectionHandler(file));
LOG.info("Redirecting Java Logging to file: " + file.getAbsolutePath());
}
public static Log.Level toLevel(Level javaLevel) {
if (javaLevel == Level.FINE || javaLevel == Level.FINER || javaLevel == Level.FINEST || javaLevel == Level.OFF
|| javaLevel == Level.INFO) {
return Log.Level.DEBUG;
} else if (javaLevel == Level.WARNING) {
return Log.Level.WARN;
} else if (javaLevel == Level.SEVERE) {
return Log.Level.FATAL;
} else {
return Log.Level.INFO;
}
}
private static void redirectToLogger(LogRecord record) {
String loggerName = record.getLoggerName();
int idx = loggerName.lastIndexOf('.');
if (idx > 0) {
loggerName = loggerName.substring(idx + 1);
}
Log logger = Log.get(loggerName);
logger.log(toLevel(record.getLevel()), getMessage(record));
}
public static String getMessage(LogRecord record) {
String msg = record.getMessage();
Object[] parameters = record.getParameters();
if (parameters != null && parameters.length > 0) {
msg = MessageFormat.format(msg, parameters);
}
return msg;
}
private static class LoggerRedirectionHandler extends Handler {
@Override
public void close() throws SecurityException {}
@Override
public void flush() {
Log.flush();
}
@Override
public void publish(LogRecord record) {
redirectToLogger(record);
}
}
private static class FileRedirectionHandler extends Handler {
private File file;
private PrintWriter out;
public FileRedirectionHandler(File file) {
this.file = file;
}
private void createOut() {
try {
out = new PrintWriter(new BufferedWriter(new FileWriter(file)));
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
@Override
public void close() throws SecurityException {}
@Override
public void flush() {
if (out == null) return;
out.flush();
Log.flush();
}
@Override
public void publish(LogRecord record) {
if (out == null) createOut();
String loggerName = record.getLoggerName();
int idx = loggerName.lastIndexOf('.');
if (idx > 0) {
loggerName = loggerName.substring(idx + 1);
}
out.print(record.getLevel());
out.print(" ");
out.print(loggerName);
out.print(" ");
out.println(record.getMessage());
out.flush();
Level level = record.getLevel();
if (level == Level.SEVERE || level == Level.WARNING) {
redirectToLogger(record);
}
}
}
}