Open Source Repository

Home /open-symphony/oscore-2.2.6 | Repository Home



com/opensymphony/util/Logger.java
/*
 * Copyright (c) 2002-2003 by OpenSymphony
 * All rights reserved.
 */
package com.opensymphony.util;

import com.opensymphony.provider.LogProvider;
import com.opensymphony.provider.ProviderFactory;

import java.io.InputStream;

import java.util.*;


/**
 * The Logger is a quick way of logging messages of different
 * priorities.
 *
 <p><b>Usage</b></p>
 *
 <p>In it's simplest form, place the following field in the class
 * that uses the debugging:</p>
 *
 <p><code>private static Logger log = new Logger(ThisClassName.class);</code></p>
 *
 <p>Then to log messages, in your code use:</p>
 *
 <p><code>log.info("Debug message");</code></p>
 *
 <p>You can have several Loggers in the same class by using the <code>( Class, String )</code>
 * constructor as follows:</p>
 *
 <blockquote><pre>
 *
 *     Logger logger     = newLogger( ThisClassName.class );         // For general logging.
 *     Logger loopLogger = newLogger( ThisClassName.class, "loop" ); // Just for logging my loop.
 *
 </pre></blockquote>
 *
 <p>This will create a Logger with context <code>com.somecompany.thispackage.ThisClassName.loop</code>
 * whose priority can be set from a config file independently of the main logger
 <code>com.somecompany.thispackage.ThisClassName</code>.</p>
 *
 <p>That's about it really. The types of log messages available
 * (in order of severity - least first) are:</p>
 *
 <ul>
 <li>{@link #debug(java.lang.Object)}<li>
 <li>{@link #info(java.lang.Object)}<li>
 <li>{@link #warn(java.lang.Object)}<li>
 <li>{@link #error(java.lang.Object)}<li>
 <li>{@link #fatal(java.lang.Object)}<li>
 </ul>
 *
 <p>Each of these methods has a variation accepting a second parameter
 * of type Throwable. This is useful for logging Exceptions or Errors that
 * are thrown.</p>
 *
 <p>There are corresponding methods for {@link #isDebugEnabled()} ,
 {@link #isInfoEnabled()} etc. to save the overhead of building the log string
 * if the appropriate level is not set, as follows:</p>
 *
 <blockquote><pre>
 *
 *     if ( logger.isInfoEnabled() ) logger.info( "This " + methodCall() + " and the string "
 *                                              + "concatenation will only take place if "
 *                                              + "INFO debugging is currently enabled" );
 *
 </pre></blockquote>
 *
 <p>The actual logging mechanism used depends on the configured
 * {@see com.opensymphony.provider.LogProvider} - this can be set
 * using the logger.provider system property. If not specified,
 * {@see com.opensymphony.provider.log.DefaultLogProvider} is used.</p>
 *
 @author <a href="mailto:[email protected]">Joe Walnes</a>
 @author <a href="mailto:[email protected]">Mike Cannon-Brookes</a>
 @author <a href="mailto:[email protected]">Dan North</a>
 @deprecated If you require this functionality, we recommend you check out
 * the Jakarta commons-logging project.
 @version $Revision: 5 $
 */
public class Logger implements java.io.Serializable {
    //~ Static fields/initializers /////////////////////////////////////////////

    private static final LogProvider logProvider;

    static {
        ProviderFactory factory = ProviderFactory.getInstance();
        providerModify();
        logProvider = (LogProviderfactory.getProvider("logger.provider", com.opensymphony.provider.log.DefaultLogProvider.class.getName());
    }

    //~ Instance fields ////////////////////////////////////////////////////////

    private Object context;

    //~ Constructors ///////////////////////////////////////////////////////////

    /**
     * Create Logger with supplied context.
     */
    public Logger(String name) {
        init(name);
    }

    /**
     * Convenience constructor. Calls {@link #Logger(java.lang.String)} with cls.getName()
     */
    public Logger(Class cls) {
        init(cls.getName());
    }

    /**
     * Convenience constructor. Calls {@link #Logger(java.lang.String)} with obj.getClass().getName()
     */
    public Logger(Object obj) {
        init(obj.getClass().getName());
    }

    /**
     * Convenience constructor. Creates the context string as the class name appended with
     * the subcontext, with a "." if required.
     */
    public Logger(Class cls, String subCategory) {
        if (subCategory == null) {
            init(cls.getName());
        else if (subCategory.charAt(0== '.') {
            init(cls.getName() + subCategory);
        else {
            init(cls.getName() "." + subCategory);
        }
    }

    //~ Methods ////////////////////////////////////////////////////////////////

    public boolean isDebugEnabled() {
        return isEnabledFor(LogProvider.DEBUG);
    }

    public boolean isEnabledFor(int priority) {
        return logProvider.isEnabled(context, priority);
    }

    public boolean isErrorEnabled() {
        return isEnabledFor(LogProvider.ERROR);
    }

    public boolean isFatalEnabled() {
        return isEnabledFor(LogProvider.FATAL);
    }

    public boolean isInfoEnabled() {
        return isEnabledFor(LogProvider.INFO);
    }

    public boolean isWarnEnabled() {
        return isEnabledFor(LogProvider.WARN);
    }

    public void debug(Object o) {
        log(LogProvider.DEBUG, o, null);
    }

    public void debug(Object o, Throwable t) {
        log(LogProvider.DEBUG, o, t);
    }

    public void error(Object o) {
        log(LogProvider.ERROR, o, null);
    }

    public void error(Object o, Throwable t) {
        log(LogProvider.ERROR, o, t);
    }

    public void fatal(Object o) {
        log(LogProvider.FATAL, o, null);
    }

    public void fatal(Object o, Throwable t) {
        log(LogProvider.FATAL, o, t);
    }

    public void info(Object o) {
        log(LogProvider.INFO, o, null);
    }

    public void info(Object o, Throwable t) {
        log(LogProvider.INFO, o, t);
    }

    public void log(int priority, Object o) {
        log(priority, o, null);
    }

    public void log(int priority, Object o, Throwable t) {
        logProvider.log(context, priority, o, t);
    }

    public void warn(Object o) {
        log(LogProvider.WARN, o, null);
    }

    public void warn(Object o, Throwable t) {
        log(LogProvider.WARN, o, t);
    }

    private void init(String name) {
        context = logProvider.getContext(name);
    }

    /**
     * Perform some custom modifications to the logger.provider for some special cases.
     */
    private static void providerModify() {
        if (((System.getProperty("logger.config"!= null&& (System.getProperty("logger.config").trim().length() 0)) && ((System.getProperty("logger.provider"== null|| (System.getProperty("logger.provider").trim().length() == 0))) {
            System.setProperty("logger.provider""com.opensymphony.provider.log.Log4JProvider");
        }

        // end hack
        // some aliases for common providers so full class name need not be used
        {
            Map providerAliases = new HashMap();
            providerAliases.put("default""com.opensymphony.provider.log.DefaultLogProvider");
            providerAliases.put("null""com.opensymphony.provider.log.NullLogProvider");
            providerAliases.put("full""com.opensymphony.provider.log.FullLogProvider");
            providerAliases.put("log4j""com.opensymphony.provider.log.Log4JProvider");

            if ((System.getProperty("logger.provider"!= null&& providerAliases.containsKey(System.getProperty("logger.provider"))) {
                System.setProperty("logger.provider"(StringproviderAliases.get(System.getProperty("logger.provider")));
            }
        }
    }
}