/** * Copyright [2007] [Rohit B. Rai] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.rzo.yajsw.log; import java.text.DateFormat; import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.Formatter; import java.util.logging.LogManager; import java.util.logging.LogRecord; // TODO: Auto-generated Javadoc /** * The Class PatternFormatter. */ public class PatternFormatter extends Formatter { /** The sh. */ java.util.logging.SimpleFormatter sh; /** * <pre> * The Log Formatter will use the following formatting tokens LoggerName %LOGGER% Level %LEVEL% Time %TIME% Message %MESSAGE% SourceClassName %SOURCECLASS% SourceMethodName %SOURCEMETHOD% Exception Message %EXCEPTION% ExceptionStackTrace %STACKTRACE% Parameter %PARAM% * </pre> * * The default log format is "[%LOGGER% - %LEVEL%] %TIME%: %MESSAGE%" And * exception format is [%LOGGER% - %LEVEL%] %TIME% %MESSAGE% \n Exception: * %EXCEPTION% \n %STACKTRACE% Apart from this the time format may be * specified in satand java time format in the timeFormat variable The * default time format is "dd-MMM-yyy; HH:mm:ss". */ private String logPattern; /** The exception pattern. */ private String exceptionPattern; /** The time format. */ private String timeFormat; /** The log message format. */ private MessageFormat logMessageFormat; /** The exception message format. */ private MessageFormat exceptionMessageFormat; /** The date format. */ private DateFormat dateFormat; /** * Instantiates a new pattern formatter. */ public PatternFormatter() { LogManager manager = LogManager.getLogManager(); String cname = getClass().getName(); timeFormat = manager.getProperty(cname + ".timeFormat"); if (timeFormat == null) { timeFormat = "dd-MMM-yyy; HH:mm:ss"; } setTimeFormat(timeFormat); logPattern = manager.getProperty(cname + ".logPattern"); if (logPattern == null) { logPattern = "[{0} - {1}] {2}: {3} \n"; } setLogPattern(logPattern); exceptionPattern = manager.getProperty(cname + ".exceptionPattern"); if (exceptionPattern == null) { exceptionPattern = "[{0} - {1}] {2} {3} \nException in {4}: {6} \n{7} "; } setExceptionPattern(exceptionPattern); logMessageFormat = new MessageFormat(logPattern); exceptionMessageFormat = new MessageFormat(exceptionPattern); dateFormat = new SimpleDateFormat(timeFormat); } /** * Sets the time format. * * @param timeFormat * the new time format */ public void setTimeFormat(String timeFormat) { this.timeFormat = timeFormat; dateFormat = new SimpleDateFormat(timeFormat); } /** * Sets the log pattern. * * @param logFormat * the new log pattern */ public void setLogPattern(String logFormat) { logFormat = logFormat.replace("%LOGGER%", "{0}"); logFormat = logFormat.replace("%LEVEL%", "{1}"); logFormat = logFormat.replace("%TIME%", "{2}"); logFormat = logFormat.replace("%MESSAGE%", "{3}"); logFormat = logFormat.replace("%SOURCECLASS%", "{4}"); logFormat = logFormat.replace("%SOURCEMETHOD%", "{5}"); logFormat = logFormat.replace("%PARAM0%", "{6}"); logFormat = logFormat.replace("%PARAM1%", "{7}"); this.logPattern = logFormat; logMessageFormat = new MessageFormat(logPattern); } /** * Sets the exception pattern. * * @param exceptionFormat * the new exception pattern */ public void setExceptionPattern(String exceptionFormat) { exceptionFormat = exceptionFormat.replace("%LOGGER%", "{0}"); exceptionFormat = exceptionFormat.replace("%LEVEL%", "{1}"); exceptionFormat = exceptionFormat.replace("%TIME%", "{2}"); exceptionFormat = exceptionFormat.replace("%MESSAGE%", "{3}"); exceptionFormat = exceptionFormat.replace("%SOURCECLASS%", "{4}"); exceptionFormat = exceptionFormat.replace("%SOURCEMETHOD%", "{5}"); exceptionFormat = exceptionFormat.replace("%EXCEPTION%", "{6}"); exceptionFormat = exceptionFormat.replace("%STACKTRACE%", "{7}"); this.exceptionPattern = exceptionFormat; exceptionMessageFormat = new MessageFormat(logPattern); } /* * (non-Javadoc) * * @see java.util.logging.Formatter#format(java.util.logging.LogRecord) */ @Override public String format(LogRecord record) { Date time = new Date(record.getMillis()); String formattedTime = dateFormat.format(time); String logMessage = ""; if (record.getThrown() == null) { Object[] log = { record.getLoggerName(), record.getLevel(), formattedTime, record.getMessage(), record.getSourceClassName(), record.getSourceMethodName(), record.getParameters() == null ? "" : record.getParameters()[0], record.getParameters() == null ? "" : record.getParameters()[1] }; logMessage = logMessageFormat.format(log); } else { String stack = getStackLayout(record.getThrown(), ""); Object[] log = { record.getLoggerName(), record.getLevel(), formattedTime, record.getMessage(), record.getSourceClassName(), record.getSourceMethodName(), record.getThrown().getMessage(), stack }; logMessage = exceptionMessageFormat.format(log); } return logMessage; } /** * Gets the stack layout. * * @param t * the t * @param indenter * the indenter * * @return the stack layout */ private String getStackLayout(Throwable t, String indenter) { indenter = indenter + " "; StackTraceElement[] ste = t.getStackTrace(); String stack = indenter + ste[0].toString(); for (int i = 1; i < ste.length; i++) { stack = stack + "\n" + indenter + ste[i]; } String innerStack = ""; if (t.getCause() != null) { innerStack = indenter + "Caused by: " + t.getCause().getMessage() + "\n"; innerStack = innerStack + getStackLayout(t.getCause(), indenter); } stack = stack + "\n" + innerStack; return stack; } /** * Gets the exception pattern. * * @return the exception pattern */ public String getExceptionPattern() { return exceptionPattern; } /** * Gets the log pattern. * * @return the log pattern */ public String getLogPattern() { return logPattern; } /** * Gets the time format. * * @return the time format */ public String getTimeFormat() { return timeFormat; } }