SimpleLogFormatter.java
/*
* SimpleLogFormatter
*
* $Id$
* $HeadURL$
*/
package gov.usgs.util.logging;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
/**
* Simple(r) log formatter for java.util.logging messages.
*
* Outputs unique dates once, with all messages sharing that time tab indented below.
*
* Example Format:
* <pre>
* Wed Sep 30 19:31:48 GMT 2009
* INFO Exit code=0
* Wed Sep 30 19:32:52 GMT 2009
* INFO [polldir] duplicate product id=urn:earthquake-usgs-gov:shakemap-scraper:global:2009medd:1
* Wed Sep 30 19:32:53 GMT 2009
* INFO [polldir] received urn:earthquake-usgs-gov:shakemap-scraper:global:2009medd:1
* INFO [losspager] filtering type 'shakemap-scraper', not allowed
* INFO [logging_client] received urn:earthquake-usgs-gov:shakemap-scraper:global:2009medd:1
* INFO [shakemap] received urn:earthquake-usgs-gov:shakemap-scraper:global:2009medd:1
* </pre>
*
*/
public class SimpleLogFormatter extends Formatter {
/** Milliseconds in a second. */
public static final long MILLIS_PER_SECOND = 1000;
/** When the last LogRecord was processed. */
private long lastMillis = 0;
/** Default constructor. */
public SimpleLogFormatter() {
}
/**
* Format a LogRecord for output.
*
* @param record
* LogRecord to format.
* @return formatted LogRecord as String.
*/
public final String format(final LogRecord record) {
StringBuffer buf = new StringBuffer();
if (lastMillis == 0) {
// first run...
buf.append("\n###\n");
}
// chop to nearest second, not outputting millis...
long millis = (record.getMillis() / MILLIS_PER_SECOND)
* MILLIS_PER_SECOND;
if (millis != lastMillis) {
lastMillis = millis;
// add date
buf.append(new Date(lastMillis).toString()).append("\n");
}
// add log message
buf.append(record.getLevel().toString());
buf.append("\tthread=").append(record.getThreadID());
buf.append("\t").append(formatMessage(record));
buf.append("\n");
// output any associated exception
Throwable thrown = record.getThrown();
if (thrown != null) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
thrown.printStackTrace(new PrintStream(out, true));
buf.append(new String(out.toByteArray()));
}
return buf.toString();
}
}