
===========
Using log4j
===========
	
1) First untar or unzip the distribution file.

2) Assuming you chose to extract the distribution in to the
   PATH_OF_YOUR_CHOICE, untarring the distribution file should create
   a logging-log4j-VERSION directory, where VERSION is the log4j
   version number, under PATH_OF_YOUR_CHOICE. We will refer to the
   directory PATH_OF_YOUR_CHOICE/logging-log4j-VERSION/ as $LOG4J_HOME/.

3) Assuming you are using log4j version 1.2, add
   $LOG4J_HOME/dist/lib/log4j-1.2.jar to your CLASSPATH,
   
4) You can now test your installation by first compiling the following
   simple program.

    import org.apache.log4j.Logger;
    import org.apache.log4j.BasicConfigurator;
    
    public class Hello {
    
      static Logger logger = Logger.getLogger(Hello.class);
    
      public
      static
      void main(String argv[]) {
    	BasicConfigurator.configure();
    	logger.debug("Hello world.");
    	logger.info("What a beatiful day.");
      }
    }


   After compilation, try it out by issuing the command

      java Hello
  
   You should see log statements appearing on the console.

5) Refer to the javadoc documentation and the user manual on how to
   include log statements in your own code.

=========
JAR files
=========

The log4j distribution comes with one jar file: log4j-VERSION.jar
under the LOG4J_HOME/dist/lib/ directory.

This jar file contains all the class files of the log4j project,
except test cases and classes from the "examples" and
"org.apache.log4j.performance" packages.

==================   
log4j dependencies
==================
   
Log4j is based on JDK 1.1 with the following additional requirements:

    ----------------------------
    Package org.apache.log4j.xml 
    ----------------------------

    The DOMConfigurator is based on the DOM Level 1 API. The
    DOMConfigurator.configure(Element) method will work with any
    XML parser that will pass it a DOM tree.
    
    The DOMConfigurator.configure(String filename) method and its variants
    require a JAXP compatible XMLparser, for example the Apache Xerces
    parser. Compiling the DOMConfigurator requires the presence of a
    JAXP parser in the classpath.  

    Log4j is shipped with jaxp.jar and parser.jar files under the
    build/lib/ directory.

    ------------
    SMTPAppender
    ------------

    The SMTPAppender relies on the JavaMail API. It has been tested with
    JavaMail API version 1.2. The JavaMail API requires the
    JavaBeans Activation Framework package. You can download the
    JavaMail API at:

	http://java.sun.com/products/javamail/

    and the JavaBeans Activation Framework at:

	http://java.sun.com/beans/glasgow/jaf.html

    -----------
    JMSAppender
    -----------
  
    The JMSAppender requires the JMS API as well as JNDI. The JMS API
    is usually bundled with the products of the vendors listed under

       http://java.sun.com/products/jms/vendors.html

    -----------------------
    JUnit testing framework
    -----------------------

    Log4j uses the JUnit framework version 3.7 for internal unit
    testing.  If you want to compile the source code in the tests/
    directory, then you will need JUnit. JUnit is available from:

          http://www.junit.org

==============
Building log4j
==============
    
Like most Java applications today, log4j relies on ANT as its build
tool. ANT is available from "http://ant.apache.org/".  ANT
requires a build file called build.xml which is part of this
distribution. Required components from other projects are specified in
the build.properties and example of which is supplied in the
build.properties.sample file.

In case of problems send an e-mail note to
log4j-user@logging.apache.org.  Please do not directly e-mail any
log4j developers. The answer to your question might be useful to other
users. Moreover, there are many knowledgeable users on the log4j-user
mailing lists who can quickly answer your questions.
