/** * Copyright (c) 2009 - 2010 AppWork UG(haftungsbeschränkt) <e-mail@appwork.org> * * This file is part of org.appwork.utils.logging * * This software is licensed under the Artistic License 2.0, * see the LICENSE file or http://www.opensource.org/licenses/artistic-license-2.0.php * for details */ package org.appwork.utils.logging; import java.text.DateFormat; import java.util.Date; import java.util.logging.LogRecord; import java.util.logging.SimpleFormatter; import org.appwork.utils.Exceptions; public class LogFormatter extends SimpleFormatter { /** * Date to convert timestamp to a readable format */ private final Date date = new Date(); /** * For thread controlled logs */ private int lastThreadID; /** * Dateformat to convert timestamp to a readable format */ private final DateFormat longTimestamp = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); @Override public synchronized String format(final LogRecord record) { /* clear StringBuilder buffer */ final StringBuilder sb = new StringBuilder(); // Minimize memory allocations here. this.date.setTime(record.getMillis()); final String message = this.formatMessage(record); final int th = record.getThreadID(); // new Thread. if (th != this.lastThreadID) { sb.append("\r\n THREAD: "); sb.append(th); sb.append("\r\n"); } this.lastThreadID = th; sb.append(record.getThreadID()); sb.append('|'); sb.append(record.getLoggerName()); sb.append(' '); sb.append(this.longTimestamp.format(this.date)); sb.append(" - "); sb.append(record.getLevel().getName()); sb.append(" [ "); if (record.getSourceClassName() != null) { sb.append(record.getSourceClassName()); } else { sb.append(record.getLoggerName()); } if (record.getSourceMethodName() != null) { sb.append('('); sb.append(record.getSourceMethodName()); sb.append(')'); } sb.append(" ] "); sb.append("-> "); sb.append(message); sb.append("\r\n"); if (record.getThrown() != null) { sb.append(Exceptions.getStackTrace(record.getThrown())); sb.append("\r\n"); } return sb.toString(); } }