/** * Copyright (c) 2004-2011 QOS.ch * All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.slf4j.impl; import org.slf4j.helpers.FormattingTuple; import org.slf4j.helpers.MarkerIgnoringBase; import org.slf4j.helpers.MessageFormatter; /** * A simple (and direct) implementation that logs messages of level TRACE or * higher on the console (<code>System.err</code>). * * <p> * The output includes the relative time in milliseconds, thread name, the level, logger name, and the message followed by the line * separator for the host. In log4j terms it amounts to the "%r [%t] %level %logger - %m%n" pattern. * </p> * * <p> * Sample output follows. * </p> * * <pre> * 176 [main] INFO examples.Sort - Populating an array of 2 elements in reverse order. * 225 [main] INFO examples.SortAlgo - Entered the sort method. * 304 [main] INFO examples.SortAlgo - Dump of integer array: * 317 [main] INFO examples.SortAlgo - Element [0] = 0 * 331 [main] INFO examples.SortAlgo - Element [1] = 1 * 343 [main] INFO examples.Sort - The next log statement should be an error message. * 346 [main] ERROR examples.SortAlgo - Tried to dump an uninitialized array. * at org.log4j.examples.SortAlgo.dump(SortAlgo.java:58) * at org.log4j.examples.Sort.main(Sort.java:64) * 467 [main] INFO examples.Sort - Exiting main method. * </pre> * * @author Ceki Gülcü */ public class FullSyncLogger extends MarkerIgnoringBase { private static final long serialVersionUID = -1504986506259137575L; /** * Mark the time when this class gets loaded into memory. */ private static long startTime = System.currentTimeMillis(); public static final String LINE_SEPARATOR = System.getProperty("line.separator"); private static final String TRACE_STR = "TRACE"; private static final String DEBUG_STR = "DEBUG"; private static final String INFO_STR = "INFO"; private static final String WARN_STR = "WARN"; private static final String ERROR_STR = "ERROR"; /** * Package access allows only {@link FullSyncLoggerFactory} to instantiate * SimpleLogger instances. */ FullSyncLogger(final String name) { this.name = name; } /** * Always returns true. * * @return always true */ @Override public boolean isTraceEnabled() { return true; } /** * A simple implementation which always logs messages of level TRACE according * to the format outlined above. */ @Override public void trace(final String msg) { log(TRACE_STR, msg, null); } /** * Perform single parameter substitution before logging the message of level * TRACE according to the format outlined above. */ @Override public void trace(final String format, final Object arg) { formatAndLog(TRACE_STR, format, arg, null); } /** * Perform double parameter substitution before logging the message of level * TRACE according to the format outlined above. */ @Override public void trace(final String format, final Object arg1, final Object arg2) { formatAndLog(TRACE_STR, format, arg1, arg2); } /** * Perform double parameter substitution before logging the message of level * TRACE according to the format outlined above. */ @Override public void trace(final String format, final Object... argArray) { formatAndLog(TRACE_STR, format, argArray); } /** * Log a message of level TRACE, including an exception. */ @Override public void trace(final String msg, final Throwable t) { log(TRACE_STR, msg, t); } /** * Always returns true. * * @return always true */ @Override public boolean isDebugEnabled() { return true; } /** * A simple implementation which always logs messages of level DEBUG according * to the format outlined above. */ @Override public void debug(final String msg) { log(DEBUG_STR, msg, null); } /** * Perform single parameter substitution before logging the message of level * DEBUG according to the format outlined above. */ @Override public void debug(final String format, final Object arg1) { formatAndLog(DEBUG_STR, format, arg1, null); } /** * Perform double parameter substitution before logging the message of level * DEBUG according to the format outlined above. */ @Override public void debug(final String format, final Object arg1, final Object arg2) { formatAndLog(DEBUG_STR, format, arg1, arg2); } /** * Perform double parameter substitution before logging the message of level * DEBUG according to the format outlined above. */ @Override public void debug(final String format, final Object... argArray) { formatAndLog(DEBUG_STR, format, argArray); } /** * Log a message of level DEBUG, including an exception. */ @Override public void debug(final String msg, final Throwable t) { log(DEBUG_STR, msg, t); } /** * This is our internal implementation for logging regular (non-parameterized) * log messages. * * @param level * @param message * @param t */ private void log(final String level, final String message, final Throwable t) { final StringBuilder buf = new StringBuilder(); final long millis = System.currentTimeMillis(); buf.append(millis - startTime); buf.append(" ["); buf.append(Thread.currentThread().getName()); buf.append("] "); buf.append(level); buf.append(" "); buf.append(name); buf.append(" - "); buf.append(message); buf.append(LINE_SEPARATOR); System.err.print(buf.toString()); if (t != null) { t.printStackTrace(System.err); } } /** * For formatted messages, first substitute arguments and then log. * * @param level * @param format * @param param1 * @param param2 */ private void formatAndLog(final String level, final String format, final Object arg1, final Object arg2) { final FormattingTuple tp = MessageFormatter.format(format, arg1, arg2); log(level, tp.getMessage(), tp.getThrowable()); } /** * For formatted messages, first substitute arguments and then log. * * @param level * @param format * @param argArray */ private void formatAndLog(final String level, final String format, final Object[] argArray) { final FormattingTuple tp = MessageFormatter.arrayFormat(format, argArray); log(level, tp.getMessage(), tp.getThrowable()); } /** * Always returns true. */ @Override public boolean isInfoEnabled() { return true; } /** * A simple implementation which always logs messages of level INFO according * to the format outlined above. */ @Override public void info(final String msg) { log(INFO_STR, msg, null); } /** * Perform single parameter substitution before logging the message of level * INFO according to the format outlined above. */ @Override public void info(final String format, final Object arg) { formatAndLog(INFO_STR, format, arg, null); } /** * Perform double parameter substitution before logging the message of level * INFO according to the format outlined above. */ @Override public void info(final String format, final Object arg1, final Object arg2) { formatAndLog(INFO_STR, format, arg1, arg2); } /** * Perform double parameter substitution before logging the message of level * INFO according to the format outlined above. */ @Override public void info(final String format, final Object... argArray) { formatAndLog(INFO_STR, format, argArray); } /** * Log a message of level INFO, including an exception. */ @Override public void info(final String msg, final Throwable t) { log(INFO_STR, msg, t); } /** * Always returns true. */ @Override public boolean isWarnEnabled() { return true; } /** * A simple implementation which always logs messages of level WARN according * to the format outlined above. */ @Override public void warn(final String msg) { log(WARN_STR, msg, null); } /** * Perform single parameter substitution before logging the message of level * WARN according to the format outlined above. */ @Override public void warn(final String format, final Object arg) { formatAndLog(WARN_STR, format, arg, null); } /** * Perform double parameter substitution before logging the message of level * WARN according to the format outlined above. */ @Override public void warn(final String format, final Object arg1, final Object arg2) { formatAndLog(WARN_STR, format, arg1, arg2); } /** * Perform double parameter substitution before logging the message of level * WARN according to the format outlined above. */ @Override public void warn(final String format, final Object... argArray) { formatAndLog(WARN_STR, format, argArray); } /** * Log a message of level WARN, including an exception. */ @Override public void warn(final String msg, final Throwable t) { log(WARN_STR, msg, t); } /** * Always returns true. */ @Override public boolean isErrorEnabled() { return true; } /** * A simple implementation which always logs messages of level ERROR according * to the format outlined above. */ @Override public void error(final String msg) { log(ERROR_STR, msg, null); } /** * Perform single parameter substitution before logging the message of level * ERROR according to the format outlined above. */ @Override public void error(final String format, final Object arg) { formatAndLog(ERROR_STR, format, arg, null); } /** * Perform double parameter substitution before logging the message of level * ERROR according to the format outlined above. */ @Override public void error(final String format, final Object arg1, final Object arg2) { formatAndLog(ERROR_STR, format, arg1, arg2); } /** * Perform double parameter substitution before logging the message of level * ERROR according to the format outlined above. */ @Override public void error(final String format, final Object... argArray) { formatAndLog(ERROR_STR, format, argArray); } /** * Log a message of level ERROR, including an exception. */ @Override public void error(final String msg, final Throwable t) { log(ERROR_STR, msg, t); } }