package org.jacorb.config; /* * JacORB - a free Java ORB * * Copyright (C) 1997-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ import java.io.PrintWriter; import java.io.StringWriter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.logging.Formatter; import java.util.logging.LogRecord; /** * A formatter for JDK logs which produces a more concise log output * than the standard JDK setting. * * @author Andre Spiegel {@literal <spiegel@gnu.org>} * @author Nick Cross */ public class JacORBLogFormatter extends Formatter { public static enum ClockFormat { TIME, DATE_TIME, NONE; public static ClockFormat getClockFormat (String cf) throws ConfigurationException { try { return valueOf (cf.toUpperCase()); } catch (IllegalArgumentException e) { throw new ConfigurationException ("Invalid type for ClockFormat", e); } } }; private final DateFormat timeFormat; private boolean showThread; private boolean showSrcInfo; private ClockFormat clockFormat; public JacORBLogFormatter (boolean show_thread, boolean srcinfo, ClockFormat cf) { showThread = show_thread; showSrcInfo = srcinfo; clockFormat = cf; if (clockFormat == ClockFormat.DATE_TIME) { timeFormat = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss.SSS"); } else { timeFormat = null; } } @Override public String format (LogRecord record) { String result; result = String.format ( (clockFormat != ClockFormat.NONE ? "%s %s " : "%s%s ") + (showSrcInfo ? "%s::%s" : "%s%s") + (showThread ? " [%d] " : "%s" ) + "%s\n", (clockFormat != ClockFormat.NONE ? getClockFormat(record.getMillis()) : ""), record.getLevel(), (showSrcInfo ? record.getSourceClassName() : ""), (showSrcInfo ? record.getSourceMethodName() : ""), (showThread ? record.getThreadID() : ""), record.getMessage() ); Throwable t = record.getThrown(); return t == null ? result : result + getStackTrace (t); } private String getStackTrace (Throwable t) { StringWriter sw = new StringWriter(); t.printStackTrace(new PrintWriter (sw)); return sw.toString(); } private String getClockFormat (long millis) { switch (clockFormat) { case NONE: { return ""; } case TIME: { return String.format("%02d:%02d:%02d", (millis / (1000 * 60 * 60)) % 24, (millis / (1000 * 60)) % 60, (millis / 1000) % 60 ); } case DATE_TIME: { return timeFormat.format (millis); } default: throw new RuntimeException ("Invalid clock format type"); } } }