/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.github.geophile.erdo.util; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Date; import java.util.StringTokenizer; import java.util.logging.LogRecord; public class LogFormatter extends java.util.logging.Formatter { public synchronized String format(LogRecord record) { StringBuilder recordBuffer = new StringBuilder(); StringBuilder recordLabel = new StringBuilder(); // Timestamp /* now.setTime(record.getMillis()); StringBuffer timestamp = new StringBuffer(); Formatter timeFormatter = new Formatter(timestamp); timeFormatter.format(timeFormat, now); */ long timestamp = record.getMillis(); // Level recordLabel.append(record.getLevel().getLocalizedName()); recordLabel.append(' '); // Source location StackTraceElement caller = caller(); recordLabel.append(caller.getClassName()); recordLabel.append('.'); recordLabel.append(caller.getMethodName()); recordLabel.append('('); recordLabel.append(caller.getFileName()); recordLabel.append(':'); recordLabel.append(caller.getLineNumber()); recordLabel.append(") "); // Message StringTokenizer tokenizer = new StringTokenizer(formatMessage(record), "\n"); int lineCount = 0; while (tokenizer.hasMoreTokens()) { if (lineCount > 0) { recordBuffer.append('\n'); } recordBuffer.append(timestamp); recordBuffer.append(String.format(" %07d.%03d ", record.getSequenceNumber(), lineCount)); recordBuffer.append(recordLabel); recordBuffer.append(tokenizer.nextToken()); lineCount++; } // Stack if (record.getThrown() != null) { try { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); record.getThrown().printStackTrace(pw); pw.close(); tokenizer = new StringTokenizer(sw.toString(), "\n"); while (tokenizer.hasMoreTokens()) { recordBuffer.append('\n'); recordBuffer.append(timestamp); recordBuffer.append(String.format(" %07d.%03d ", record.getSequenceNumber(), lineCount)); recordBuffer.append(recordLabel); recordBuffer.append(tokenizer.nextToken()); lineCount++; } } catch (Exception ex) { } } recordBuffer.append('\n'); return recordBuffer.toString(); } public LogFormatter() { } private StackTraceElement caller() { StackTraceElement frame; StackTraceElement stack[] = (new Throwable()).getStackTrace(); int i = 0; do { frame = stack[i++]; } while (ignoreFrame(frame)); return stack[--i]; } private static boolean ignoreFrame(StackTraceElement frame) { String className = frame.getClassName(); return className.equals(THIS_CLASS_NAME) || className.startsWith(JAVA_LOGGING_PACKAGE_NAME); } private static final String THIS_CLASS_NAME = LogFormatter.class.getName(); private static final String JAVA_LOGGING_PACKAGE_NAME = "java.util.logging."; private static final String timeFormat = "%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL"; private final Date now = new Date(); }