Package org.logicalcobwebs.logging

Simple wrapper API around multiple logging APIs.

See:
          Description

Interface Summary
Log A simple logging interface abstracting logging APIs.
 

Class Summary
AllTests Run all tests
Jdk14LoggerTest Test Jdk14Logger
LogFactory Factory for creating Log instances, with discovery and configuration features similar to that employed by standard Java APIs such as JAXP.
LogSource Deprecated. Use LogFactory instead - The default factory implementation performs exactly the same algorithm as this class did
 

Exception Summary
LogConfigurationException An exception that is thrown only if a suitable LogFactory or Log instance cannot be created by the corresponding factory methods.
 

Package org.logicalcobwebs.logging Description

Simple wrapper API around multiple logging APIs.

This code was copy and pasted from version 1.02 of Jakarta's Commons Logging project. It was done to reduce the dependencies that Proxool makes on external libraries (and to reduce potential conflicts).

Overview

This package provides an API for logging in server-based applications that can be used around a variety of different logging implementations, including prebuilt support for the following:

Quick Start Guide

For those impatient to just get on with it, the following example illustrates the typical declaration and use of a logger that is named (by convention) after the calling class:

    import org.logicalcobwebs.logging.Log;
    import org.logicalcobwebs.logging.LogFactory;

    public class Foo {

        Log log = LogFactory.getLog(this.class);

        public void foo() {
            ...
            try {
                if (log.isDebugEnabled()) {
                    log.debug("About to do something to object " + name);
                }
                name.bar();
            } catch (IllegalStateException e) {
                log.error("Something bad happened to " + name, e);
            }
            ...
        }

Unless you configure things differently, all log output will be thrown away. Therefore, you really will want to review the remainder of this page in order to understand how to configure logging for your application.

Configuring the Commons Logging Package

Choosing A LogFactory Implementation

From an application perspective, the first requirement is to retrieve an object reference to the LogFactory instance that will be used to create Log instances for this application. This is normally accomplished by calling the static getFactory() method. This method implements the following discovery algorithm to select the name of the LogFactory implementation class this application wants to use:

If a commons-logging.properties file is found, all of the properties defined there are also used to set configuration attributes on the instantiated LogFactory instance.

Once an implementation class name is selected, the corresponding class is loaded from the current Thread context class loader (if there is one), or from the class loader that loaded the LogFactory class itself otherwise. This allows a copy of commons-logging.jar to be shared in a multiple class loader environment (such as a servlet container), but still allow each web application to provide its own LogFactory implementation, if it so desires. An instance of this class will then be created, and

The Default LogFactory Implementation

The Logging Package APIs include a default LogFactory implementation class ( org.logicalcobwebs.logging.impl.LogFactoryImpl) that is selected if no other implementation class name can be discovered. Its primary purpose is to create (as necessary) and return Log instances in response to calls to the getInstance() method. The default implementation uses the following rules:

If you wish to receive logging output to System.out, but have not installed one of the three supported logging packages, a simple Log implementation named SimpleLog is available. You can select it, based on the above rules, by including a system property definition on the command line that starts your application:

    java \
      -Dorg.apache.commons.logging.Log=org.logicalcobwebs.logging.impl.SimpleLog \
      MyApplication

See the SimpleLog JavaDocs for detailed configuration information for this implementation.

Configuring the Underlying Logging System

The basic principle is that the user is totally responsible for the configuration of the underlying logging system. Commons-logging should not change the existing configuration.

Each individual Log implementation may support its own configuration properties. These will be documented in the class descriptions for the corresponding implementation class.

Finally, some Log implementations (such as the one for Log4J) require an external configuration file for the entire logging environment. This file should be prepared in a manner that is specific to the actual logging technology being used.

Using the Logging Package APIs

Use of the Logging Package APIs, from the perspective of an application component, consists of the following steps:

  1. Acquire a reference to an instance of org.logicalcobwebs.logging.Log, by calling the factory method LogFactory.getInstance(String name). Your application can contain references to multiple loggers that are used for different purposes. A typical scenario for a server application is to have each major component of the server use its own Log instance.
  2. Cause messages to be logged (if the corresponding detail level is enabled) by calling appropriate methods (debug(), info(), warn(), error, and fatal()).

For example, you might use the following technique to initialize and use a Log instance in an application component:

import org.logicalcobwebs.logging.Log;
import org.logicalcobwebs.logging.LogFactory;

public class MyComponent {

  protected Log log = LogFactory.getLog("my.component");

  // Called once at startup time
  public void start() {
    ...
    log.info("MyComponent started");
    ...
  }

  // Called once at shutdown time
  public void stop() {
    ...
    log.info("MyComponent stopped");
    ...
  }

  // Called repeatedly to process a particular argument value
  // which you want logged if debugging is enabled
  public void process(String value) {
    ...
    // Do the string concatenation only if logging is enabled
    if (log.isDebugEnabled())
      log.debug("MyComponent processing " + value);
    ...
  }

}