/* * Copyright 1999,2004 The Apache Software Foundation. * * 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.apache.log4j; import org.apache.log4j.spi.LoggerFactory; import org.apache.log4j.helpers.MessageFormatter; /** * This is the central class in the log4j package. Most logging * operations, except configuration, are done through this class. * <p> * * @author Ceki Gülcü * @since log4j 1.2 */ public class Logger extends Category { /** * The fully qualified name of the Logger class. See also the {@link #getFQCN} * method. */ private static final String FQCN = Logger.class.getName(); /** * This constructor creates a new <code>Logger</code> instance and sets * its name. * * <p> * It is intended to be used by sub-classes only. You should not create * loggers directly. * </p> * * @param name The name of the logger. */ protected Logger(String name) { super(name); } /** * Retrieve a logger by name. If the named logger already exists, then the * existing instance will be reutrned. Otherwise, a new instance is created. * * <p>By default, loggers do not have a set level but inherit it from their * ancestors. This is one of the central features of log4j. * </p> * * @param name The name of the logger to retrieve. */ public static Logger getLogger(String name) { return LogManager.getLogger(name); } /** * Shorthand for <code>{@link #getLogger(Class) getLogger(clazz.getName())}</code>. * * @param clazz The name of <code>clazz</code> will be used as the name of * the logger to retrieve. See {@link #getLogger(String)} for * more detailed information. */ public static Logger getLogger(Class clazz) { return LogManager.getLogger(clazz.getName()); } /** * Return the root of logger for the current hierarchy. * * <p>The root logger is always instantiated and available. It's name is * "root". * </p> * * <p>Nevertheless, note that calling <code>Logger.getLogger("root")</code> * does not retrieve the root logger but a logger just under root named * "root". * </p> */ public static Logger getRootLogger() { return LogManager.getRootLogger(); } /** Like {@link #getLogger(String)} except that the type of logger instantiated depends on the type returned by the {@link LoggerFactory#makeNewLoggerInstance} method of the <code>factory</code> parameter. <p>This method is intended to be used by sub-classes. @param name The name of the logger to retrieve. @param factory A {@link LoggerFactory} implementation that will actually create a new Instance. @since 0.8.5 */ public static Logger getLogger(String name, LoggerFactory factory) { return LogManager.getLogger(name, factory); } /** * Log a message object with the {@link Level#TRACE TRACE} level. * * @param message the message object to log. * @see #debug(Object) for an explanation of the logic applied. * @since 1.2.12 */ public void trace(Object message) { if (repository.isDisabled(Level.TRACE_INT)) { return; } if (Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel())) { forcedLog(FQCN, Level.TRACE, message, null); } } /** * Log a message object with the <code>TRACE</code> level including the * stack trace of the {@link Throwable}<code>t</code> passed as parameter. * * <p> * See {@link #debug(Object)} form for more detailed information. * </p> * * @param message the message object to log. * @param t the exception to log, including its stack trace. * @since 1.2.12 */ public void trace(Object message, Throwable t) { if (repository.isDisabled(Level.TRACE_INT)) { return; } if (Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel())) { forcedLog(FQCN, Level.TRACE, message, t); } } /** * Log a message with the <code>TRACE</code> level with message formatting * done according to the value of <code>messagePattern</code> and * <code>arg</code> parameters. * <p> * This form avoids superflous parameter construction. Whenever possible, * you should use this form instead of constructing the message parameter * using string concatenation. * * @param messagePattern The message pattern which will be parsed and formatted * @param arg The argument to replace the formatting element, i,e, * the '{}' pair within <code>messagePattern</code>. * @since 1.3 */ public void trace(Object messagePattern, Object arg) { if (repository.isDisabled(Level.TRACE_INT)) { return; } if (Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel())) { if (messagePattern instanceof String){ String msgStr = (String) messagePattern; msgStr = MessageFormatter.format(msgStr, arg); forcedLog(FQCN, Level.TRACE, msgStr, null); } else { // To be failsafe, we handle the case where 'messagePattern' is not // a String. Unless the user makes a mistake, this should never happen. forcedLog(FQCN, Level.TRACE, messagePattern, null); } } } /** * Log a message with the <code>TRACE</code> level with message formatting * done according to the messagePattern and the arguments arg1 and arg2. * <p> * This form avoids superflous parameter construction. Whenever possible, * you should use this form instead of constructing the message parameter * using string concatenation. * * @param messagePattern The message pattern which will be parsed and formatted * @param arg1 The first argument to replace the first formatting element * @param arg2 The second argument to replace the second formatting element * @since 1.3 */ public void trace(String messagePattern, Object arg1, Object arg2) { if (repository.isDisabled(Level.TRACE_INT)) { return; } if (Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel())) { messagePattern = MessageFormatter.format(messagePattern, arg1, arg2); forcedLog(FQCN, Level.TRACE, messagePattern, null); } } /** * Log a message with the <code>FATAL</code> level with message formatting * done according to the messagePattern and the arguments arg1 and arg2. * <p> * This form avoids superflous parameter construction. Whenever possible, * you should use this form instead of constructing the message parameter * using string concatenation. * * @param messagePattern The message pattern which will be parsed and formatted * @param arg1 The first argument to replace the first formatting element * @param arg2 The second argument to replace the second formatting element * @since 1.3 */ public void fatal(String messagePattern, Object arg1, Object arg2) { if (repository.isDisabled(Level.FATAL_INT)) { return; } if (Level.FATAL.isGreaterOrEqual(this.getEffectiveLevel())) { messagePattern = MessageFormatter.format(messagePattern, arg1, arg2); forcedLog(FQCN, Level.FATAL, messagePattern, null); } } } // End of class: Logger.java