package org.andork.logging; /* * This file was adapted from the source of the SimpleFormatter in JDK 1.7 to * port 1.7 functionality to earlier JREs. */ /******************************************************************************* * Breakout Cave Survey Visualizer * * Copyright (C) 2014 James Edwards * * jedwards8 at fastmail dot fm * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *******************************************************************************/ import java.io.PrintWriter; import java.io.StringWriter; import java.util.Date; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.LogRecord; /** * Print a brief summary of the {@code LogRecord} in a human readable format. * The summary will typically be 1 or 2 lines. * * <p> * <a name="formatting"> <b>Configuration:</b></a> The {@code SimpleFormatter} * is initialized with the <a href="../Formatter.html#syntax">format string</a> * specified in the {@code java.util.logging.SimpleFormatter.format} property to * {@linkplain #format format} the log messages. This property can be defined in * the {@linkplain LogManager#getProperty logging properties} configuration file * or as a system property. If this property is set in both the logging * properties and system properties, the format string specified in the system * property will be used. If this property is not defined or the given format * string is {@linkplain java.util.IllegalFormatException illegal}, the default * format is implementation-specific. * * @since 1.4 * @see java.util.Formatter */ public class Java17SimpleFormatter extends Formatter { // format string for printing the log record private String format = LogManager.getLogManager().getProperty("java.util.logging.SimpleFormatter.format"); private final Date dat = new Date(); public Java17SimpleFormatter() { } public Java17SimpleFormatter(String format) { this.format = format; } /** * Format the given LogRecord. * <p> * The formatting can be customized by specifying the * <a href="../Formatter.html#syntax">format string</a> in the * <a href="#formatting"> {@code java.util.logging.SimpleFormatter.format} * </a> property. The given {@code LogRecord} will be formatted as if by * calling: * * <pre> * {@link String#format String.format}(format, date, source, logger, level, message, thrown); * </pre> * * where the arguments are:<br> * <ol> * <li>{@code format} - the {@link java.util.Formatter java.util.Formatter} * format string specified in the * {@code java.util.logging.SimpleFormatter.format} property or the default * format.</li> * <li>{@code date} - a {@link Date} object representing * {@linkplain LogRecord#getMillis event time} of the log record.</li> * <li>{@code source} - a string representing the caller, if available; * otherwise, the logger's name.</li> * <li>{@code logger} - the logger's name.</li> * <li>{@code level} - the {@linkplain Level#getLocalizedName log level}. * </li> * <li>{@code message} - the formatted log message returned from the * {@link Formatter#formatMessage(LogRecord)} method. It uses * {@link java.text.MessageFormat java.text} formatting and does not use the * {@code java.util.Formatter format} argument.</li> * <li>{@code thrown} - a string representing the * {@linkplain LogRecord#getThrown throwable} associated with the log record * and its backtrace beginning with a newline character, if any; otherwise, * an empty string.</li> * </ol> * * <p> * Some example formats:<br> * <ul> * <li> * {@code java.util.logging.SimpleFormatter.format="%4$s: %5$s [%1$tc]%n"} * <p> * This prints 1 line with the log level ({@code 4$}), the log message ( * {@code 5$}) and the timestamp ({@code 1$}) in a square bracket. * * <pre> * WARNING: warning message [Tue Mar 22 13:11:31 PDT 2011] * </pre> * * </li> * <li> * {@code java.util.logging.SimpleFormatter.format="%1$tc %2$s%n%4$s: %5$s%6$s%n"} * <p> * This prints 2 lines where the first line includes the timestamp ( * {@code 1$}) and the source ({@code 2$}); the second line includes the log * level ({@code 4$}) and the log message ({@code 5$}) followed with the * throwable and its backtrace ({@code 6$}), if any: * * <pre> * Tue Mar 22 13:11:31 PDT 2011 MyClass fatal * SEVERE: several message with an exception * java.lang.IllegalArgumentException: invalid argument * at MyClass.mash(MyClass.java:9) * at MyClass.crunch(MyClass.java:6) * at MyClass.main(MyClass.java:3) * </pre> * * </li> * <li> * {@code java.util.logging.SimpleFormatter.format="%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %2$s%n%4$s: %5$s%n"} * <p> * This prints 2 lines similar to the example above with a different * date/time formatting and does not print the throwable and its backtrace: * * <pre> * Mar 22, 2011 1:11:31 PM MyClass fatal * SEVERE: several message with an exception * </pre> * * </li> * </ul> * <p> * This method can also be overridden in a subclass. It is recommended to * use the {@link Formatter#formatMessage} convenience method to localize * and format the message field. * * @param record * the log record to be formatted. * @return a formatted log record */ @Override public synchronized String format(LogRecord record) { dat.setTime(record.getMillis()); String source; if (record.getSourceClassName() != null) { source = record.getSourceClassName(); if (record.getSourceMethodName() != null) { source += " " + record.getSourceMethodName(); } } else { source = record.getLoggerName(); } String message = formatMessage(record); String throwable = ""; if (record.getThrown() != null) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); pw.println(); record.getThrown().printStackTrace(pw); pw.close(); throwable = sw.toString(); } return String.format(format, dat, source, record.getLoggerName(), record.getLevel().getLocalizedName(), message, throwable); } }