package com.wilutions.itol; import java.io.PrintWriter; import java.io.StringWriter; import java.text.DateFormat; import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogRecord; public class LogFormatter extends Formatter { private final DateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); private final String messageFormat = "{0} " + // ISO Date "{2} " + // Level "[{1}] " + // Thread name "{3}:{4} " + // Class name, line "{5} " + // Message "\n"; @Override public String format(LogRecord record) { String iso = isoFormat.format(new Date(record.getMillis())); String threadName = Thread.currentThread().getName(); Level level = record.getLevel(); String sourceClass = "?"; int lineNumber = 0; StackTraceElement[] stack = Thread.currentThread().getStackTrace(); boolean lookingForLogger = true; for (StackTraceElement frame : stack) { String cname = frame.getClassName(); boolean isLoggerImpl = isLoggerImplFrame(cname); if (lookingForLogger) { // Skip all frames until we have found the first logger frame. if (isLoggerImpl) { lookingForLogger = false; } } else { if (!isLoggerImpl) { // skip reflection call if (!cname.startsWith("java.lang.reflect.") && !cname.startsWith("sun.reflect.")) { // We've found the relevant frame. sourceClass = cname; lineNumber = frame.getLineNumber(); break; } } } } int p = sourceClass.lastIndexOf('.'); if (p >= 0) sourceClass = sourceClass.substring(p+1); String message = record.getMessage(); String msg = MessageFormat.format(messageFormat, iso, threadName, level, sourceClass, lineNumber, message); Throwable ex = record.getThrown(); if (ex != null) { StringWriter sw = new StringWriter(); PrintWriter pr = new PrintWriter(sw); ex.printStackTrace(pr); pr.close(); msg += sw.toString(); } return msg; } private boolean isLoggerImplFrame(String cname) { return (cname.equals("java.util.logging.Logger") || cname.startsWith("java.util.logging.LoggingProxyImpl") || cname.startsWith("sun.util.logging.")); } }