You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2021/12/23 16:25:41 UTC

[logging-log4j1] 01/01: This commit was manufactured by cvs2svn to create tag 'v1_2_10-recalled'.

This is an automated email from the ASF dual-hosted git repository.

rgoers pushed a commit to annotated tag v1_2_10-recalled
in repository https://gitbox.apache.org/repos/asf/logging-log4j1.git

commit d5aab726d1cf6bd113a7ddd708180918da29b5ef
Author: No Author <de...@apache.org>
AuthorDate: Fri Apr 29 17:39:41 2005 +0000

    This commit was manufactured by cvs2svn to create tag
    'v1_2_10-recalled'.
    
    git-svn-id: https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_10-recalled@311334 13f79535-47bb-0310-9956-ffa450edef68
---
 BRANCHES                                           |   61 +
 INSTALL                                            |   23 +-
 bin/StartLogFactor5.sh                             |   20 +
 bin/StartLogFactor5Console.bat                     |   24 +
 bin/lcp.bat                                        |    2 +
 build.properties.sample                            |   12 +
 build.xml                                          |  151 +-
 build/siteBuild.sh                                 |   34 -
 build/siteBuild.xml                                |   49 -
 docs/FAQ.html                                      | 1646 +++++++++++++-------
 docs/{HISTORY => HISTORY.txt}                      |  165 +-
 docs/critique.html                                 |  294 ----
 docs/deepExtension.html                            |  735 ---------
 docs/images/ceki-72x101.gif                        |  Bin 0 -> 7712 bytes
 docs/images/chainsaw-fullscreen-small.jpg          |  Bin 0 -> 55917 bytes
 docs/images/chainsaw-fullscreen.jpg                |  Bin 0 -> 208947 bytes
 docs/images/coverSmall.png                         |  Bin 0 -> 57875 bytes
 docs/images/mark-72x99.gif                         |  Bin 0 -> 2206 bytes
 docs/images/psmith.jpg                             |  Bin 0 -> 8052 bytes
 docs/images/yshapira.bmp                           |  Bin 0 -> 31514 bytes
 docs/lf5/images/blue_on_white.gif                  |  Bin 0 -> 908 bytes
 docs/lf5/images/console_window.gif                 |  Bin 0 -> 56097 bytes
 docs/lf5/images/lf5.gif                            |  Bin 0 -> 35277 bytes
 docs/lf5/images/lf5_about.gif                      |  Bin 0 -> 9451 bytes
 docs/lf5/images/lf5_category_explorer.gif          |  Bin 0 -> 62477 bytes
 docs/lf5/images/lf5_collapseall.gif                |  Bin 0 -> 62701 bytes
 docs/lf5/images/lf5_colorchooser.gif               |  Bin 0 -> 62676 bytes
 docs/lf5/images/lf5_compactview.gif                |  Bin 0 -> 53415 bytes
 docs/lf5/images/lf5_configure.gif                  |  Bin 0 -> 62471 bytes
 docs/lf5/images/lf5_deselectall.gif                |  Bin 0 -> 65637 bytes
 docs/lf5/images/lf5_detailedview.gif               |  Bin 0 -> 57900 bytes
 docs/lf5/images/lf5_expandall.gif                  |  Bin 0 -> 64917 bytes
 docs/lf5/images/lf5_loglevels.gif                  |  Bin 0 -> 62411 bytes
 docs/lf5/images/lf5_logo.gif                       |  Bin 0 -> 2398 bytes
 docs/lf5/images/lf5_logo_small.gif                 |  Bin 0 -> 970 bytes
 docs/lf5/images/lf5_logtable.gif                   |  Bin 0 -> 61525 bytes
 docs/lf5/images/lf5_ndc_filtering.gif              |  Bin 0 -> 42345 bytes
 docs/lf5/images/lf5_openfile.gif                   |  Bin 0 -> 51140 bytes
 docs/lf5/images/lf5_openurl.gif                    |  Bin 0 -> 61066 bytes
 docs/lf5/images/lf5_properties.gif                 |  Bin 0 -> 52169 bytes
 docs/lf5/images/lf5_recorddetail.gif               |  Bin 0 -> 55142 bytes
 docs/lf5/images/lf5_remove_categories.gif          |  Bin 0 -> 66759 bytes
 docs/lf5/images/lf5_search.gif                     |  Bin 0 -> 59820 bytes
 docs/lf5/images/lf5_selectall.gif                  |  Bin 0 -> 65440 bytes
 docs/lf5/images/lf5_small.gif                      |  Bin 0 -> 19171 bytes
 docs/lf5/images/lf5_standardview.gif               |  Bin 0 -> 54007 bytes
 docs/lf5/images/lf5_view.gif                       |  Bin 0 -> 63526 bytes
 docs/lf5/images/small_right_arrow.gif              |  Bin 0 -> 76 bytes
 docs/manual.html                                   |  189 +--
 docs/overview.html                                 |    1 +
 docs/praise.html                                   |  266 ----
 examples/MyPatternLayout.java                      |    8 +-
 examples/NumberCruncherServer.java                 |   17 +-
 examples/SortAlgo.java                             |   14 +-
 examples/Trivial.java                              |   14 +-
 .../InitUsingDefaultConfigurator.java              |  126 ++
 .../InitUsingLog4JProperties.java                  |  112 ++
 .../lf5/InitUsingLog4JProperties/log4j.properties  |   17 +
 .../InitUsingMultipleAppenders.java                |  137 ++
 .../InitUsingMultipleAppenders/example.properties  |   34 +
 .../InitUsingPropertiesFile.java                   |  116 ++
 .../lf5/InitUsingPropertiesFile/example.properties |   17 +
 .../InitUsingXMLPropertiesFile.java                |  110 ++
 .../lf5/InitUsingXMLPropertiesFile/example.xml     |   15 +
 examples/lf5/OpeningLogFiles/sample.log            |  184 +++
 .../CustomizedLogLevels.java                       |  101 ++
 .../UsingLogMonitorAdapter.java                    |   86 +
 .../UsingSocketAppenders/UsingSocketAppenders.java |  132 ++
 .../UsingSocketAppenders/socketclient.properties   |   18 +
 .../UsingSocketAppenders/socketserver.properties   |   19 +
 examples/lf5/index.html                            |   11 +
 examples/mycat.bad                                 |   14 +-
 examples/mycat.good                                |   16 +-
 examples/subclass/MyLogger.java                    |   10 -
 examples/subclass/MyLoggerTest.java                |    2 +-
 slf4j.xml                                          |   82 +
 src/filtered-java/org/slf4j/LoggerFactory.java     |   84 +
 .../org/slf4j/LoggerFactoryAdapter.java            |   60 +
 src/filtered-java/org/slf4j/ULogger.java           |  104 ++
 src/filtered-java/org/slf4j/impl/JDK14Logger.java  |  243 +++
 .../org/slf4j/impl/JDK14LoggerFA.java              |   74 +
 .../org/slf4j/impl/MessageFormatter.java           |  143 ++
 src/filtered-java/org/slf4j/impl/NOPLogger.java    |  200 +++
 src/filtered-java/org/slf4j/impl/NOPLoggerFA.java  |   58 +
 src/filtered-java/org/slf4j/impl/SimpleLogger.java |  290 ++++
 .../org/slf4j/impl/SimpleLoggerFA.java             |   83 +
 src/java/org/apache/log4j/Appender.java            |    2 +-
 src/java/org/apache/log4j/AppenderSkeleton.java    |   31 +-
 src/java/org/apache/log4j/AsyncAppender.java       |  109 +-
 src/java/org/apache/log4j/Category.java            |  376 ++++-
 src/java/org/apache/log4j/ConsoleAppender.java     |   38 +-
 .../org/apache/log4j/DailyRollingFileAppender.java |  112 +-
 src/java/org/apache/log4j/FileAppender.java        |   35 +-
 src/java/org/apache/log4j/HTMLLayout.java          |   14 +-
 src/java/org/apache/log4j/LogManager.java          |  140 +-
 src/java/org/apache/log4j/Logger.java              |   30 +-
 src/java/org/apache/log4j/MDC.java                 |   21 +-
 src/java/org/apache/log4j/NDC.java                 |   17 +-
 src/java/org/apache/log4j/Priority.java            |   47 +-
 .../org/apache/log4j/PropertyConfigurator.java     |   33 +-
 src/java/org/apache/log4j/SimpleLayout.java        |    2 +-
 src/java/org/apache/log4j/TTCCLayout.java          |    8 +-
 src/java/org/apache/log4j/WriterAppender.java      |   27 +-
 .../org/apache/log4j/chainsaw/ControlPanel.java    |    8 +-
 .../org/apache/log4j/chainsaw/DetailPanel.java     |    8 +-
 .../org/apache/log4j/chainsaw/EventDetails.java    |    4 +-
 src/java/org/apache/log4j/chainsaw/ExitAction.java |    4 +-
 .../org/apache/log4j/chainsaw/LoadXMLAction.java   |    5 +-
 .../org/apache/log4j/chainsaw/LoggingReceiver.java |   22 +-
 src/java/org/apache/log4j/chainsaw/Main.java       |    6 +-
 .../org/apache/log4j/chainsaw/MyTableModel.java    |    5 +-
 .../org/apache/log4j/chainsaw/XMLFileHandler.java  |   59 +-
 .../org/apache/log4j/config/PropertyGetter.java    |    2 +-
 .../org/apache/log4j/config/PropertyPrinter.java   |   20 +-
 .../org/apache/log4j/config/PropertySetter.java    |    9 +-
 .../log4j/config/PropertySetterException.java      |    9 +-
 .../log4j/helpers/AppenderAttachableImpl.java      |    4 +-
 src/java/org/apache/log4j/helpers/BoundedFIFO.java |    4 +-
 src/java/org/apache/log4j/helpers/Loader.java      |  134 +-
 .../org/apache/log4j/helpers/NullEnumeration.java  |    4 +-
 .../org/apache/log4j/helpers/OptionConverter.java  |    8 +-
 .../org/apache/log4j/helpers/PatternParser.java    |    4 +-
 .../org/apache/log4j/helpers/SyslogWriter.java     |    4 +-
 src/java/org/apache/log4j/helpers/Transform.java   |   59 +-
 src/java/org/apache/log4j/jdbc/JDBCAppender.java   |   23 +-
 src/java/org/apache/log4j/jmx/Agent.java           |    4 +-
 .../apache/log4j/jmx/HierarchyDynamicMBean.java    |    2 +-
 .../org/apache/log4j/jmx/LoggerDynamicMBean.java   |    8 +-
 src/java/org/apache/log4j/jmx/T.java               |   22 -
 src/java/org/apache/log4j/lf5/LF5Appender.java     |    6 +-
 src/java/org/apache/log4j/lf5/LogRecord.java       |    2 +-
 .../log4j/lf5/config/defaultconfig.properties      |   16 +
 .../apache/log4j/lf5/util/ProductProperties.java   |  248 ---
 .../apache/log4j/lf5/viewer/LogBrokerMonitor.java  |   29 +-
 .../log4j/lf5/viewer/LogFactor5AboutDialog.java    |  136 --
 .../categoryexplorer/CategoryNodeEditor.java       |    6 +-
 .../lf5/viewer/configure/ConfigurationManager.java |    3 +-
 .../log4j/lf5/viewer/configure/MRUFileManager.java |   10 +-
 .../apache/log4j/lf5/viewer/images/lf5_about.gif   |  Bin 23106 -> 0 bytes
 .../log4j/lf5/viewer/images/lf5_small_icon.png     |  Bin 42566 -> 0 bytes
 src/java/org/apache/log4j/net/JMSAppender.java     |  261 +++-
 src/java/org/apache/log4j/net/JMSSink.java         |  125 +-
 src/java/org/apache/log4j/net/SMTPAppender.java    |    4 +-
 .../org/apache/log4j/net/SimpleSocketServer.java   |   55 +-
 src/java/org/apache/log4j/net/SocketAppender.java  |  107 +-
 src/java/org/apache/log4j/net/SocketNode.java      |   16 +-
 src/java/org/apache/log4j/net/SocketServer.java    |    6 +-
 src/java/org/apache/log4j/net/SyslogAppender.java  |    6 +-
 src/java/org/apache/log4j/net/test/Loop.java       |    6 +-
 src/java/org/apache/log4j/net/test/SMTPMin.java    |    6 +-
 src/java/org/apache/log4j/net/test/SocketMin.java  |   10 +-
 src/java/org/apache/log4j/net/test/SyslogMin.java  |    6 +-
 .../org/apache/log4j/nt/NTEventLogAppender.java    |    4 +-
 src/java/org/apache/log4j/nt/test/NTMin.java       |    6 +-
 src/java/org/apache/log4j/or/DefaultRenderer.java  |    2 +-
 src/java/org/apache/log4j/or/ObjectRenderer.java   |    2 +-
 src/java/org/apache/log4j/or/RendererMap.java      |    5 +-
 .../org/apache/log4j/or/ThreadGroupRenderer.java   |    2 +-
 .../apache/log4j/performance/ConcatVsArray.java    |   66 -
 .../org/apache/log4j/performance/ListVsVector.java |    2 +-
 src/java/org/apache/log4j/performance/Logging.java |  287 ----
 .../org/apache/log4j/performance/NOPWriter.java    |   53 +-
 .../org/apache/log4j/performance/NewVsSetLen.java  |    4 +-
 .../org/apache/log4j/performance/NotLogging.java   |  168 --
 .../org/apache/log4j/performance/NullAppender.java |   13 +-
 .../org/apache/log4j/performance/SystemTime.java   |    2 +-
 src/java/org/apache/log4j/performance/logging      |   50 +
 src/java/org/apache/log4j/performance/package.html |   20 +-
 .../apache/log4j/performance/xml/logging201.xml    |   36 +-
 .../apache/log4j/performance/xml/logging202.xml    |   36 +-
 .../apache/log4j/performance/xml/logging203.xml    |   36 +-
 .../apache/log4j/performance/xml/logging204.xml    |   38 +-
 .../apache/log4j/performance/xml/logging205.xml    |   38 +-
 .../apache/log4j/performance/xml/logging206.xml    |   38 +-
 .../apache/log4j/performance/xml/logging207.xml    |   34 +-
 .../apache/log4j/performance/xml/logging220.xml    |   23 +
 .../apache/log4j/performance/xml/logging221.xml    |   25 +
 .../apache/log4j/performance/xml/logging222.xml    |   24 +
 .../apache/log4j/performance/xml/logging223.xml    |   25 +
 .../apache/log4j/performance/xml/logging224.xml    |   25 +
 .../apache/log4j/performance/xml/logging225.xml    |   25 +
 .../apache/log4j/performance/xml/logging226.xml    |   25 +
 .../apache/log4j/performance/xml/logging227.xml    |   25 +
 src/java/org/apache/log4j/spi/Configurator.java    |   24 +-
 src/java/org/apache/log4j/spi/Filter.java          |    2 +-
 .../org/apache/log4j/spi/LoggerRepository.java     |    7 +-
 src/java/org/apache/log4j/spi/LoggingEvent.java    |  124 +-
 src/java/org/apache/log4j/spi/RootCategory.java    |   11 +-
 src/java/org/apache/log4j/spi/RootLogger.java      |   69 +
 .../org/apache/log4j/spi/ThrowableInformation.java |   82 +-
 .../org/apache/log4j/test/AsyncAppenderTest.java   |   16 +-
 src/java/org/apache/log4j/test/Base64.java         |  105 --
 .../org/apache/log4j/test/CategoryWrapper.java     |    6 +-
 .../log4j/test/ConfigurationFileParsing.java       |    9 +-
 src/java/org/apache/log4j/test/DRFATest.java       |    4 +-
 src/java/org/apache/log4j/test/DefaultInit.java    |    4 +-
 src/java/org/apache/log4j/test/DelayedLoop.java    |    4 +-
 src/java/org/apache/log4j/test/FQCNTest.java       |    4 +-
 src/java/org/apache/log4j/test/Finalize.java       |   14 +-
 src/java/org/apache/log4j/test/Hello.java          |    4 +-
 src/java/org/apache/log4j/test/L7D.java            |   79 -
 src/java/org/apache/log4j/test/MDCStress.java      |    4 +-
 .../org/apache/log4j/test/MultipleAppenders.java   |    4 +-
 src/java/org/apache/log4j/test/PatternTest.java    |    9 +-
 src/java/org/apache/log4j/test/ROFile.java         |    4 +-
 src/java/org/apache/log4j/test/Shallow.java        |   22 +-
 .../org/apache/log4j/test/ShortSocketServer.java   |    7 +-
 .../org/apache/log4j/test/StressAsyncAppender.java |    4 +-
 src/java/org/apache/log4j/test/StressNDC.java      |  175 ---
 .../org/apache/log4j/test/SysoutConfigurator.java  |    4 +-
 .../log4j/varia/ExternallyRolledFileAppender.java  |    7 +-
 .../apache/log4j/varia/FallbackErrorHandler.java   |   29 +-
 .../org/apache/log4j/varia/LevelMatchFilter.java   |    4 +-
 .../org/apache/log4j/varia/LevelRangeFilter.java   |  136 ++
 src/java/org/apache/log4j/varia/NullAppender.java  |   65 +
 src/java/org/apache/log4j/varia/Roller.java        |    4 +-
 src/java/org/apache/log4j/varia/test/Loop.java     |    4 +-
 src/java/org/apache/log4j/xml/DOMConfigurator.java |   51 +-
 .../org/apache/log4j/xml/Log4jEntityResolver.java  |   44 +
 src/java/org/apache/log4j/xml/XMLLayout.java       |  180 ++-
 .../org/apache/log4j/xml/examples/XMLSample.java   |    6 +-
 src/java/org/apache/log4j/xml/log4j.dtd            |   19 +-
 src/java/org/apache/log4j/xml/test/DOMTest.java    |   15 +-
 src/java/org/slf4j/LoggerFactory.java              |   84 +
 src/java/org/slf4j/LoggerFactoryAdapter.java       |   60 +
 src/java/org/slf4j/ULogger.java                    |  104 ++
 src/java/org/slf4j/impl/Log4jLoggerFA.java         |   58 +
 src/java/org/slf4j/impl/MessageFormatter.java      |  143 ++
 src/java/org/slf4j/impl/NOPLogger.java             |  200 +++
 src/java/org/slf4j/impl/NOPLoggerFA.java           |   58 +
 src/java/org/slf4j/impl/SimpleLogger.java          |  290 ++++
 src/java/org/slf4j/impl/SimpleLoggerFA.java        |   83 +
 src/xdocs/contributors.xml                         |   12 +-
 src/xdocs/documentation.xml                        |   74 +-
 src/xdocs/download.xml                             |   81 +-
 src/xdocs/index.xml                                |   15 +-
 src/xdocs/lf5/configuration.xml                    |  114 ++
 src/xdocs/lf5/examples.xml                         |  564 +++++++
 src/xdocs/lf5/faq.xml                              |   45 +
 src/xdocs/lf5/features.xml                         |  249 +++
 src/xdocs/lf5/overview.xml                         |   76 +
 src/xdocs/lf5/readingfiles.xml                     |   99 ++
 src/xdocs/lf5/trouble.xml                          |  307 ++++
 src/xdocs/plan.xml                                 |   19 +-
 src/xdocs/stylesheets/lf5.xml                      |   27 +
 src/xdocs/stylesheets/project.xml                  |    2 +
 tests/build.xml                                    |   77 +-
 tests/input/defaultInit3.properties                |    7 +
 tests/input/socketServer5.properties               |    8 +
 tests/input/socketServer6.properties               |    8 +
 tests/input/socketServer7.properties               |    8 +
 tests/input/socketServer8.properties               |    8 +
 tests/input/xml/defaultInit.xml                    |   17 +
 tests/input/xml/fallback1.xml                      |   35 +
 .../org/apache/log4j/AsyncAppenderTestCase.java    |   52 +-
 .../src/java/org/apache/log4j/LoggerTestCase.java  |   14 +-
 .../src/java/org/apache/log4j/MyPatternLayout.java |    8 +-
 .../src/java/org/apache/log4j/StressCategory.java  |   14 +-
 .../src/java/org/apache/log4j/VectorAppender.java  |   30 +-
 .../org/apache/log4j/defaultInit/TestCase1.java    |   45 +
 .../org/apache/log4j/defaultInit/TestCase2.java    |   49 +
 .../org/apache/log4j/defaultInit/TestCase3.java    |   49 +
 .../org/apache/log4j/defaultInit/TestCase4.java    |   50 +
 .../apache/log4j/helpers/BoundedFIFOTestCase.java  |    8 +-
 .../apache/log4j/helpers/CyclicBufferTestCase.java |    8 +-
 .../log4j/helpers/PatternParserTestCase.java       |  121 ++
 .../org/apache/log4j/net/ShortSocketServer.java    |   18 +-
 .../org/apache/log4j/net/SocketServerTestCase.java |  158 +-
 .../apache/log4j/varia/ErrorHandlerTestCase.java   |  109 ++
 .../org/apache/log4j/xml/XMLLayoutTestCase.java    |   30 +-
 tests/witness/PatternParser_mdc                    |   12 +
 tests/witness/socketServer.5                       |   35 +
 tests/witness/socketServer.6                       |   35 +
 tests/witness/socketServer.7                       |   35 +
 tests/witness/socketServer.8                       |   35 +
 tests/witness/xmlLayout.1                          |   30 +-
 tests/witness/xmlLayout.2                          |   30 +-
 tests/witness/xmlLayout.3                          |    5 +
 tests/witness/xmlLayout.null                       |   26 +
 279 files changed, 10515 insertions(+), 4897 deletions(-)

diff --git a/BRANCHES b/BRANCHES
new file mode 100644
index 0000000..da0e39d
--- /dev/null
+++ b/BRANCHES
@@ -0,0 +1,61 @@
+
+Given that log4j 1.3 is not likely to be released before a few months,
+I have created a branch called v1_2-branch in our CVS repository. The
+branch was created by issuing the following command:
+
+cvs -d :ext:ceki@cvs.apache.org:/home/cvs rtag -b -r v1_2final v1_2-branch jakarta-log4j
+
+Using the 1.2 branch, we can incorporate patches to log4j version 1.2
+while version 1.3 continues to be developed on the main trunk. For
+example, we can officially release LogFactor5 (including
+documentation) already in log4j 1.2.1.
+
+The command to access the v1_2-branch is:
+
+cvs -d XYZ checkout -r v1_2-branch jakarta-log4j
+
+where XYZ is the remote repository name, that is
+":ext:ceki@cvs.apache.org:/home/cvs" for me.
+
+Alternatively, you can issue following update command from within any
+existing work copy.
+
+  cvs update -r v1_2-branch
+
+Working with branches is not completely trivial and requires a little
+coordination between committers, in particular in relation with branch
+merge operations. In order to avoid multiple merge conflicts, each
+time we merge from the 1.2 branch to the main trunk, we should tag the
+merged version on the 1.2 branch. Subsequent merges should use the tag
+referring to the latest merged version of the branch. Also do not
+forget to publicly announce a merge operation.
+
+I am suggesting that (1.2 -> trunk) merge operations be done in a
+concerted manner. Before doing a merge you tell everyone that you are
+going to do a merge, you execute the merge operation, and then tag the
+merged version on the 1.2 branch, for example v_1_2_-merged-bug666
+
+The *next* merge operation would be performed as
+
+  cvs update -j v_1_2_-merged-bug666 -j v1_2-branch
+
+from within a working copy of the *trunk*. This merge operation would
+obviously also need to be tagged. According to the CVS manual, this
+procedure eliminates the side effects of merging already merged
+changes.
+
+Bug fixes should and documentation improvements, should be made to the
+1.2 branch, not the trunk. I'll take care of merging the changes to
+the main trunk.
+
+If this sounds like mambo jumbo, I urge you to consult the CVS
+documentation and experiment with branches before hitting the log4j
+repository. Branches are not that complicated really although they
+require slightly more discipline on the part of committers. Do not
+hesitate to shout if you need help.
+
+If you have a better alternative for working with branches please let
+us know.
+
+--
+Ceki
\ No newline at end of file
diff --git a/INSTALL b/INSTALL
index cf4fd20..6463df2 100644
--- a/INSTALL
+++ b/INSTALL
@@ -11,7 +11,8 @@ Using log4j
    version number, under PATH_OF_YOUR_CHOICE. We will refer to the
    directory PATH_OF_YOUR_CHOICE/jakarta-log4j-VERSION/ as $LOG4J_HOME/.
 
-3) Add $LOG4J_HOME/dist/lib/log4j-1.2.jar to your CLASSPATH.
+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.
@@ -47,7 +48,7 @@ JAR files
 =========
 
 The log4j distribution comes with one jar file: log4j-VERSION.jar
-under the $LOG4J_HOME/dist/lib/ directory.
+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
@@ -57,8 +58,7 @@ except test cases and classes from the "examples" and
 log4j dependencies
 ==================
    
-The log4j distribution comes with pre-compiled classes. Log4j is based
-on JDK 1.1 with the following additional requirements:
+Log4j is based on JDK 1.1 with the following additional requirements:
 
     ----------------------------
     Package org.apache.log4j.xml 
@@ -82,7 +82,8 @@ on JDK 1.1 with the following additional requirements:
 
     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:
+    JavaBeans Activation Framework package. You can download the
+    JavaMail API at:
 
 	http://java.sun.com/products/javamail/
 
@@ -104,8 +105,8 @@ on JDK 1.1 with the following additional requirements:
     -----------------------
 
     Log4j uses the JUnit framework version 3.7 for internal unit
-    testing.  If you want to compile all log4j source code, then you
-    will need JUnit. JUnit is available from:
+    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
 
@@ -121,7 +122,7 @@ 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@jakarta.apache.org.  Please do not directly e-mail any of
-the 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.
+log4j-user@jakarta.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.
diff --git a/bin/StartLogFactor5.sh b/bin/StartLogFactor5.sh
new file mode 100644
index 0000000..80e296c
--- /dev/null
+++ b/bin/StartLogFactor5.sh
@@ -0,0 +1,20 @@
+#! /bin/sh
+
+if [ -z "$LOG4J_HOME" ] ; then
+    LOG4J_HOME=..
+fi
+
+JAVACMD=$JAVA_HOME/bin/java
+
+# add in the dependency .jar files
+DIRLIBS=${LOG4J_HOME}/dist/lib/*.jar
+for i in ${DIRLIBS}
+do
+
+    if [ "$i" != "${DIRLIBS}" ] ; then
+        LOCALCLASSPATH=$LOCALCLASSPATH:"$i"
+    fi
+
+done
+
+$JAVACMD -classpath "$LOCALCLASSPATH" org.apache.log4j.lf5.StartLogFactor5
\ No newline at end of file
diff --git a/bin/StartLogFactor5Console.bat b/bin/StartLogFactor5Console.bat
new file mode 100644
index 0000000..42cb1ea
--- /dev/null
+++ b/bin/StartLogFactor5Console.bat
@@ -0,0 +1,24 @@
+@echo off
+
+if not "%LOG4J_HOME%" == "" goto start
+
+SET LOG4J_HOME=..
+
+:start
+
+java -fullversion
+set LOCALCLASSPATH=
+for %%i in ("%LOG4J_HOME%\dist\lib\*.jar") do call "%LOG4J_HOME%\bin\lcp.bat" "%%i"
+
+echo using classpath %LOCALCLASSPATH%
+
+java -classpath %LOCALCLASSPATH% org.apache.log4j.lf5.StartLogFactor5
+
+exit
+
+:usage
+echo usage: lf5 (target)
+
+:eof
+pause
+
diff --git a/bin/lcp.bat b/bin/lcp.bat
new file mode 100644
index 0000000..4f26713
--- /dev/null
+++ b/bin/lcp.bat
@@ -0,0 +1,2 @@
+set LOCALCLASSPATH=%1;%LOCALCLASSPATH%
+
diff --git a/build.properties.sample b/build.properties.sample
index 300f021..c5555f6 100644
--- a/build.properties.sample
+++ b/build.properties.sample
@@ -19,4 +19,16 @@ jmx.jar=/java/jmx/lib/jmxri.jar
 jmx-extra.jar=/java/jmx/lib/jmxtools.jar
 
 
+# jakarta-site2 module is used to transform xml files to html using
+# Anakia. You do not need to worry about this property unless you
+# intend to build the log4j web site yourself.
+jakarta-site2=../jakarta-site2
 
+# Required to run Checkstyle. Available from http://checkstyle.sf.net
+checkstyle.jar=/java/checkstyle-2.2/checkstyle-all-2.2.jar
+
+
+
+# The templates for the creation of the web-pages are inherited 
+# from the parent project.
+logging-site=../logging-site
\ No newline at end of file
diff --git a/build.xml b/build.xml
index 9bcb740..1a1a443 100644
--- a/build.xml
+++ b/build.xml
@@ -4,7 +4,7 @@
 
 
 <!-- ================================================================= -->
-<!-- NOTE: all directories are relative to jakarta-log4j/              -->
+<!-- NOTE: all directories are relative to logging-log4j/              -->
 <!-- the parent of build/                                              -->
 <!-- ================================================================= -->
 <project name="log4j" default="usage" basedir="." >
@@ -17,11 +17,14 @@
   <!-- prefixed with "env". -->
   <property environment="env"/>
 
-  <property name="version" value="1.2"/>
+  <property name="version" value="1.2.10"/>
 
   <!-- The base directory relative to which most targets are built -->
   <property name="base" value="."/>
 
+
+  <property name="deprecation" value="on"/>
+
   <!-- The directory where source files are stored. -->
   <property name="java.source.dir" value="src/java/"/>
 
@@ -35,11 +38,14 @@
   <!-- Destination for generated jar files -->
   <property name="jar.dest" value="dist/lib"/>
 
+  <!-- The jar file that the jar task will generate -->
   <property name="jar.filename" value="log4j-${version}.jar"/>
 
+  <!-- Destination for documentation files -->
+  <property name="docs.dest" value="./docs"/>
+  <!-- Source directory for xml docs -->
+  <property name="xdocs.src" value="./src/xdocs"/>
 
-  <!-- Destination for documentation files generated or not -->
-  <property name="docs" value="docs"/>
 
   <!-- Destination for javadoc generated files -->
   <property name="javadoc.dest" value="docs/api"/>
@@ -75,6 +81,12 @@
     <pathelement location="${jmx-extra.jar}"/>
   </path>
 
+  <!-- Construct classpath for building the html pages-->
+  <path id="site.classpath">
+    <fileset dir="${logging-site}/lib">
+      <include name="*.jar"/>
+    </fileset>
+  </path>
 
   <!-- ================================================================= -->
   <!-- Default target                                                    -->
@@ -149,6 +161,19 @@
     <echo message="JAVAMAIL is present."/>
   </target>
 
+  <target name="slf4jCheck">
+    <available file="${java.source.dir}/org/slf4j/ULogger.java"
+               property="slf4j-present"/>
+    
+    <fail unless="slf4j-present">
+       Missing src/java/org/slf4j/*.java source files.
+  	  		
+       Just run the refresh-slf4j target with the command:
+
+       ant refresh-slf4j		
+    </fail>
+  </target>
+
   <!-- ================================================================= -->
   <!-- Initialize variables                                              -->
   <!-- NOTE: all directories are relative to jakarta-log4j/              -->
@@ -157,14 +182,23 @@
     <tstamp />
   </target>
 
+
+  <target name="refresh-slf4j">
+    <echo>Fecthing required source files from SLF4J.ORG</echo> 
+    <!-- copy required SLF4J files into log4j -->
+    <ant antfile="slf4j.xml" target="refresh-slf4j"/>
+  </target>
+
   <target name="build" depends="init, build.core, build.examples, build.xml,
                                 build.javamail, build.jms, build.jmx"/>
 
-  <target name="build.core" depends="init">
+  <target name="build.core" depends="init, slf4jCheck">
     <mkdir dir="${javac.dest}" />
     <javac srcdir="${java.source.dir}"
 	   destdir="${javac.dest}"
-	   includes="${stem}/**/*.java, ${stem}/xml/XMLLayout.java,"
+	   includes="org/slf4j/**/*.java,
+                     ${stem}/**/*.java, 
+                     ${stem}/xml/XMLLayout.java"
 	   excludes="misc/*, **/UnitTest*.java,
                     **/StressCategory.java,
                     **/doc-files/*,
@@ -179,6 +213,13 @@
       <classpath refid="compile.classpath"/>
     </javac>
     
+    <copy todir="${javac.dest}">
+      <fileset dir="${java.source.dir}"
+	includes="${stem}/lf5/**/*.properties"/>    
+      <fileset dir="${java.source.dir}"
+	includes="${stem}/lf5/viewer/images/*"/>
+   </copy>
+
   </target>
 
   <target name="build.examples" depends="build.core">
@@ -193,6 +234,12 @@
     <rmic base="${javac.dest}"
       classname="examples.NumberCruncherServer"
       />
+
+    <copy todir="${javac.dest}">
+      <fileset dir="." includes="examples/lf5/**/*.properties"/>
+      <fileset dir="." includes="examples/lf5/**/*.xml"/>
+   </copy>
+
   </target>
 
  <target name="build.xml" depends="init, jaxp" if="jaxp-present">
@@ -223,7 +270,7 @@
     <javac deprecation="${deprecation}"
            srcdir="${java.source.dir}"
 	   destdir="${javac.dest}"
-	   includes="${stem}/net/JMS*.java">
+           includes="${stem}/net/JMS*.java, ${stem}/or/jms/*.java">
       <classpath refid="compile.classpath"/>
     </javac>
   </target>
@@ -251,7 +298,7 @@
   <!-- ================================================================= -->
   <target name="checkstyle" depends="init">
     <taskdef resource="checkstyletask.properties"
-             classpath="build/lib/checkstyle-all-2.1.jar"/>
+             classpath="${checkstyle.jar}"/>
 
     <!-- by default checkstyle supports the Sun coding standard. -->
     <checkstyle lcurlyMethod="nlow"
@@ -270,7 +317,7 @@
   <target name="chainsaw" depends="build">
     <!-- Need to fork to avoid problems -->
     <java classname="org.apache.log4j.chainsaw.Main" fork="yes"
-          classpath="${javac.dest}">
+          classpath="${javac.dest};${ant.home}/lib/crimson.jar">
     </java>
   </target>
 
@@ -300,7 +347,9 @@
     </delete>
 
     <jar jarfile="${jar.dest}/${jar.filename}" basedir="${javac.dest}"
-      includes="${stem}/*.class, ${stem}/xml/log4j.dtd,
+      includes="org/slf4j/**/*.class,
+                ${stem}/*.class, 
+                ${stem}/xml/log4j.dtd,
                 ${stem}/config/*.class,
 	        ${stem}/helpers/*.class,
 		${stem}/spi/*.class,
@@ -308,6 +357,9 @@
 		${stem}/jdbc/*.class,
 		${stem}/varia/*.class,
 		${stem}/chainsaw/*.class,
+		${stem}/lf5/**/*.class,
+		${stem}/lf5/**/*.properties,
+		${stem}/lf5/**/*.gif,
 		${stem}/nt/*.class,
 		${stem}/xml/*.class,
 		${stem}/jmx/*.class,
@@ -334,6 +386,7 @@
 			 org.apache.log4j.config,
                          org.apache.log4j.helpers,
 		         org.apache.log4j.jmx,
+		         org.apache.log4j.lf5,
 		         org.apache.log4j.net,
 			 org.apache.log4j.nt,
 		         org.apache.log4j.or,
@@ -350,23 +403,63 @@
 	   protected="true"
 	   author="true"
 	   use="true"
-	   overview="${docs}/overview.html"
+	   overview="${docs.dest}/overview.html"
 	   doctitle="log4j version ${version}&lt;br&gt;API Specification"
 	   windowtitle="Log4j Version ${version}"
            header="&lt;b&gt;Log4j ${version}&lt;/b&gt;"
-	   bottom="Copyright 2000-2002 Apache Software Foundation.">
+	   bottom="Copyright 2000-2005 Apache Software Foundation.">
 
-      <link offline="true"
-	     href="http://java.sun.com/products/jdk/1.2/docs/api"
-	     packageListLoc="${packaging.dir}"/>
+      <link href="http://java.sun.com/products/jdk/1.3/docs/api/"/>
+      <link href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/"/>
+      <link href="http://www.slf4j.org/api/"/>
       <classpath refid="compile.classpath"/>
     </javadoc>
   </target>
 
+  <!-- ============================================== -->
+  <!-- Build the site files using Anakia              -->
+  <!-- ============================================== -->  
+  <!-- ============================================== -->
+  <!-- Build the site files using Anakia              -->
+  <!-- ============================================== -->
+  <target name="prepareSite">
+    <available classname="org.apache.velocity.anakia.AnakiaTask"
+      property="AnakiaTask.present">
+      <classpath refid="site.classpath"/>
+    </available>
+  </target>
+
+  <target name="checkSite" depends="prepareSite" unless="AnakiaTask.present">
+    <echo>
+      AnakiaTask is not present! Please check to make sure that
+      velocity.jar is in your classpath.
+    </echo>
+  </target>
+
+  <target name="site" depends="checkSite" if="AnakiaTask.present">
+    <taskdef name="anakia" classname="org.apache.velocity.anakia.AnakiaTask">
+      <classpath refid="site.classpath"/>
+    </taskdef>
+ 
+    <mkdir dir="${docs.dest}/css"/>  
+    <copy file="${logging-site}/docs/css/site.css" tofile="${docs.dest}/css/site.css"/>
+    
+    <anakia basedir="${xdocs.src}" destdir="${docs.dest}/"
+      extension=".html"
+      style="site.vsl"
+      projectFile="stylesheets/project.xml"
+      excludes="**/stylesheets/**, empty.xml, lf5/**"
+      includes="**/*.xml"
+      lastModifiedCheck="true"
+      templatePath="${logging-site}/src/xdocs/stylesheets">
+    </anakia>
+
+  </target>
+
  <!-- ================================================================= -->
  <!-- Build a complete distribution. Results go to ${dist.images}       -->
  <!-- ================================================================= -->
-  <target name="dist" depends="init, clean, javadoc, jar">
+  <target name="dist" depends="init, clean, javadoc, jar, site">
 
     <delete verbose="true">
       <fileset dir=".">
@@ -403,16 +496,17 @@
     </delete>
 
     <mkdir  dir="${dist.images}" />
+    
+    <mkdir  dir="${dist.tmp}/logging-log4j-${version}" />
 
-    <mkdir  dir="${dist.tmp}/jakarta-log4j-${version}" />
-
-    <copy todir="${dist.tmp}/jakarta-log4j-${version}">
+    <copy todir="${dist.tmp}/logging-log4j-${version}">
        <fileset dir="${base}"
                 includes="src/java/**,
 			  docs/**,
 	                  examples/**,
 			  build/*,
 	                  build.xml,
+	                  build.properties.sample,
                           manifest.mf,
 			  INSTALL,
 			  LICENSE.txt,
@@ -423,28 +517,29 @@
 		          **/*.bak, **/goEnv.bat,
 		          **/Makefile, **/goEnv.bat,
 	                  docs/pub-support/*,
+	                  dist/classes/org/**,
 	                  src/java/org/apache/log4j/test/**/*,	
 			  **/.#*"/>
     </copy>
 
 
-    <fixcrlf srcdir="${dist.tmp}/jakarta-log4j-${version}"
+    <fixcrlf srcdir="${dist.tmp}/logging-log4j-${version}"
              includes="build.sh" cr="remove"/>
-    <fixcrlf srcdir="${dist.tmp}/jakarta-log4j-${version}"
+    <fixcrlf srcdir="${dist.tmp}/logging-log4j-${version}"
              includes="build.bat" cr="add"/>
-    <chmod   dir="${dist.tmp}/jakarta-log4j-${version}"
+    <chmod   dir="${dist.tmp}/logging-log4j-${version}"
              includes="build.sh" perm="+x"/>
 
-    <tar tarfile="${dist.images}/jakarta-log4j-${version}.tar"
+    <tar tarfile="${dist.images}/logging-log4j-${version}.tar"
          basedir="${dist.tmp}"
-         includes="jakarta-log4j-${version}/**" />
+         includes="logging-log4j-${version}/**" />
 
-    <gzip src="${dist.images}/jakarta-log4j-${version}.tar"
-          zipfile="${dist.images}/jakarta-log4j-${version}.tar.gz" />
+    <gzip src="${dist.images}/logging-log4j-${version}.tar"
+          zipfile="${dist.images}/logging-log4j-${version}.tar.gz" />
 
-    <zip zipfile="${dist.images}/jakarta-log4j-${version}.zip"
+    <zip zipfile="${dist.images}/logging-log4j-${version}.zip"
          basedir="${dist.tmp}"
-         includes="jakarta-log4j-${version}/**" />
+         includes="logging-log4j-${version}/**" />
 
 
     <delete dir="${dist.tmp}" />
diff --git a/build/siteBuild.sh b/build/siteBuild.sh
deleted file mode 100644
index d6707e7..0000000
--- a/build/siteBuild.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
- 
-if [ "$JAVA_HOME" = "" ] ; then
-  echo You must set JAVA_HOME to point at your Java Development Kit directory
-  exit 1
-fi
-
-# convert the existing path to unix
-if [ "$OSTYPE" = "cygwin32" ] || [ "$OSTYPE" = "cygwin" ] ; then
-   CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
-fi
-
-# Add in the jakarta-site2 library files
-for i in ../../jakarta-site2/lib/*.jar
-do
-    CLASSPATH=$CLASSPATH:"$i"
-done
-
-
-# convert the unix path to windows
-if [ "$OSTYPE" = "cygwin32" ] || [ "$OSTYPE" = "cygwin" ] ; then
-   CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
-fi
-
-echo "CLASSPATH=$CLASSPATH"
-
-BUILDFILE=siteBuild.xml
-
-#echo $CLASSPATH
-
-java $ANT_OPTS -classpath "$CLASSPATH" org.apache.tools.ant.Main \
-                -Dant.home=$ANT_HOME \
-                -buildfile ${BUILDFILE} \
-                 "$@"
diff --git a/build/siteBuild.xml b/build/siteBuild.xml
deleted file mode 100644
index 5f9f844..0000000
--- a/build/siteBuild.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<project name="build-site" default="docs" basedir="..">
-
-    <!-- Initialization properties -->
-    <property name="project.name"   value="log4j.site"/>
-    
-    <property name="docs.src" value="./src/xdocs"/>
-    <property name="docs.dest" value="./docs"/>
-
-    <target name="prepare">    
-        <available classname="org.apache.velocity.anakia.AnakiaTask" 
-            property="AnakiaTask.present"/>
-    </target>
-
-    <target depends="prepare" name="prepare-error" unless="AnakiaTask.present">
-        <echo>
-            AnakiaTask is not present! Please check to make sure that 
-            velocity.jar is in your classpath.
-        </echo>
-    </target>
-
-    <target name="docs" depends="prepare-error" if="AnakiaTask.present">
-        <taskdef name="anakia" 
-                 classname="org.apache.velocity.anakia.AnakiaTask"/>
-        <anakia basedir="${docs.src}" destdir="${docs.dest}/"
-             extension=".html" 
-	     style="site.vsl"
-             projectFile="stylesheets/project.xml"
-             excludes="**/stylesheets/**, empty.xml"
-             includes="**/*.xml"
-             lastModifiedCheck="true"
-	     templatePath="../jakarta-site2/xdocs/stylesheets">
-        </anakia>
-        <!--
-        <copy todir="${docs.dest}/images" filtering="no">
-            <fileset dir="${docs.src}/images">
-                <include name="**/*.gif"/>
-                <include name="**/*.jpeg"/>
-                <include name="**/*.jpg"/>
-            </fileset>
-        </copy>
-         In case we have CSS someday
-        <copy todir="${docs.dest}" filtering="no">
-            <fileset dir="${docs.src}">
-                <include name="**/*.css"/>
-            </fileset>
-        </copy>
-        -->
-    </target>
-</project>
diff --git a/docs/FAQ.html b/docs/FAQ.html
index 3b0b0db..f2a9f67 100644
--- a/docs/FAQ.html
+++ b/docs/FAQ.html
@@ -1,212 +1,407 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html> <head>
-<title>log4j FAQ</title>
-</head> 
-<body bgcolor=#FFFFFF>
- 
-<center>
-<h1>Frequently Asked Questions about log4j</h1>
-
-<b>Ceki G&uuml;lc&uuml;</b> and <b>Chris Taylor</b> 
-<h2>May 2002</h2>
-</center>
-<ul>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 
-<li><p><a href=#whatIs>What is log4j?</a></p>
-
-<li><p><a href=#reliable>Is log4j a reliable logging system?</a></p>
-<li><p><a href=#prerequisites>What are the prerequisites for log4j?</a></p>
-<li><p><a href=#javadoc>Is there javadoc documentation for log4j?</a></p>
-<li><p><a href=#alternatives>What other logging packages are there?</a></p>
-<li><p><a HREF=#usageExample>Is there example code for using log4j?</a></p>
-<li><p><a href=#features>What are the features of log4j?</a></p> 
-<li><p><a href=#thread-safety>Is log4j thread-safe?</a></p> 
-<li><p><a href=#sample>What does log output look like?</a></p>
-<li><p><a href=#logger>What are <em>Loggers</em>?</a></p>
-<li><p><a href=#behavior>How can I change log behavior at runtime?</a></p>
-<li><p><a HREF=#fastLogging>What is the fastest way of (not) logging?</a></p>
-<li><p><a HREF=#arrayDebug>What is the use of the <code>debug</code> method
-expecting a <code>String</code> array as one of its parameters?</a></p>
+<!-- Content Stylesheet for Site -->
 
-<li><p><a href=#introCat>Why was the Logger class introduced and how
-do I migrate from the previous String based implementation?</a></p>
-
-<li><p><a href=#namingLoggers>Are there any suggested ways for naming
-loggers?</a></p>
-
-<li><p><a href=#className>How do I get the fully-qualified name of a class in
-a static block?</a></p>
-
-<li><p><a href=#customLayouts>Can the log output format be
-customized?</a></p>
-
-<li><p><a href="#options">What are the configurable options for
-<code>ForBarAppender</code>?</a></p>
-
-
-<li><p><a href=#NDC>Can the outputs of multiple client request go to
-different log files?</a></p>
-
-<li><p><a href=#rm>Logger instances seem to be create only. Why isn't
-there a method to remove logger instances?</a></p>
-
-<li><p><a href=#filterByLevel>Is it possible to direct log output
-to different appenders by level?</a></p>
-
-<li><p><a href=#many21>How do I get multiple processes to log to the 
-same file?</a></p>
-
-<li><p><a href=#timestamp>If I have many process across multiple hosts
-(possibly across multiple timezones) logging to the same file using the
-method above, what happens to timestamps?</P>
-
-<LI><P><A HREF="#j2ee">Why can't Log4J find my properties file in a J2EE or WAR application?</P>
-<LI><P><A HREF="#configureandwatch">Is there a way to get Log4J to automatically reload a configuration file if it changes?</P>
-<LI><P><A HREF="#nteventlogproblems">What does the Windows NT Event Viewer complain about missing descriptions for my event messages
-when I use the NTEventLogAppender?</P>
-<LI><P><A HREF="#morenteventlogproblems">Why can't I map my logger names to the loggers that appear in the 
-NT Event Log when I use the NTEventLogAppender?</p>						   
-<li><p><a href=#tax>Why should I donate my log4j extensions back to the
-project?</a></p>
-<li><p><a href=#help>What should I keep in mind when contributing code?</a></p>
-
-
-<li><p><a href=#download>Where can I find the latest distribution of log4j?</a></p>
-
-</ul>
-
-<hr>
-<p><a name=whatIs><h4 id="whatIs">What is log4j?</h4>
-
-log4j is a tool to help the programmer output log statements to a
-variety of output targets.
-
-<p>In case of problems with an application, it is helpful to enable
-logging so that the problem can be located. With log4j it is possible
-to enable logging at runtime without modifying the application binary.
-The log4j package is designed so that log statements can remain in
-<i>shipped</i> code without incurring a high performance cost. It
-follows that the speed of logging (or rather not logging) is capital.
-
-<p>At the same time, log output can be so voluminous that it quickly
-becomes overwhelming. One of the distinctive features of log4j is the
-notion of <i>hierarchical loggers</i>. Using loggers it is
-possible to selectively control which log statements are output at
-arbitrary  granularity.
-
-<p>log4j is designed with two distinct goals in mind: speed and
-flexibility. There is a tight balance between these two
-requirements. I believe that log4j strikes the right balance.
-
-<a name=reliable><h4>Is log4j a reliable logging system?</h4>
-
-No. log4j is not reliable. It is a best-effort and <em>fail-stop</em>
-logging system.
-
-<p>By fail-stop, we mean that log4j will not throw unexpected
-exceptions at run-time potentially causing your application to
-crash. <b>If for any reason, log4j throws an uncaught exception,
-please send an email to the <a
-href="mailto:log4j-user@jakarta.apache.org">log4j-user@jakarta.apache.org</a>
-mailing list</b>. Uncaught exceptions are handled as serious bugs
-requiring immediate attention.
-
-
-<p>Moreover, log4j will not revert to System.out or System.err
-when its designated output stream is not opened, is not writable or
-becomes full. This avoids corrupting an otherwise working program by
-flooding the user's terminal because logging fails. However, log4j
-will output a single message to System.err indicating that logging can
-not be performed.
-
-<a name=prerequisites><h4>What are the prerequisites for log4j?</h4>
-
-<ul>
-
-  <p><li>Log4j is JDK 1.1.x compatible.
-  
-  <p><li>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.
     
-    <p>The DOMConfigurator.configure(String filename) method and its
-    variants require a JAXP compatible XML parser, for example <a
-    href="http://xml.apache.org/">Xerces</a> or Sun's
-    parser. Compiling the DOMConfigurator requires the presence of a
-    JAXP parser in the classpath.
-
-    <p><li>The <code>org.apache.log4j.net.SMTPAppender</code> relies
-    on the <a href="http://java.sun.com/products/javamail/">JavaMail
-    API</a>. It has been tested with JavaMail API version 1.2. The
-    JavaMail API requires the <a
-    href="http://java.sun.com/beans/glasgow/jaf.html">JavaBeans
-    Activation Framework</a> package.
     
-    <p><li>The <code>org.apache.log4j.net.JMSAppender</code> requires
-    the presence of the JMS API as well as JNDI.
-
-
-    <p><li>log4j test code relies on the <a
-    href="http://www.junit.org">JUnit</a> testing framework.
-
-</ul>    
-
-<a name=usageExample><h4>Is there example code for using log4j?</h4>
-
-<p>See the <code>examples/</code> directory.
-
-<a name=features><h4 id="">What are the features of log4j?</h4>
-
-<ul>
-
-  <p><li>log4j is optimized for speed.
+    
+        
+<!-- start the processing -->
+    <!-- ====================================================================== -->
+    <!-- GENERATED FILE, DO NOT EDIT, EDIT THE XML FILE IN xdocs INSTEAD! -->
+    <!-- Main Page Section -->
+    <!-- ====================================================================== -->
+    <html>
+        <head>
+            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
+
+                                                    <meta name="author" value="Ceki Gulcu">
+            <meta name="email" value="cgu@apache.org">
+            
+            
+                                    
+                         
+            <link href="./css/site.css" rel="stylesheet" type="text/css"/>
+                                   
+
+            <title>Log4j project - Frequently Asked Questions about log4j</title>
+        </head>
+
+        <body bgcolor="#ffffff" text="#000000" link="#525D76">        
+           <!-- START Header table --> 
+                     <table class="banner" border="0">
+     <tr>
+       <td valign="top">
+         <a href="http://logging.apache.org/">
+           <img src="http://logging.apache.org/images/ls-logo.jpg" border="0"/>
+         </a>
+       </td>
+       <td align="right">
+                              	       <a href="http://logging.apache.org/log4j/docs/">
+                 <img src="./images/logo.jpg" alt="The log4j project" border="0"/>
+      	       </a>
+                               </td>
+     </tr>
+   </table>
+              <!-- END Header table --> 
+
+	   <div class="centercol">
+             <hr noshade="" size="1"/>
+		       
+                                       <center>
+    <h2>Frequently Asked Questions about log4j</h2>
+    <h3>Ceki  G�lc�, Paul Smith, Chris Taylor<br />
+    May 2002, last updated on September 15th, 2004</h3>
+  </center>
+                                                                                                                                                                                                                                              
+            
+  
+                  <br/>
+      <div class="index-faqSection">
+        Section 1. <a href="#1"> Generalities</a>
+      </div>
+
+                                                     <table class="index-question">
+              <td nowrap="true" valign="top">Question 1.1</td>	      
+              <td><a href="#1.1">What is log4j?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 1.2</td>	      
+              <td><a href="#1.2">Is log4j a reliable logging system?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 1.3</td>	      
+              <td><a href="#1.3">What are the prerequisites for log4j?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 1.4</td>	      
+              <td><a href="#1.4">What are the features of log4j?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 1.5</td>	      
+              <td><a href="#1.5">Is there example code for using log4j?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 1.6</td>	      
+              <td><a href="#1.6">What documentation should I read to learn more about
+      log4j?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 1.7</td>	      
+              <td><a href="#1.7">Is log4j thread-safe?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 1.8</td>	      
+              <td><a href="#1.8">What does log output look like?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 1.9</td>	      
+              <td><a href="#1.9">Why should I use log4j when JDK 1.4 already ships with a
+      logging API?</a></td>           
+            </table>
+                                        <br/>
+      <div class="index-faqSection">
+        Section 2. <a href="#2"> Using log4j</a>
+      </div>
+
+                                                     <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.1</td>	      
+              <td><a href="#2.1">What are <em>Loggers</em>?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.2</td>	      
+              <td><a href="#2.2">How can I change log behavior at runtime?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.3</td>	      
+              <td><a href="#2.3">What is the fastest way of (not) logging?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.4</td>	      
+              <td><a href="#2.4"> Are there any suggested ways for naming loggers?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.5</td>	      
+              <td><a href="#2.5">How do I get the fully-qualified name of a class in a static block?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.6</td>	      
+              <td><a href="#2.6">Can the log output format be customized? </a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.7</td>	      
+              <td><a href="#2.7">What are the configurable options for <code>FooBarAppender</code>?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.8</td>	      
+              <td><a href="#2.8">What is the recommended way of migrating from
+      java.util.logging to log4j?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.9</td>	      
+              <td><a href="#2.9">Is it possible to direct log output to
+      different appenders by level? </a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.10</td>	      
+              <td><a href="#2.10">What does the Windows NT Event Viewer complain about
+      missing descriptions for my event messages when I use the
+      <code>NTEventLogAppender</code>?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.11</td>	      
+              <td><a href="#2.11">Why can't I map my logger names to the loggers that
+      appear in the NT Event Log when I use the
+      NTEventLogAppender?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 2.12</td>	      
+              <td><a href="#2.12">Are there suggested approaches for logging in JSP pages?</a></td>           
+            </table>
+                                        <br/>
+      <div class="index-faqSection">
+        Section 3. <a href="#3"> Advanced questions</a>
+      </div>
+
+                                                     <table class="index-question">
+              <td nowrap="true" valign="top">Question 3.1</td>	      
+              <td><a href="#3.1">Can the outputs of multiple client request go to
+      different log files?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 3.2</td>	      
+              <td><a href="#3.2">Logger instances seem to be create only. Why isn't
+      there a method to remove logger instances?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 3.3</td>	      
+              <td><a href="#3.3">How do I get multiple process to log to the same file?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 3.4</td>	      
+              <td><a href="#3.4">How about the timesamps of events generated by multiple
+      processes across multiple hosts (possibly across multiple
+      timezones)?
+      </a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 3.5</td>	      
+              <td><a href="#3.5">Why can't log4j find my properties file in a J2EE or WAR
+      application?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 3.6</td>	      
+              <td><a href="#3.6">Is there a way to get log4j to automatically reload a
+      configuration file if it changes?</a></td>           
+            </table>
+                                        <br/>
+      <div class="index-faqSection">
+        Section 4. <a href="#4"> Contributing to the project</a>
+      </div>
+
+                                                     <table class="index-question">
+              <td nowrap="true" valign="top">Question 4.1</td>	      
+              <td><a href="#4.1">Why should I donate my extensions to log4j back to the
+      project?
+      </a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 4.2</td>	      
+              <td><a href="#4.2">What should I keep in mind when contributing code?</a></td>           
+            </table>
+                                           <table class="index-question">
+              <td nowrap="true" valign="top">Question 4.3</td>	      
+              <td><a href="#4.3">How can I contribute a new question/answer to this
+      document?</a></td>           
+            </table>
+                                            <hr/>
 
-  <p><li>log4j is based on a named logger hierarchy.
+  
+                  <div class="faqSection">
+        <a name="1">Section 1.</a> Generalities
+      </div>
+                                       
+      <p>This section contains general questions about log4j.</p>
+    
+                                 <div class="question">
+             <a name="1.1">1.1 What is log4j?</a>
+           </div>
+                      
+	<p>log4j is a tool to help the programmer output log statements to a
+	variety of output targets.
+	</p>
+
+	<p>In case of problems with an application, it is helpful to
+	enable logging so that the problem can be located. With log4j
+	it is possible to enable logging at runtime without modifying
+	the application binary.  The log4j package is designed so that
+	log statements can remain in <i>shipped</i> code without
+	incurring a high performance cost. It follows that the speed
+	of logging (or rather not logging) is capital.
+	</p>
+
+	<p>At the same time, log output can be so voluminous that it quickly
+	becomes overwhelming. One of the distinctive features of log4j is the
+	notion of <i>hierarchical loggers</i>. Using loggers it is
+	possible to selectively control which log statements are output at
+	arbitrary  granularity.
+	</p>
+
+	<p>log4j is designed with two three goals in mind:
+	reliability, speed and flexibility. There is a tight balance
+	between these requirements. We believe that log4j strikes the
+	right balance.
+	</p>
       
-  <p><li>log4j is fail-stop but not reliable.
-
-  <p><li>log4j is thread-safe.
-
-  <p><li>log4j is not restricted to a predefined set of facilities.
-
-  <p><li>Logging behavior can be set at runtime using a configuration
-      file. Configuration files can be property files or in XML format.
+                                 <div class="question">
+             <a name="1.2">1.2 Is log4j a reliable logging system?</a>
+           </div>
+                      
+	<p>No. log4j is not reliable. It is a best-effort 
+	<em>fail-stop</em> logging system.
+	</p>
+
+	<p>By fail-stop, we mean that log4j will not throw unexpected
+	exceptions at run-time potentially causing your application to
+	crash. <b>If for any reason, log4j throws an uncaught exception,
+	please send an email to the <a href="mailto:log4j-user@logging.apache.org">log4j-user@logging.apache.org</a>
+	mailing list</b>. Uncaught exceptions are handled as serious bugs
+	requiring immediate attention.
+	</p>
+
+	<p>Moreover, log4j will not revert to System.out or System.err
+	when its designated output stream is not opened, is not writable or
+	becomes full. This avoids corrupting an otherwise working program by
+	flooding the user's terminal because logging fails. However, log4j
+	will output a single message to System.err indicating that logging can
+	not be performed.
+	</p>
       
-  <p><li>log4j is designed to handle Java Exceptions from the start.
+                                 <div class="question">
+             <a name="1.3">1.3 What are the prerequisites for log4j?</a>
+           </div>
+                      
+	<ul>
+	  <li><p>Log4j versions upto and including 1.2.8 are
+	  compatible with JDK 1.1.x and later.  Log4j version 1.3 will
+	  be compatilble with JDK 1.2 and later.
+	  </p></li>
+
+	  <li><p>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.
+	  </p>
+	  <p>The DOMConfigurator.configure(String filename) method and its
+	  variants require a JAXP compatible XML parser, for example <a href="http://xml.apache.org/">Xerces</a> or Sun's
+	  parser. Compiling the DOMConfigurator requires the presence of a
+	  JAXP parser in the classpath.
+	  </p>
+	  </li>
+
+	  <li><p>The <code>org.apache.log4j.net.SMTPAppender</code>
+	  relies on the <a href="http://java.sun.com/products/javamail/">JavaMail
+	  API</a>. It has been tested with JavaMail API version
+	  1.2. The JavaMail API requires the <a href="http://java.sun.com/beans/glasgow/jaf.html">JavaBeans
+	  Activation Framework</a> package.
+	  </p></li>
+
+	  <li><p>The <code>org.apache.log4j.net.JMSAppender</code>
+	  requires the presence of the JMS API as well as JNDI.
+	  </p></li>
+
+	  <li><p>log4j test code relies on the <a href="http://www.junit.org">JUnit</a> testing framework.
+	  </p></li>
+	</ul>    	
       
-  <p><li>log4j can direct its output to a file, the console, an
-      <code>java.io.OutputStream</code>, <code>java.io.Writer</code>,
-      a remote server using TCP, a remote Unix Syslog daemon, to a
-      remote listener using JMS, to the NT EventLog or even send e-mail.
-
-  <p><li>log4j uses 5 levels, namely DEBUG, INFO, WARN, ERROR and
-  FATAL.
-
-  <p><li>The format of the log output can be easily changed by
-      extending the Layout class.
-
-  <p><li>The target of the log output as well as the writing strategy
-      can be altered by implementations of the Appender interface.
-
-   <p><li>log4j supports multiple output appenders per logger.
-
-   <p><li>log4j supports internationalization.
-       
-</ul>
-
-<a name=thread-safety><h4 id="">Is log4j thread-safe?</h4>
-
-Yes, log4j is thread-safe. 
-
-<a name=sample><h4 id="">What does log output look like?</h4>
+                                 <div class="question">
+             <a name="1.4">1.4 What are the features of log4j?</a>
+           </div>
+                      
+	<ul>
+
+	  <li><p>log4j is optimized for speed.</p></li>
+
+	  <li><p>log4j is based on a named logger hierarchy.</p></li>
+	  
+	  <li><p>log4j is fail-stop. However, altough it certainly
+	  strives to ensure delivery, log4j does not guarantee that
+	  each log statement will be delivered to its destination.
+	  </p></li>
+
+	  <li><p>log4j is thread-safe.</p></li>
+
+	  <li><p>log4j is not restricted to a predefined set of
+	  facilities.</p></li>
+
+	  <li><p>Logging behavior can be set at runtime using a
+	  configuration file. Configuration files can be property
+	  files or in XML format.  </p></li>
+
+	  <li><p>log4j is designed to handle Java Exceptions from the
+	  start.</p></li>
+	  
+	  <li><p>log4j can direct its output to a file, the console,
+	  an <code>java.io.OutputStream</code>,
+	  <code>java.io.Writer</code>, a remote server using TCP, a
+	  remote Unix Syslog daemon, to a remote listener using JMS,
+	  to the NT EventLog or even send e-mail.  </p></li>
+
+	  <li><p>log4j uses 6 levels, namely TRACE, DEBUG, INFO, WARN,
+	  ERROR and FATAL.  </p></li>
+
+	  <li><p>The format of the log output can be easily changed by
+	  extending the <code>Layout</code>
+          class.  </p></li>
+
+	  <li><p>The target of the log output as well as the writing
+	  strategy can be altered by implementations of the
+	  <code>Appender</code> interface.  </p></li>
+
+	  <li><p>log4j supports multiple output appenders per logger.
+	  </p></li>
+
+	  <li><p>log4j supports internationalization.</p></li>
+	</ul>
+      
+                                 <div class="question">
+             <a name="1.5">1.5 Is there example code for using log4j?</a>
+           </div>
+                      
+	<p>See the <code>examples/</code> directory.</p>
+      
+                                 <div class="question">
+             <a name="1.6">1.6 What documentation should I read to learn more about
+      log4j?</a>
+           </div>
+                      
+	<p>Make sure to read the <a href="manual.html">short
+	manual</a>. It is also recommended to you read <a href="https://www.qos.ch/shop/products/log4j/log4j-Manual.jsp">The complete
+	log4j manual</a> which is much more detailed and up to
+	date. Both documents were written by Ceki G�lc�.
+	</p>
+      
+                                 <div class="question">
+             <a name="1.7">1.7 Is log4j thread-safe?</a>
+           </div>
+                      
+	<p>Yes, log4j is thread-safe. Log4j components are designed to
+	be used in heavily multithreaded systems.</p>
+      
+                                 <div class="question">
+             <a name="1.8">1.8 What does log output look like?</a>
+           </div>
+                      
 
-The log output can be customized in many ways. Moreover, one can completely
-override the output format by implementing one's own Layout. 
+	<p>The log output can be customized in many ways. Moreover,
+	one can completely override the output format by implementing
+	one's own Layout.
+	</p>
 
-<p>Here is an example output using <em>PatternLayout</em> with
-the conversion pattern <b>"%r [%t] %-5p %c{2} %x - %m%n"</b>
+	<p>Here is an example output using <em>PatternLayout</em> with
+	the conversion pattern <b>"%r [%t] %-5p %c{2} %x - %m%n"</b>
+	</p>
 
-<pre>
+	<pre class="screen_output">
 176 [main] INFO  examples.Sort - Populating an array of 2 elements in reverse order.
 225 [main] INFO  examples.SortAlgo - Entered the sort method.
 262 [main] DEBUG SortAlgo.OUTER i=1 - Outer loop.
@@ -220,394 +415,739 @@ the conversion pattern <b>"%r [%t] %-5p %c{2} %x - %m%n"</b>
         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>
-
-<p>The first field is the number of milliseconds elapsed since the
-start of the program. The second field is the thread outputting the
-log statement. The third field is the level of the log
-statement. The fourth field is the rightmost two components of the
-logger making the log request. The fifth field (just before the '-')
-is the <em>nested diagnostic context</em> (NDC). Note the nested diagnostic
-context may be empty as in the first two statements. The text after
-the '-' is the message of the statement.
-
-<a name=logger><h4 id="">What are <em>Loggers</em>?</h4>
-
-Lggers lie at the heart of log4j. Loggers define a hierarchy and give
-the programmer <em>run-time</em> control on which statements are
-printed or not.
-
-<p>Loggers are assigned levels. A log statement is printed
-depending on its level <em>and</em> its logger.
-
-<p>Make sure to read the <a href=manual.html>log4j manual</a>
-for more information.
-
-<a name=behavior><h4 id="">How can I change log behavior at runtime?</h4>
-
-<p>Log behavior can be set using configuration files which are parsed
-at runtime. Using configuration files the programmer can define
-loggers and set their levels.
-
-<p>The <code>PropertyConfigurator</code> defines a particular format
-of a configuration file. See also the <code>examples/Sort.java</code>
-example and associated configuration files.
-
-<p>Configuration files can be specified in XML. See
-<code>log4j.dtd</code> and
-<code>org.log4j.xml.DOMConfigurator</code> for more details.
-
-<p>See the various Layout and Appender components for specific
-configuration options.
-
-<p>In addition to configuration files, the user may disable all
-messages belonging to a set of levels. See next item.
-
-<a name=fastLogging><h4>What is the fastest way of (not) logging?</h4>
-
-<p> For some logger <code>l</code>, writing, <pre>
-  l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
-</pre>
-
-<p>incurs the cost of constructing the message parameter, that is
-converting both integer <code>i</code> and <code>entry[i]</code> to a
-String, and concatenating intermediate strings. This, regardless of
-whether the message will be logged or not.
+	</pre>
+
+	<p>The first field is the number of milliseconds elapsed since
+	the start of the program. The second field is the thread
+	outputting the log statement. The third field is the level of
+	the log statement. The fourth field is the rightmost two
+	components of the logger making the log request. The fifth
+	field (just before the '-') is the <em>nested diagnostic
+	context</em> (NDC). Note the nested diagnostic context may be
+	empty as in the first two statements. The text after the '-'
+	is the message of the statement.
+	</p>
+      
+                                 <div class="question">
+             <a name="1.9">1.9 Why should I use log4j when JDK 1.4 already ships with a
+      logging API?</a>
+           </div>
+                      
+        <p>
+        Although both APIs are conceptually similar, the log4j API is
+        significantly more flexible and offers many more features, too
+        numerous to be listed here. You will discover that the
+        additional features and flexibility turn out to be
+        indispensable in the context of a mission-critical
+        application.
+        </p>
+
+        <p>The open and collaborative way in which log4j is developped
+        ensures that it continues to preserve and even widen its
+        competitive edge. At some point, input from bright developpers
+        from all over the world is bound to make a difference.
+        </p>
+      
+                              <div class="faqSection">
+        <a name="2">Section 2.</a> Using log4j
+      </div>
+                                       
+      <p>This section contains answers to questions encountered while
+      using log4j.</p>
+    
+                                 <div class="question">
+             <a name="2.1">2.1 What are <em>Loggers</em>?</a>
+           </div>
+                      
+	<p>Lggers lie at the heart of log4j. Loggers define a hierarchy and give
+	the programmer <em>run-time</em> control on which statements are
+	printed or not.
+	</p>
+	
+	<p>Loggers are assigned levels. A log statement is printed
+	depending on its level <em>and</em> its logger.
+	</p>
+	
+	<p>Make sure to read the <a href="manual.html">log4j manual</a>
+	for more information.
+	</p>	
+      
+                                 <div class="question">
+             <a name="2.2">2.2 How can I change log behavior at runtime?</a>
+           </div>
+                      
+	<p>Log behavior can be set using configuration files which are parsed
+	at runtime. Using configuration files the programmer can define
+	loggers and set their levels.
+	</p>
+	
+	<p>The <code>PropertyConfigurator</code> defines a particular format
+	of a configuration file. See also the <code>examples/Sort.java</code>
+	example and associated configuration files.
+	</p>
+	
+	<p>Configuration files can be specified in XML. See
+	<code>log4j.dtd</code> and
+	<code>org.log4j.xml.DOMConfigurator</code> for more details.
+	</p>
+	
+	<p>See the various Layout and Appender components for specific
+	configuration options.
+	</p>
+	
+	<p>In addition to configuration files, the user may disable all
+	messages belonging to a set of levels. See next item.
+	</p>
+      
+                                 <div class="question">
+             <a name="2.3">2.3 What is the fastest way of (not) logging?</a>
+           </div>
+                      
 
-<p>If you are worried about speed, then write
-<pre>
+	<p> For some logger <code>l</code>, writing, 
+	</p>
+	
+	<pre class="source">
+ l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
+	</pre>
+	
+	<p>incurs the cost of constructing the message parameter, that is
+	converting both integer <code>i</code> and <code>entry[i]</code> to a
+	String, and concatenating intermediate strings. This, regardless of
+	whether the message will be logged or not.
+	</p>
+
+	<p>If you are worried about speed, then write</p>
+	<pre class="source">
    if(l.isDebugEnabled()) {
      l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
    }
-</pre>
-
-<p>This way you will not incur the cost of parameter construction if
-debugging is disabled for logger <code>l</code>. On the other
-hand, if the logger is debug enabled, you will incur the cost of
-evaluating whether the logger is enabled or not, twice: once in
-<code>debugEnabled</code> and once in <code>debug</code>.  This is an
-insignificant overhead since evaluating a logger takes less than 1%
-of the time it takes to actually log a statement.
-
-<a name=namingLoggers><h4>Are there any suggested ways for naming
-loggers?</a></h4>
-
-<p>Yes, there are.
-
-<p>You can name loggers by <strong>locality</strong>. It turns out
-that instantiating a logger in each class, with the logger name
-equal to the fully-qualified name of the class, is a useful and
-straightforward approach of defining loggers. This approach has
-many benefits:
+	</pre>
+
+	<p>This way you will not incur the cost of parameter
+	construction if debugging is disabled for logger
+	<code>l</code>. On the other hand, if the logger is debug
+	enabled, you will incur the cost of evaluating whether the
+	logger is enabled or not, twice: once in
+	<code>debugEnabled</code> and once in <code>debug</code>.
+	This is an insignificant overhead since evaluating a logger
+	takes less than 1% of the time it takes to actually log a
+	statement.
+	</p>
+	
+        <h3>Better alternative based on message patterns</h3>
+        <p>As of log4j version 1.3, there exists a significantly more
+        convenient alternative based on message patterns. Assuming
+        <code>entry</code> is an object, you can write:
+        </p>
+
+	<p class="source">
+          l.debug("The new entry is {}.", entry);
+	</p>
+
+        <p>After evaluting whether to log or not, and only if the
+        decision is positive, will the logger instace format the
+        message and replace the '{}' pair with the string value of
+        <code>entry</code>. In other words, the paramerized form does
+        not incur the cost of parameter construction in case the log
+        statement is disabled.
+        </p>
+        
+        <p>Thus, the following two lines will yield the exact same
+        output. However, the second form will perform at least 30
+        (thirty) times faster in case of a <em>disabled</em> logging
+        statement.
+        </p>
+        
+	<p class="source">
+          l.debug("The new entry is "+entry+"."); <br />
+          l.debug("The new entry is {}.", entry);
+	</p>
+        
+        <p>A two argument variant is also availalble. For example, you
+        can write:
+        </p>
+	<p class="source">
+          l.debug("The new entry is {}. It replaces {}.", entry, oldEntry);
+	</p>
+        
+     
 
-<ul>
-  <li>It is very simple to implement.
+      
+                                 <div class="question">
+             <a name="2.4">2.4  Are there any suggested ways for naming loggers?</a>
+           </div>
+                      
+	
 
-  <li>It is very simple to explain to new developers.
+	<p>Yes, there are.</p>
 
-  <li>It automatically mirrors your application's own modular design.
+	<p>You can name loggers by <strong>locality</strong>. It turns out
+	that instantiating a logger in each class, with the logger name
+	equal to the fully-qualified name of the class, is a useful and
+	straightforward approach of defining loggers. This approach has
+	many benefits:
+	</p>
+	
+	<ul>
+	  <li>It is very simple to implement.</li>
+	  
+	  <li>It is very simple to explain to new developers.</li>
+	  
+	  <li>It automatically mirrors your application's own modular design.
+	  </li>
+	  <li>It can be further refined at will.</li>
+	  
+	  <li>Printing the logger automatically gives information on the locality
+	  of the log statement.	  </li>
+	</ul>
+
+	<p>However, this is not the only way for naming loggers. A
+	common alternative is to name loggers by <strong>functional
+	areas</strong>. For example, the "database" logger, "RMI"
+	logger, "security" logger, or the "XML" logger.
+	</p>
+
+	<p>You may choose to name loggers by functionality and
+	subcategorize by locality, as in "DATABASE.com.foo.some.package.someClass" or
+	"DATABASE.com.foo.some.other.package.someOtherClass".
+	</p>
+	
+	<p><em>You are totally free in choosing the names of your
+	loggers.</em> The log4j package merely allows you to manage your
+	names in a hierarchy.  However, it is your responsibility to define
+	this hierarchy.
+	</p>
+	
+	<p>Note by naming loggers by locality one tends to name things by
+	functionality, since in most cases the locality relates closely to
+	functionality. 
+	</p>
 
-  <li>It can be further refined at will.
+      
+                                 <div class="question">
+             <a name="2.5">2.5 How do I get the fully-qualified name of a class in a static block?</a>
+           </div>
+                      
+	<p>You can easily retrieve the fully-qualified name of a class in a
+	static block for class X, with the statement
+	<code>X.class.getName()</code>. Note that <code>X</code> is the class
+	name and not an instance.  The <code>X.class</code> statement does
+	<i>not</i> create a new instance of class <code>X</code>.
+	</p>
+	
+	<p>Here is the suggested usage template:</p>
 
-  <li>Printing the logger automatically gives information on the locality
-  of the log statement.
+	<pre class="source">
+package a.b.c;
 
-</ul>
+public class Foo {
+  final static Logger logger = Logger.getLogger(Foo.class);
+  ... other code
 
+}
+	</pre>
+      
+                                 <div class="question">
+             <a name="2.6">2.6 Can the log output format be customized? </a>
+           </div>
+                      
+	<p>Yes, you can extend the <code>Layout</code> class to create
+	you own customized log format. Appenders can be parameterized
+	to use the layout of your choice.
+	</p>
+      
+                                 <div class="question">
+             <a name="2.7">2.7 What are the configurable options for <code>FooBarAppender</code>?</a>
+           </div>
+                      
+	<p>Log4j uses JavaBeans style configuration.</p>
+
+	<p>Thus, any setter method in <code>FooBarAppender</code>
+	corresponds to a configurable option. For example, in <a href="api\org\apache\log4j\RollingFileAppender.html"><code>RollingFileAppender</code></a>
+	the <a href="api/org/apache/log4j/RollingFileAppender.html#setMaxBackupIndex(int)"><code>setMaxBackupIndex(int
+	maxBackups)</code></a> method corresponds to the
+	<code>maxBackupIndex</code> option. The first letter of the
+	option can be upper case, i.e.  <code>MaxBackupIndex</code>
+	and <code>maxBackupIndex</code> are equivalent but not
+	<code>MAXBACKUPIndex</code> nor <code>mAXBackupIndex</code>.
+	</p>
+
+	<p>Layouts options are also defined by their setter methods. The same goes
+	for most other log4j components.
+	</p>
+      
+                                 <div class="question">
+             <a name="2.8">2.8 What is the recommended way of migrating from
+      java.util.logging to log4j?</a>
+           </div>
+                      
+	
+	<p>We suggest to just use global file search/replace.  You should be able
+	to replace all the "java.util.Logger" references with
+	"org.apache.log4j.Logger", and you should be on your way.
+	</p>
+	
+	<p>If you're on a Win32 platform, we recommend <a href="http://www.textpad.com/">Textpad</a>. You can use the
+	CTRL+SHIFT+O to open all *.java files from a directory including all
+	its sub-directories, and then use the search/replace function to
+	replace in all files, and then CTRL+SHIFT+S to save all.  Should take
+	about 60 seconds!  :)
+	</p>
+      
+                                 <div class="question">
+             <a name="2.9">2.9 Is it possible to direct log output to
+      different appenders by level? </a>
+           </div>
+                      
+	<p>Yes it is. Setting the <b>Threshold</b> option of any appender
+	extending <a href="api/org/apache/log4j/AppenderSkeleton.html">AppenderSkeleton</a>,
+	(most log4j appenders extend AppenderSkeleton) to filter out all log
+	events with <em>lower</em> level than the value of the threshold
+	option. 
+	</p>
+
+	<p>For example, setting the threshold of an appender to DEBUG
+	also allow INFO, WARN, ERROR and FATAL messages to log along
+	with DEBUG messages. This is usually acceptable as there is
+	little use for DEBUG messages without the surrounding INFO,
+	WARN, ERROR and FATAL messages. Similarly, setting the
+	threshold of an appender to ERROR will filter out DEBUG, INFO
+	and WARN messages but not ERROR or FATAL messages.
+	</p>
+
+	<p>This policy usually best encapsulates what the user
+	actually wants to do, as opposed to her mind-projected
+	solution.
+	</p>
+	<p>See <i>examples/sort4.lcf</i> for an example threshold
+	configuration.</p>
+
+	<p>If you must filter events by exact level match, then you can
+	attach a <a href="api/org/apache/log4j/varia/LevelMatchFilter.html">LevelMatchFilter</a>
+	to any appender to filter out logging events by exact level match.
+	</p>
 
-<p>However, this is not the only way for naming loggers. A common
-alternative is to name loggers by <strong>functional
-areas</strong>. For example, the "database" logger, "RMI" logger,
-"security" logger, or the "XML" logger.
+      
+                                 <div class="question">
+             <a name="2.10">2.10 What does the Windows NT Event Viewer complain about
+      missing descriptions for my event messages when I use the
+      <code>NTEventLogAppender</code>?</a>
+           </div>
+                      
+	<p>The NT Event Viewer relies on <i>message resource</i> DLLs
+	to properly view an event message.  The NTEventLogAppender.dll
+	contains these message resources, but that DLL must be copied
+	to %SYSTEMROOT%\SYSTEM32 for it to work properly.
+	</p>
+      
+                                 <div class="question">
+             <a name="2.11">2.11 Why can't I map my logger names to the loggers that
+      appear in the NT Event Log when I use the
+      NTEventLogAppender?</a>
+           </div>
+                      
+																				
+	<p>Unfotunately, the logger names are hardcoded within the
+	message resource DLL (see previous question about
+	NTEventLogAppender), so there isn't any easy way to override
+	those dynamically... in fact, I don't think it's possible to
+	do it, as you'd have to modify the DLL resources for every
+	application. Since most native applications don't use the
+	Logger column anyway...
+	</p>
+      
+                                 <div class="question">
+             <a name="2.12">2.12 Are there suggested approaches for logging in JSP pages?</a>
+           </div>
+                      
+        <p>
+        The suggested approach depends on your design requirements.  If you or
+        your organization has no constraints on the use of Java in JSP pages,
+        simply use log4j normally in <code>&lt;% ... %&gt;</code> statements
+        as indicated in the Short Manual and the rest of the documentation.
+        </p>
+        <p>
+        However, if your design calls for a minimum amount of Java in your JSP
+        pages, consider using the
+        <a href="http://jakarta.apache.org/taglibs/doc/log-doc/intro.html">Log Taglib</a>
+        from the Jakarta Taglibs project.  It provides logging JSP tags that invoke
+        log4j.
+        </p>
+      
+                              <div class="faqSection">
+        <a name="3">Section 3.</a> Advanced questions
+      </div>
+                                       
+      <p>This section contains answers to more advanced questions about log4j.</p>
+    
+                                 <div class="question">
+             <a name="3.1">3.1 Can the outputs of multiple client request go to
+      different log files?</a>
+           </div>
+                      
+	
+	<p>Many developers are confronted with the problem of
+	distinguishing the log output originating from the same class
+	but different client requests. They come up with ingenious
+	mechanisms to fan out the log output to different files. In
+	most cases, this is not the right approach.
+	</p>
+
+	<p>It is simpler to use a nested diagnostic context
+	(NDC). Typically, one would <em>NDC.push()</em> client
+	specific information, such as the client's hostname, ID or any
+	other distinguishing information when starting to handle the
+	client's request. Thereafter, log output will automatically
+	include the nested diagnostic context so that you can
+	distinguish logs from different client requests even if they
+	are output to the same file.
+	</p>
+
+	<p>See the <code>NDC</code> and the <code>PatternLayout</code>
+	classes for more information. The <code>NumberCruncher</code>
+	example shows how the NDC can be used to distinguish the log
+	output from multiple clients even if they share the same log
+	file.
+	</p>
+
+	<p>For select applications, such as virtual hosting
+	web-servers, the NDC solution is not sufficient. As of version
+	0.9.0, log4j supports multiple hierarchy trees. Thus, it is
+	possible to log to different targets from the same logger
+	depending on the current context.
+	</p>
 
-<p>You may choose to name loggers by functionality and
-subcategorize by locality, as in "DATABASE.com.foo.some.package.someClass" or
-"DATABASE.com.foo.some.other.package.someOtherClass".
+      
+                                 <div class="question">
+             <a name="3.2">3.2 Logger instances seem to be create only. Why isn't
+      there a method to remove logger instances?</a>
+           </div>
+                      
+	<p>It is quite nontrivial to define the semantics of a
+	"removed" logger escecially if it is still referenced by the
+	user. Future releases <em>may</em> include a remove method in
+	the Logger class.</p>
+      
+                                 <div class="question">
+             <a name="3.3">3.3 How do I get multiple process to log to the same file?</a>
+           </div>
+                      
+	<p>You may have each process log to a 
+	<a href="api/org/apache/log4j/net/SocketAppender.html"><code>SocketAppender</code></a>.  
+	The receiving 
+	<a href="api/org/apache/log4j/net/SocketServer.html"><code>SocketServer</code></a>  
+	(or 
+	<a href="api/org/apache/log4j/net/SimpleSocketServer.html"><code>SimpleSocketServer</code></a>)
+	can receive all the events and send them to a single
+	log file.
+	</p>
+      
+                                 <div class="question">
+             <a name="3.4">3.4 How about the timesamps of events generated by multiple
+      processes across multiple hosts (possibly across multiple
+      timezones)?
+      </a>
+           </div>
+                      
+	
+	<p>The timestamp is created when the logging event is created.
+	That is so say, when the <code>debug</code>,
+	<code>info</code>, <code>warn</code>, <code>error</code> or
+	<code>fatal</code> method is invoked.  Thus, the timestamp is
+	unaffected by the time at which event arrive at a remote
+	socket server.  
+	</p>
+	
+	<p>Timestamps are stored in UTC format inside the
+	event. Consequently, when displayed or written to a log file,
+	timestamps appear in the same timezone as the host displaying
+	or creating the logfile.  Note that because the clocks of
+	various machines may not be synchronized, there may be
+	timestamp inconsistencies between events generated on
+	different hosts.
+	</p>
+      
+                                 <div class="question">
+             <a name="3.5">3.5 Why can't log4j find my properties file in a J2EE or WAR
+      application?</a>
+           </div>
+                      
+
+	<p>The short answer: the log4j classes and the properties file
+	are not within the scope of the same classloader.
+	</p>
+
+	<p>The long answer (and what to do about it): J2EE or Servlet
+	containers utilize Java's class loading system.  Sun changed
+	the way classloading works with the release of Java 2.  In
+	Java 2, classloaders are arranged in a hierarchial
+	parent-child relationship.  When a child classloader needs to
+	find a class or a resource, it first delegates the request to
+	the parent.
+	</p>
+
+	<p>Log4j only uses the default <code>Class.forName()</code>
+	mechanism for loading classes.  Resources are handled
+	similarly.  See the documentation for
+	<code>java.lang.ClassLoader</code> for more details.
+	</p>
+
+	<p>So, if you're having problems, try loading the class or
+	resource yourself.  If you can't find it, neither will
+	log4j. ;)
+	</p>
 
-<p><em>You are totally free in choosing the names of your
-loggers.</em> The log4j package merely allows you to manage your
-names in a hierarchy.  However, it is your responsibility to define
-this hierarchy.
+      
+                                 <div class="question">
+             <a name="3.6">3.6 Is there a way to get log4j to automatically reload a
+      configuration file if it changes?</a>
+           </div>
+                      
+	<p>Yes.  Both the DOMConfigurator and the PropertyConfigurator support
+	automatic reloading through the <code>configureAndWatch</code> method.
+	See the API documentation for more details.
+	</p>
+
+
+	<p>Because the <code>configureAndWatch</code> launches a
+	separate wathdog thread, and because there is no way to stop
+	this thread in log4j 1.2, the <code>configureAndWatch</code>
+	method is unsafe for use in J2EE envrironments where
+	applications are recycled.
+	</p>
+	
+      
+                              <div class="faqSection">
+        <a name="4">Section 4.</a> Contributing to the project
+      </div>
+                                       
+      <p>This section includes questions about contributing to the
+      project</p>
+    
+                                 <div class="question">
+             <a name="4.1">4.1 Why should I donate my extensions to log4j back to the
+      project?
+      </a>
+           </div>
+                      
+	<p>Contrary to the GNU Public License (GPL) the Apache
+	Software License does not make any claims over your
+	extensions. By extensions, we mean totally new code that
+	invokes existing log4j classes. <em>You are free to do
+	whatever you wish with your proprietary log4j extensions.</em>
+	In particular, you may choose to never release your extensions
+	to the wider public.
+	</p>
+	
+	<p>We are very careful not to change the log4j client API so
+	that newer log4j releases are backward compatible with
+	previous versions. We are a lot less scrupulous with the
+	internal log4j API. Thus, if your extension is designed to
+	work with log4j version <code>n</code>, then when log4j
+	release version <code>n+1</code> comes out, you will probably
+	need to adapt your proprietary extensions to the new release.
+	</p>
+
+	<p>Thus, you will be forced to spend precious resources in
+	order to keep up with log4j changes. This is commonly referred
+	to as the "stupid-tax."  By donating the code and making it
+	part of the standard distribution, you save yourself the
+	unnecessary maintenance work.
+	</p>
+
+	<p>If your extensions are useful then someone will eventually
+	write an extension providing the same or very similar
+	functionality.  Your development effort will be wasted. Unless
+	the proprietary log4j extension is business critical, there is
+	little reason for not donating your extensions back to the
+	project.
+	</p>
+      
+                                 <div class="question">
+             <a name="4.2">4.2 What should I keep in mind when contributing code?</a>
+           </div>
+                      
+	<ol>
+
+	  <li>
+	    <p>Write a test case for your contribution.</p>
+
+	    <p>There is nothing more irritating than finding the bugs
+	    in debugging (i.e. logging) code. Writing a test case
+	    takes some effort but is crucial for a widely used library
+	    such as log4j. Writing a test case will go a long way in
+	    earning you the respect of fellow developers. See the
+	    tests/ directory for exiting test cases.
+	    </p>
+	  </li>
+
+	  
+	  <li>
+	    <p>Stick to the existing indentation style even if you hate it.</p>
+	    
+	    <p>Alternating between indentation styles makes it hard to
+	    understand the source code. Make it a little harder on
+	    yourself but easier on others.
+	    </p>
+
+	    <p>Log4j has adopted a rather conservative approach by
+	    following the <a href="http://java.sun.com/docs/codeconv/">Code Conventions
+	    for the JavaTM Programming Language</a>. <b>We use 2 (two)
+	    spaces for indentation and no tabs.</b>
+	    </p>
+	  </li>
+
+	  <li>
+	    <p>Please do not both modify the code and change the
+	    indentation in a single commit.</p>
+	    
+	    <p>If you change the code and reformat it at the same time
+	    and then commit, the commit notification message will be
+	    hard to read. It will contain many diffs associated with
+	    the reformatting in addition to logical changes.
+	    </p>
+
+	    <p>If you must reformat and change the code, then perform
+	    each step separately. For example, reformat the code and
+	    commit. Following that, you can change the logic and
+	    commit. The two steps can be performed in the reverse
+	    order just as well. You can first change the logic and
+	    commit and only later reformat and commit.
+	    </p>
+
+	  </li>
+	  <li>
+	    <p>Make every effort to stick to the JDK 1.1 API.</p>
+	    
+	    <p>One of the important advantages of log4j is its
+	    compatibility with JDK 1.1.x.
+	    </p>
+	  </li>
+
+	  <li>
+	    <p>Always keep it simple, small and fast when
+	    possible.</p>
+
+	    <p>It's all about the application not about logging.</p>
+	  </li>
+	  
+	  <li>
+	    <p>Identify yourself as a contributor at the top of the
+	    relevant file.
+	    </p>
+	  </li>
+	  <li>
+	    <p>Take responsibility for your code.</p>
+	    
+	    <p>Authoring software is very much like running a marathon. It
+	    takes time and endurance.
+	    </p>
+	  </li>
+	  <li>
+	    <p>Did we mention sticking with the indentation style? </p>
+	  </li>
+	  <li><p>Did we mention writing test cases? </p>
+	  </li>
+	  
+	</ol>
+      
+                                 <div class="question">
+             <a name="4.3">4.3 How can I contribute a new question/answer to this
+      document?</a>
+           </div>
+                      
+	<p>Log4j uses <a href="http://jakarta.apache.org/velocity/anakia.html">velocity-anakia</a>
+	to generate its web-site, including this FAQ. We have devised
+	special macros to help us automatically generate labeled
+	question/answer pairs.
+	</p>
+
+	<p>If you are not a commiter, you can simply submit your new
+	question/answer pair to the log4j-dev@logging.apache.org
+	mailing list. The committers will take it from there.
+	</p>
+
+	<p>If you are a committer, then you must edit the
+	<em>/src/xdocs/faq.xml</em> file. The format of the file
+	should be self-evident. After you have made your changes, run
+	the command
+	</p>
+	<pre class="source">ant site</pre>
+
+	<p>After the appropriate transformation, your changes should
+	appear in the file <em>/docs/faq.html</em>.
+	</p>
+      
+                                                                
+
+             
+                <!-- FOOTER -->
+              <div align="center"><font color="#525D76" size="-1"><em>
+                 Copyright &#169; 1999-2005, Apache Software Foundation
+               </em></font></div>
+
+           <!-- END main table --> 
+
+           <!-- LEFT SIDE NAVIGATION -->
+             <!-- ============================================================ -->
+  <div class="leftcol">
+               <div class="menu_header">Log4j Project</div>
+              	 <div class="menu_item">        <a href="./index.html">Introduction</a>
+  </div>
+              	 <div class="menu_item">        <a href="./download.html">Download</a>
+  </div>
+              	 <div class="menu_item">        <a href="./documentation.html">Documentation</a>
+  </div>
+              	 <div class="menu_item">        <a href="./contactUs.html">Contact us</a>
+  </div>
+              	 <div class="menu_item">        <a href="./contributors.html">Contributors</a>
+  </div>
+              	 <div class="menu_item">        <a href="./chainsaw.html">Chainsaw</a>
+  </div>
+              	 <div class="menu_item">        <a href="./history.html">History</a>
+  </div>
+                  <div class="menu_header">Support</div>
+              	 <div class="menu_item">        <a href="http://logging.apache.org/site/binindex.cgi">Binary distributions</a>
+  </div>
+              	 <div class="menu_item">        <a href="http://logging.apache.org/site/cvs-repositories.html">CVS Repositories</a>
+  </div>
+              	 <div class="menu_item">        <a href="http://logging.apache.org/site/mailing-lists.html">Mailing Lists</a>
+  </div>
+              	 <div class="menu_item">        <a href="http://logging.apache.org/site/bugreport.html">Bug Reporting</a>
+  </div>
+                  <div class="menu_header">Related Projects</div>
+              	 <div class="menu_item">        <a href="http://www.slf4j.org">SLF4J</a>
+  </div>
+                  <div class="menu_header">Translations</div>
+              	 <div class="menu_item">        <a href="http://jakarta.apache-korea.org/log4j/index.html">Korean</a>
+  </div>
+              	 <div class="menu_item">        <a href="http://www.ingrid.org/jajakarta/log4j/">Japanese</a>
+  </div>
+             </div> 
+   
 
-<p>Note by naming loggers by locality one tends to name things by
-functionality, since in most cases the locality relates closely to
-functionality. 
+        </body>
+    </html>
+<!-- end the processing -->
 
-<a name=className><h4>How do I get the fully-qualified name of a class
-in a static block?</a></h4>
 
-<p>You can easily retrieve the fully-qualified name of a class in a
-static block for class X, with the statement
-<code>X.class.getName()</code>. Note that <code>X</code> is the class
-name and not an instance.  The <code>X.class</code> statement does
-<i>not</i> create a new instance of class <code>X</code>.
 
-<p>Here is the suggested usage template:
 
-<font color=BLUE><pre>
-package a.b.c;
 
-public class Foo {
-  static Logger logger = Logger.getLogger(Foo.class);
-  ... other code
 
-}
-</pre></font>
-
-<a name=customLayouts><h4>Can the log output format be customized?</h4>
-
-<p>Yes. Since release 0.7.0, you can extend the <code>Layout</code>
-class to create you own customized log format. Appenders can be
-parameterized to use the layout of your choice.
-
-<a name=NDC><h4>Can the outputs of multiple client request go to
-different log files?</h4>
-
-Many developers are confronted with the problem of distinguishing the
-log output originating from the same class but different client
-requests. They come up with ingenious mechanisms to fan out the log
-output to different files. In most cases, this is not the right
-approach.
-
-<p>It is simpler to use a nested diagnostic context (NDC). Typically,
-one would <em>NDC.push()</em> client specific information, such as the
-client's hostname, ID or any other distinguishing information when
-starting to handle the client's request. Thereafter, log output will
-automatically include the nested diagnostic context so that you can
-distinguish logs from different client requests even if they are
-output to the same file.
-
-<p>See the <code>NDC</code> and the <code>PatternLayout</code> classes
-for more information. The <code>NumberCruncher</code> example shows
-how the NDC can be used to distinguish the log output from multiple
-clients even if they share the same log file.
-
-<p>For select applications, such as virtual hosting web-servers, the
-NDC solution is not sufficient. As of version 0.9.0, log4j supports
-multiple hierarchy trees. Thus, it is possible to log to different
-targets from the same logger depending on the current context.
-
-<p><a name="#options"><h4>What are the configurable options for
-FooBarAppender?</h4>
-
-Log4j uses JavaBeans style configuration. 
-
-<p>Thus, any setter method in <code>FooBarAppender</code> corresponds
-to a configurable option. For example, in <a
-href="api\org\apache\log4j\RollingFileAppender.html">RollingFileAppender</a>
-the <a
-href="api/org/apache/log4j/RollingFileAppender.html#setMaxBackupIndex(int)">setMaxBackupIndex(int
-maxBackups)</a> method corresponds to the <code>maxBackupIndex</code>
-option. The first letter of the option can be upper case, i.e.
-<code>MaxBackupIndex</code> and <code>maxBackupIndex</code> are
-equivalent but not <code>MAXBACKUPIndex</code> nor
-<code>mAXBackupIndex</code>.
-
-<p>Layouts options are also defined by their setter methods. Same goes
-for most other log4j components.
-
-<!-- ------------------------------------------------------------------ -->
-
-<p><a name=rm><h4>Logger instances seem to be create only. Why isn't
-there a method to remove logger instances?</h4>
-
-It is quite nontrivial to define the semantics of a "removed" logger
-which is still referenced by the user. Future releases <em>may</em>
-include a remove method in the Logger class.
-
-<a name=filterByLevel><h4>Is it possible to direct log output to
-different appenders by level?</h4>
-
-<p>Yes it is. Setting the <b>Threshold</b> option of any appender
-extending <a
-href="api/org/apache/log4j/AppenderSkeleton.html">AppenderSkeleton</a>,
-(most log4j appenders extend AppenderSkeleton) to filter out all log
-events with <em>lower</em> level than the value of the threshold
-option. 
-
-<p>For example, setting the threshold of an appender to DEBUG also
-allow INFO, WARN, ERROR and FATAL messages to log along with DEBUG
-messages. This is usually acceptable as there is little use for DEBUG
-messages without the surrounding INFO, WARN, ERROR and FATAL
-messages. Similarly, setting the threshold of an appender to ERROR
-will filter out DEBUG, INFO and WARN messages but not ERROR or FATAL
-messages.
-
-<p>This policy usually best encapsulates what the user actually wants
-to do, as opposed to her mind-projected solution.
-
-<p>See <a
-href="api/org/apache/log4j/examples/doc-files/sort4.lcf">sort4.lcf</a>
-for an example threshold configuration.
-
-<p>If you must filter events by exact level match, then you can
-attach a <a
-href="api/org/apache/log4j/varia/LevelMatchFilter.html">LevelMatchFilter</a>
-to any appender to filter out logging events by exact level match.
-
-
-<p><a name=many21><h4>How do I get multiple process to log to the same file?</h4></a>
-
-<p>You may have each process log to a 
-<a href="api/org/apache/log4j/net/SocketAppender.html"><code>SocketAppender</code></a>.  
-The receiving 
-<a href="api/org/apache/log4j/net/SocketServer.html"><code>SocketServer</code></a>  
-(or 
-<a href="api/org/apache/log4j/net/SimpleSocketServer.html"><code>SimpleSocketServer</code></a>)
-can receive all the events and send them to a single
-log file.
-
-<p><a name=timestamp><h4>If I have many processes across multiple hosts
-(possibly across multiple timezones) logging to the same file using the
-method above, what happens to timestamps?</h4>
-
-<p>The timestamp is created when the logging event is created.  That is
-so say, when the <code>debug</code>, <code>info</code>, <code>warn</code>, 
-<code>error</code> or <code>fatal</code> method is invoked.
-This is unaffected by the time at which they may arrive at a remote
-socket server.  Since the timestamps are stored in UTC format inside
-the event, they all appear in the same timezone as the host creating the
-logfile.  Since the clocks of various machines may not be synchronized,
-this may account for time interval inconsistencies between events generated 
-on different hosts.
-
-<p>While this is the intended behavior, it only recently became so due to
-a bug discovery between version 1.0.4 and 1.1b1.  Versions 1.0.4 and before
-had their timestamp regenerated in the converter.  In this case the timestamps
-seen in the log file would all appear in order, generated at the time they
-arrived at the log server host according to its local clock.
-
-<p><a name=j2ee><h4>Why can't Log4J find my properties file in a J2EE
-or WAR application?</h4>
-
-The short answer: the Log4J classes and the properties file are not
-within the scope of the same classloader.<P>
-
-The long answer (and what to do about it): J2EE or Servlet containers
-utilize Java's class loading system.  Sun changed the way classloading
-works with the release of Java 2.  In Java 2, classloaders are
-arranged in a hierarchial parent-child relationship.  When a child
-classloader needs to find a class or a resource, it first delegates
-the request to the parent. 
-
-<P>Log4J only uses the default <CODE>Class.forName()</code> mechanism
-for loading classes.  Resources are handled similarly.  See the
-documentation for <CODE>java.lang.ClassLoader</CODE> for more details.
-
-<P>So, if you're having problems, try loading the class or resource
-yourself.  If you can't find it, neither will Log4J. ;)
-
-<P><A NAME=configureandwatch><H4>Is there a way to get Log4J to
-automatically reload a configuration file if it changes?</H4>
-
-<P>Yes.  Both the DOMConfigurator and the PropertyConfigurator support
-automatic reloading through the <CODE>configureAndWatch</CODE> APIs.
-See the API documentation for more details.
-
-<P><A NAME=nteventlogproblems><H4>What does the Windows NT Event
-Viewer complain about missing descriptions for my event messages when
-I use the NTEventLogAppender?</H4>
-
-<P>The NT Event Viewer relies on <I>message resource</I> DLLs to
-properly view an event message.  The NTEventLogAppender.dll contains
-these message resources, but that DLL must be copied to
-%SYSTEMROOT%\SYSTEM32 for it to work properly.
-
-																						
-<P><A NAME=morenteventlogproblems><H4>Why can't I map my logger names
-to the loggers that appear in the NT Event Log when I use the
-NTEventLogAppender?</H4>
-
-<P>Unfotunately, the logger names are hardcoded within the message
-resource DLL (see previous question about NTEventLogAppender), so
-there isn't any easy way to override those dynamically... in fact, I
-don't think it's possible to do it, as you'd have to modify the DLL
-resources for every application. Since most native applications don't
-use the Logger column anyway...
-
-<p><a name=tax><h4>Why should I donate my extensions to log4j back to the
-project?</h4>
-
-Contrary to the GNU Public License (GPL) the Apache Software License
-does not make any claims over your extensions. By extensions, we mean
-totally new code that invokes existing log4j classes. <em>You are free
-to do whatever you wish with your proprietary log4j extensions.</em>
-In particular, you may choose to never release your extensions to the
-wider public.
-
-<p>We are very careful not to change the log4j client API so that
-newer log4j releases are backward compatible with previous
-versions. We are a lot less scrupulous with the internal log4j
-API. Thus, if your extension is designed to work with log4j version
-<code>n</code>, then when log4j release version <code>n+1</code> comes
-out, you will probably need to adapt your proprietary extensions to
-the new release.
-
-Thus, you will be forced to spend precious resources in order to keep
-up with log4j changes. This is commonly referred to as the
-"stupid-tax."  By donating the code and making it part of the standard
-distribution, you save yourself the unnecessary maintenance work.
-
-<p>If your extensions are useful then someone will eventually write an
-extension providing the same or very similar functionality.  Your
-development effort will be wasted. Unless the proprietary log4j
-extension is business critical, there is little reason for not
-donating your extensions back to the project.
-
-<a name=help><h4>What should I keep in mind when contributing
-code?</h4>
-
-<ol>
-
-  <li><b>Write a test case for your contribution.</b>
-   
-    <p>There is nothing more irritating than finding the bugs in
-    debugging (i.e. logging) code. Writing a test case takes some
-    effort but is crucial for a widely used library such as
-    log4j. Writing a test case will go a long way in earning you the
-    respect of fellow developers. See the tests/ directory for exiting
-    test cases.
 
-  </li>
 
 
-  <p><li>Stick to the existing indentation style even if you hate it.
 
-      <p>Alternating between indentation styles makes it hard to
-      understand the source code. Make it hard on yourself but easier
-      on others. Log4j follows the <a
-      href=http://java.sun.com/docs/codeconv/>Code Conventions for
-      the JavaTM Programming Language</a>.
 
-  <p><li>Make every effort to stick to the JDK 1.1 API.
 
-     <p>One of the important advantages of log4j is its compatibility with 
-     JDK 1.1.x. 
-      
-   <p><li>Keep it simple, small and fast.
 
-       <p>It's all about the application not about logging.
 
-    <p><li>Identify yourself as the contributor at the top of the
-	relevant file. 
 
-    <p><li>Take responsibility for your code.
-	
-	<p>Authoring software is like parenting. It takes many
-	years to raise a child. 
 
-    <p><li>Did I mention sticking with the indentation style? 
 
-    <p><li>Did I mention writing test cases? 
-	
-</ol>
 
-<a name=download><h4>Where can I find the latest distribution of log4j?</h4>
 
-<p>The log4j project is hosted at <a
-href="http://jakarta.apache.org/log4j/">http://jakarta.apache.org/log4j/</a>.
-<p>
-<hr>
 
 
-</body> </html>
diff --git a/docs/HISTORY b/docs/HISTORY.txt
similarity index 91%
rename from docs/HISTORY
rename to docs/HISTORY.txt
index d20fba1..620e09f 100644
--- a/docs/HISTORY
+++ b/docs/HISTORY.txt
@@ -5,7 +5,170 @@
        client code. 
  [***] Changes requiring important modifications to existing client code.
 
- April, 2002
+
+ April 28th, 2005
+
+ - Release of version 1.2.10
+
+ - Added support for the SLF4J project. The Logger class now
+   implements the ULogger interface defined by the SLF4J. See
+   
+    http://www.slf4j.org
+   
+   for more detailed information.
+
+ - Fixed bug #34491 whereby the class o.a.log4j.or.jms.MessageRenderer
+   would not be compiled in the build.jms target. Bug reported by Andy
+   McBride.
+  
+ http://issues.apache.org/bugzilla/show_bug.cgi?id=34491
+
+ November 1st, 2004
+
+ - Release of version 1.2.9
+
+  Log4j version 1.2.9, is identical to version 1.2.8, except that
+  several key methods have been deprecated in preparation for version
+  1.3.0, the next major release of log4j. These changes are intended to
+  enforce the rule that client code should never refer to the Category
+  class directly, but use the Logger class instead. Similarly, client
+  code should not refer to the Priority class but to the Level class
+  instead.
+
+  For a more detailed discussion, refer to the document entitled
+  preparing for log4j 1.3 at:
+
+    http://www.qos.ch/logging/preparingFor13.jsp
+
+ February 19th, 2003
+ 
+ - Release of version 1.2.8
+
+ - Fixed bug #11570 whereby XMLAppender would throw a
+   NullPointerException if the input message was null. Many thanks to
+   David Vandegrift for reporting the bug and to Hendrik Brummermann for
+   supplying the patch. [*]
+
+ - Fixed bug #12366 whereby various versions of Xerces would not parse
+   log4j configuration scripts expressed in XML format. [*]
+   
+ - Fixed bug #14827. The "removes" buffer used in the flushBuffer() method
+   of JDBCAppender is now cleared, solving the memory leak.  Thanks to John
+   Landers for reporting the bug and suggesting the fix. [*]
+
+ - Fixed bug #15599. SocketAppender now honors ReconnectionDelay of 0.
+   Many thanks to Scott Schram for reporting the bug and providing the fix. [*]
+
+ October 9th, 2002
+
+ - Release of version 1.2.7
+
+ - Log4j now searches for the file log4j.xml as well as the file
+   log4j.properties during log4j initialization. [*]
+
+ July 31st, 2002
+
+ - Release of version 1.2.6
+
+ - Addition of new options in JMSAppender and new command line arguments in 
+   JMSSink. [*]
+
+ - Added new method getLoggerName() in LoggingEvent class. The
+   getLoggerName is the preferred way for accessing the logger
+   name. The public access categoryName field should not be accessed
+   directly. Similarly, added the getLevel method which is now the
+   preferred way of accessing the event's level. The public access
+   level field should not be accessed directly.  The javadocs now mark
+   the categoryName and level fields as deprecated.
+
+   Modified existing appenders to comply with these new directives. [*]
+
+ - Log4j now will check if a system property named "log4j.ignoreTCL"
+   is set. If it is set, then it will ignore the Thread Context
+   ClassLoader when loading classes. This solves the irritating
+   "appender is not assignable to Appender" messages observed when
+   log4j.jar is loaded by multiple class loaders. 
+
+   The error reporting for this problem was also improved. [*]
+
+ - Fixed bug #10528 whereby calling the MDC.get method with a null
+   argument would throw a NullPointerException. [*]
+
+ July 5th, 2002
+ 
+ - Release of version 1.2.5
+	
+ - Minor changes and bug fixes in LF5. [*]
+ 
+ - Calling an AsyncAppender close method also closes the embedded
+   appender instances. This resolves bug #10185 submitted by Paul
+   Voutier. [*]
+
+ June 12th, 2002
+
+ - Release of version 1.2.4
+
+ - The JDBCAppender is marked as slated for replacement. Do not build
+   critical software using it. 
+
+ - Added LF5 documentation and examples. Further tests are required
+   for full integration. [*]
+
+ - XMLLayout can now output messages which contain embedded CDATA
+   sections. This resolves bug #9750. Many thanks to Michael
+   A. McAngus for supplying the relevant patch. [*]
+
+ - The dispatcher thread associated with AsyncAppender is now marked
+   as a deamon thread. This resolves bug #9750. [*]
+
+ - Added missing NTEventLogAppender.dll as reported in bug #9606. [*]
+
+ - In response to bug report 9435, the log4j.dtd was changed so that
+   <log4j:event> is now made of logger and level attributes instead of
+   category and priority. Changed XMLLayout to conform to the
+   DTD. Chainsaw was changed to adapt to the XMLLayout. [*]
+
+ - Added missing LevelRangeFilter file. [*]
+
+ May 24th, 2002
+
+ - Release of version 1.2.3
+
+ - Fixed bug #9285 where the SyslogAppender would incorrectly compute
+   the length of the datagram to send to the remote syslogd host.
+   Reported by Mamoru Kadota. [*]
+
+ - Fixed bug #8505 where the stack trace of exception would not be
+   properly printed on the Compaq tru64 Unix platform. Initially
+   reported by Fabrice Claes and later by Espen H. Kolstad who also
+   provided the fix. [*]
+
+ May 22nd, 2002
+
+ - Release of version 1.2.2
+
+ - Log4j configurators take the "NULL" string value as a synonym for
+   "INHERITED". Both of these two strings are legal level values for
+   setting the level of a logger. Both values are case insensitive. [*]
+
+ - When loading component classes, log4j will now first attempt to use
+   the Thread Context Loader and if that fails, it will use
+   Class.forName. In log4j 1.2 and 1.2.1, only Class.forName was used
+   and the TCL was ignored. This change is a response to bug #9305
+   opened by Scott M. Stark. [*]
+
+ May 17th, 2002
+
+ - Release of version 1.2.1
+
+ - This minor release fixes bug #9155 reported by Nicko Cadell.
+   LoggingEvent.getMDCCopy() method now sets mdcCopyLookupRequired
+   instead of ndcLookupRequired.  This bug would cause the wrong MDC
+   information to appear on a log server. It could only occur if the
+   client wrapped an AsyncAppender around a SocketAppender or if the
+   server used an AsyncAppender for its logging. [*]
+
+ May, 2002
  
  - Release of version 1.2 
 
diff --git a/docs/critique.html b/docs/critique.html
deleted file mode 100644
index 55c2d70..0000000
--- a/docs/critique.html
+++ /dev/null
@@ -1,294 +0,0 @@
-<HTML>
-<document>
-
-<HEAD>
-<title>JSR47 vs. log4j</title>
-</HEAD>
-
-<body>
-
-<CENTER>
-<H1>JSR47 vs. log4j</H1>
-</CENTER>
- 
-<hr>
-<p>I consider it quite distasteful to criticize other people's work,
-especially in public. However, since the logging API included in JDK
-1.4 will be considered by many as the "standard", I feel compelled to
-react. I am not alone in my criticism of JSR47, Greg Davis has his own
-set of <a
-href="http://www.swzoo.org/documents/miscellaneous/jsr047/">comments</a>. 
-
-<p>The JDK 1.4 logging API is a result of the <a
-href="http://jcp.org/aboutJava/communityprocess/review/jsr047/index.html">JSR47
-effort</a>, led by Graham Hamilton.
-
-<p>Before delving into the details, some historical perspective is in
-order. I am the founder of the log4j project. I participated in the
-specification of the JSR47 API, although not as an expert. In 1999, I
-was still working for IBM and could not join the experts group because
-big blue had already Chris Barlock as a member in the JSR47 experts
-group. Chris is the author of <a
-href="http://www.alphaworks.ibm.com/tech/loggingtoolkit4j">IBM's
-logging toolkit for Java</a>.
-
-<p>On the surface, his toolkit has heavily influenced the JSR47
-API. In particular, the two share the same basic components, namely
-loggers, levels, handlers and formatters. In log4j, these components
-are called categories, priorities, appenders and layouts
-respectively. Pairwise, they are identical in purpose. As such, the
-terms logger and category, level and priority, handler and appender,
-formatter and layout will be used interchangeably in the remainder of
-this document.
-
-<p>Even after a casual review it should be apparent that the log4j and
-JSR47 APIs are <em>very</em> similar. For one, they are the only
-logging APIs which are based on a named hierarchy. If you understand
-one API, then understanding the concepts of the other should be a
-breeze. There are differences however.
-
-<h2>On Parents and  Children</h2>
-
-<p>In JSR47, a parent logger knows about its children but not the
-other way around. Children do not have links to their parent. For
-example, the logger named <code>"foo"</code> knows about
-<code>"foo.bar1"</code> and <code>"foo.bar2"</code>. However,
-<code>"foo.bar1"</code> has no links to its parent <code>"foo"</code>.
-
-<p>In log4j, it is exactly the other way around. A log4j category
-contains a link to its parent but a parent does not have links to its
-children.
-
-<p>At first glance, this might look like a mundane implementation
-detail but it is actually quite fundamental.
-
-<ol>
-<p><b><li>Configuration order matters</b>
-
-<p>In JSR47, when you set the level of a logger, say
-<code>wombat</code>, JSR47 traverses the tree below
-<code>wombat</code>. In other words, the levels for all the loggers
-descending from <code>wombat</code> are overwritten. This can be a
-very expensive operation for large trees. In particular, for the most
-common case where one sets the level of the root logger. However,
-performance is not the point I am trying to make.
-
-<p>In log4j, changing the priority of a category involves the change
-of a single field. Children categories dynamically inherit the
-priority of their parent by traversing the hierarchy tree upwards.
-
-<p>It follows that with JSR47 if you configure the level for logger
-"foo.bar1" before configuring the level for "foo", then the latter
-instruction will overwrite the first exactly as if the first
-instruction for configuring "foo.bar1" had never
-existed. <em>Configuration order dependence is not a show stopper but
-it is something that will bite you time and again.</em>
-
-<p>In contrast, in log4j categories can be configured in any
-order. You never have to worry about configuration order.
-
-<p><b><li>Limited inheritance</b>
-
-<p>In JSR47, a logger does not walk the hierarchy to inherit its level
-but possesses a copy of it. 
-
-<p>Unfortunately, in the JSR47 API, handlers cannot be inherited
-because it would be prohibitively expensive to let each logger to
-contain a distinct Vector of all inherited handlers, especially in
-large trees.
-
-<p>To circumvent this problem by JSR47 defines global handlers. A
-logger logs to global handlers and to the handlers attached to itself
-directly. <em>It does not inherit any handlers from the
-hierarchy.</em>
-
-<p>In log4j, appenders are inherited additively from the hierarchy. A
-category will log to the appenders attached to itself as well as the
-appenders attached to its ancestors. This might not seem like much
-until the day you need handler inheritance; probably a week after you
-decide to adopt a logging API.
-
-<p>Similarly, in log4j resource bundles are inherited from the
-hierarchy. In JSR47, a resource bundle <em>must</em> be attached to
-each logger individually. There is no resource bundle inheritance in
-JSR47. In practice, this means that you have to choose between
-internationalization and the benefits of the named logger
-hierarchy. It's one or the other. This limitation is particularly
-surprising because support for internationalization is advocated as
-one of the primary advantages of the JSR47 API.
-
-</ol>
-
-<h2>Bogus Levels</h2>
-
-<p>JSR 47 defines the levels <code>ALL</code>, <code>SEVERE</code>,
-<code>WARNING</code>, <code>INFO</code>, <code>CONFIG</code>,
-<code>FINE</code>, <code>FINER</code>, <code>FINEST</code> and
-<code>OFF</code>. Experience shows that the levels <code>ALL</code>
-and <code>OFF</code> are never needed. The <code>SEVERE</code> and
-<code>CONFIG</code> levels are unique to JSR47.
-
-<p>Having three debugging levels <code>FINE</code>,
-<code>FINER</code>, <code>FINEST</code> could seem like a good
-idea. However, you will soon discover that even when by yourself, it
-is hard to decide when to use which level. It is plain impossible in
-groups.
-
-<p>Log4j in contrast has a limited but self-evident set of priorities:
-<code>FATAL</code>, <code>ERROR</code>, <code>WARN</code>,
-<code>INFO</code> and <code>DEBUG</code>.
-
-<p>Both JSR47 and log4j allow the user to extend the set of
-priorities. Log4j supports subclasses of priorities in configuration
-files as well as across the wire. JSR47 does not.
-
-<h2>Limited functionality</h2>
-
-<p>Log4j has appenders capable of logging to the console, to files, to
-Unix Syslog daemons, to Microsoft NT EventLoggers, remote servers, to
-JMS channels, automatically generate email etc. It can roll log files
-by size or date and log asynchronously.
-
-<p>JSR47 can log to the console, to files, to sockets and to a memory
-buffer.
-
-<p>Log4j has an extensible and powerful layout called the
-<code>PatternLayout</code>.  JSR47 offers the much weaker
-<code>SimpleFormatter</code> as an alternative.
-
-<p>Log4j supports configuration through property files as well as XML
-documents. JSR47 currently admits only property files. Moreover, the
-language of JSR47 configuration files is very weak. In particular, you
-can only configure one instance of a given handler class. <em>This
-means that you can log to just one file at a time.</em>
-
-<h2>Other differences</h2>
-
-<p>There are many other details in which log4j differs from
-JSR47. Even if the log4j core is small, the project contains a total
-of over 30'000 lines of well-tested code. JSR47 contains about 5'000
-lines of code. 
-
-<p>Log4j has been around for a number of years, enjoys the support of
-five active developers (committers) and is being used in thousands of
-projects. Our site gets over 500 downloads each and every day, and the
-numbers are on the rise.  Log4j has been ported to C++ and
-Python. Companies are also offering commercial products extending
-log4j.
-
-<p>Here is a short list of opensource projects or sites that are known
-to use log4j.
-
-<ul>
-<li><a href="http://www.cryptix.org/products/sasl/">Cryptix</a>
-<li><a href="http://www.jcorporate.com/html/products/expresso/logging.html">Expresso Framework</a>
-<li><a href="http://www.free-project.org/">Free E-Democracy Project</a>
-<li><a href="http://java.freehep.org">FreeHEP</a>
-<li><a href="http://www.jboss.org">JBoss</a>
-
-<li><a href="http://www.opensymphony.com/guidelines/logging.jsp">OpenSymphony</a>
-<li><a href="http://theserverside.com">TheServerSide</a>
-<li><a href="http://jakarta.apache.org/turbine/index.html">Turbine</a>
-<li><a href="http://jakarta.apache.org/velocity/index.html">Velocity</a>
-<li><a href="http://wired2.web.cern.ch/wired2/">WIRED</a>
- 
-</ul>
-
-
-<p>By the way, log4j runs fine under JDK 1.1 and above. JSR 47 will
-run under JDK 1.4 and only under JDK 1.4. Interestingly enough, no
-package shipped with JDK 1.4 is using the JSR47 API.  
-
-<p>Brian R. Gilstrap has <A
-href="http://javalogging.sourceforge.net/">re-written</a> JSR47 API to
-run under JDK 1.2 and 1.3. He has also published an <a
-href="http://www.ociweb.com/jnb/archive/jnbJun2001.html">article</a>
-in JavaWorld. This is all very promising but since
-<code>java.util.logging</code> is under the <code>java.*</code>
-namespace, when running under JDK 1.3, you will systematically
-encounter:
-<pre>
-Exception in thread "main" java.lang.ExceptionInInitializerError: java.lang.SecurityException: Prohibited package name: java.util.logging
-        at java.lang.ClassLoader.defineClass(ClassLoader.java:477)
-        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:111)
-        at java.net.URLClassLoader.defineClass(URLClassLoader.java:248)
-        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
-        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
-        at java.security.AccessController.doPrivileged(Native Method)
-        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
-        at java.lang.ClassLoader.loadClass(ClassLoader.java:297)
-        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:286)
-        at java.lang.ClassLoader.loadClass(ClassLoader.java:253)
-        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
-</pre>
-
-<p>Jochen Hiller had observed this problem in early 2001 when he
-implemented the JSR47 API by wrapping log4j.
-
-<p>Note that any third-party implementation using the
-<code>java.*</code> or <code>javax.*</code> namespaces violates Sun's
-trademark on Java. Without explicit permission from Sun, such software
-remains under the threat of litigation.
-
-<h2>Error Handling</h2>
-
-In JSR 47 when an error occurs then either a
-<code>RunTimeException</code> is thrown to the user or (in handlers
-only) an internal field is set. In the first case, the
-<code>RunTimeException</code> will cause your application to crash. In
-the latter case, you can retrieve the last caught exception in the
-handler by querying the <code>getException</code> method of that
-handler. <em>The former is totally unacceptable while the latter is
-impractical.</em>
-
-<p>In log4j, under no circumstances are exceptions thrown at the
-user. However, all appenders have an associated
-<code>ErrorHandler</code>.  This <code>ErrorHandler</code> is invoked
-by the appender whenever a handler-specific error occurs.  By default,
-log4j appenders are associated with an
-<code>OnlyOnceErrorHandler</code> which emits a message on the console
-for the first error in an appender and ignoring all following errors.
-
-<p>An <code>ErrorHandler</code> can implement an arbitrary error
-handling policy. For example, after a failure to write to a database a
-<code>JDBCAppender</code> can be redirected to fall back on a
-<code>FileAppender</code>. This functionality is supported in XML
-configuration files. You do not need to change a single line of client
-code.
-
-<p>But again who cares about errors, right?
-
-<h2>Performance</h2>
-
-<p>Logging performance must be studied in three distinct cases: when
-logging is turned off, when turned on but due to priority comparison
-logic not enabled, and when actually logging.  Please refer to the <a
-href="manual.html#performance">log4j manual</a> for a more detailed
-discussion of logging performance.
-
-<p>When logging is turned on, log4j will be about two to three times
-slower to decide whether a log statement is enabled or not. This is
-due to the dynamic nature of log4j which requires it to walk the
-hierarchy. To give you an idea about the figures involved, under JDK
-1.4 beta, we are talking about 90 <em>nanoseconds</em> instead of 30
-<em>nanoseconds</em> on a 800Mhz Intel processor. In other words, one
-million disabled logging requests will cost under a second in both
-environments.
-
-<p>In a shipped binary, you can turn off logging entirely and both
-APIs will perform identically.  Note that if one is not careful, the
-cost of parameter construction before invoking a disabled log
-statement will overwhelm any other performance consideration.
-Regardless of the API you decide to use, logging statements should
-never be placed in tight loops, for example, before or after an
-element swap instruction in a sort algorithm.
-
-<p>In log4j, caller localization information is optional whereas in
-JSR47 it is always extracted. Since the extraction of caller
-localization is a very slow operation, in the common case where caller
-information is not needed, log4j will log the same information 4 to
-100 times faster. 
-
-
-</body> 
-</HTML>
diff --git a/docs/deepExtension.html b/docs/deepExtension.html
deleted file mode 100644
index 05e0eb7..0000000
--- a/docs/deepExtension.html
+++ /dev/null
@@ -1,735 +0,0 @@
-<html>
-<head>
-<title>Extending Log4J</title>
-</head>
-
-<body bgcolor="white">
-
-<center>
-<h1>Adding Conversion Characters to PatternLayout</h1>
-
-  "Paul Glezen" 
-
-  January 2001 <br><br>
-</center>
-
-<hr>
-<h2>Abstract</h2>
-
-<p>
-This article describes a systematic way to extend the
-<a href="http://jakarta.apache.org/log4j">log4j</a> API to include
-additional attributes formatted using the
-<code><a href="../docs/api/org/apache/log4j/PatternLayout.html">PatternLayout</a></code> 
-class.
-<p>
-<hr>
-<h2>Contents</h2>
-<ul>
-	<li><a href="#intro">Introduction</a>
-	<ul>
-		<li><a href=#case>The Case Study</a>
-		<li><a href=#peek>A Peek Under the Hood</a>
-	</ul>
-	<li><a href="#process">The Process</a>
-	<ul>
-		<li><a href="#LoggingEvent">Extending <code>LoggingEvent</code></a>
-		<li><a href="#PatternLayout">Extending <code>PatternLayout</code></a>
-		<li><a href="#PatternParser">Extending <code>PatternParser</code> and 
-			<code>PatternConverter</code></a>
-		<li><a href="#Category">Extending <code>Category</code></a>
-		<li><a href="#CategoryFactory">Extending <code>CategoryFactory</code></a>
-	</ul>
-	<li><a href="#usage">Usage</a>
-	<ul>
-		<li><a href="#configurators">Configurators</a>
-	</ul>
-	<li><a href="#enhancements">Further Enhancements</a>
-</ul>
-<p>
-<hr>
-<a name="intro"><h2>Introduction</h2></a>
-
-<p>
-This article assumes familiarity with the log4j
-<a href="manual.html">User Manual</a>.  It builds on fundamental
-classes described in both the User Manual and the
-<a href="api/index.html" target="_top">Javadoc API</a>.  To assist in illustrating the
-concepts, a simple case study will be developed along side the
-explanations.  The resulting classes may be used as a template
-for your own extensions.  Condensed (i.e. statements compressed,
-comments removed) snippets of the case study code
-are included in this document.
-
-<a name="case"><h3>The Case Study</h3></a>
-The case study was developed in a CORBA environment in which the
-following information for each log entry was needed. The letters in
-parenthesis represent the corresponding character to be used by the
-<code><a href="api/org/apache/log4j/PatternLayout.html">PatternLayout</a></code> 
-class for formatting.
-
-<p>
-<ul>
-<li><b>Host Name (h)</b> - the IP address or hostname of the physical machine
-	on which the Category was running.
-<li><b>Server Name (s)</b> - The name of the application server process.  In
-	this context, a <i>server</i> refers to a process that accepts requests
-	rather than referring to a machine.  The term <i>host</i> refers to a
-	physical machine.  Several servers may run on the same host.
-<li><b>Component Name (b)</b> - Rather than getting bogged down on what
-	constitutes a component, let's assume for the case study that a component
-	is a unit of software worth denoting in the logs.
-<li><b>Version (v)</b> - the version of the component from which the log entry
-	originated.
-</ul>
-<p>
-It seems odd to use "b" for the component name.  Presently
-<code><a href="api/org/apache/log4j/PatternLayout.html">PatternLayout</a></code> 
-already defines both "C" and "c" for class name and category name respectively.
-
-<h3><a name="peek">A Peek Under the Hood</a></h3>
-<p>
-In principle, if the steps described below are followed closely, there is 
-not a need to understand how the extended classes will be used by log4j.
-But sometimes software development can be entirely unprincipled.  You may
-wish to extend log4j in a different manner than describe here or you may
-make a mistake that requires knowledge of what is really going on.  (Heaven
-forbid there be a mistake in this document).  In any case, it doesn't hurt
-to get an idea of what's going on.
-<p>
-The following describes a "typical" logging scenario in the un-extended log4j
-case.
-<p>
-<ol>
-<li>Application code invokes a log request on a
-<code><a href="api/org/apache/log4j/Category.html">Category</a></code> 
-object.  Let's say the <code>info</code> method was invoked.
-<p>
-<li>The first thing <code>info</code> does is to check if logging has
-been turned off entirely for the info level.  If so, it returns
-immediately.  We'll assume for this scenario that logging has not
-been turned off for the info level.
-<p>
-<li>Next <code>info</code> compares the
-<code><a href="api/org/apache/log4j/Priority.html">Priority</a></code> 
-level for this category against <code>Priority.INFO</code>.  Assuming
-the priority warrants logging the message, the category instantiates a
-<code><a href="api/org/apache/log4j/spi/LoggingEvent.html">LoggingEvent</a></code> 
-object populated with information available for logging.
-<p>
-<li>The <code>Category</code> instance passes the <code>LoggingEvent</code>
-instance to all its 
-<code><a href="api/org/apache/log4j/Appender.html">Appender</a></code> 
-implementations.
-<p>
-<li>Most (but not all) <code>Appender</code> implementations should have 
-an associated subclass of 
-<code><a href="api/org/apache/log4j/Layout.html">Layout</a></code>.
-The <code>Layout</code> subclass is passed the <code>LoggingEvent</code> 
-instance and returns the event's information formatted in a 
-<code>String</code> according to the configuration of the <code>Layout</code>.
-<p>
-When the <code>Layout</code> subclass is
-<code><a href="api/org/apache/log4j/PatternLayout.html">PatternLayout</a></code>, 
-the format of the event's information is determined by a character sequence
-similar to the <b>C</b> language library's <code>printf</code> routine.
-<code>PatternLayout</code> delegates the parsing of this character sequence to a
-<code><a href="api/org/apache/log4j/helpers/PatternParser.html">PatternParser</a></code> 
-instance.
-<p>
-When the <code>PatternLayout</code> was constructed, it created a 
-<code>PatternParser</code> to tokenize the character sequence.  Upon 
-recognizing a token, the <code>PatternParser</code> constructs an appropriate
-<code><a href="api/org/apache/log4j/helpers/PatternConverter.html">PatternConverter</a></code> 
-subclass, passing it formatting information from the token.  Often the
-<code>PatternConverter</code> subclasses are implemented as static inner 
-classes of <code>PatternParser</code>.  The <code>parse</code> method of
-the <code>PatternParser</code> returns a linked list of these
-<code>PatternConverter</code> subclasses.
-<p>
-<li><code>PatternLayout.format()</code> passes the <code>LoggingEvent</code>
-to each <code>PatternConverter</code> subclass in the linked list.  Each link
-in the list selects a particular item from the <code>LoggingEvent</code>,
-converts this item to a <code>String</code> in the proper format and appends 
-it to a <code>StringBuffer</code>.
-<p>
-<li>The <code>format</code> method returns the resulting <code>String</code>
-to the <code>Appender</code> for output.
-</ol>
-<p>
-The above discussing involved most of the classes that we must extend or
-implement.
-<p>
-<ul>
-<li><code><a href="api/org/apache/log4j/PatternLayout.html">org.apache.log4j.PatternLayout</a></code> 
-<li><code><a href="api/org/apache/log4j/Category.html">org.apache.log4j.Category</a></code> 
-<li><code><a href="api/org/apache/log4j/spi/LoggerFactory.html">org.apache.log4j.spi.CategoryFactory</a></code> 
-<li><code><a href="api/org/apache/log4j/spi/LoggingEvent.html">org.apache.log4j.spi.LoggingEvent</a></code> 
-<li><code><a href="api/org/apache/log4j/helpers/PatternParser.html">org.apache.log4j.helpers.PatternParser</a></code> 
-<li><code><a href="api/org/apache/log4j/helpers/PatternConverter.html">org.apache.log4j.helpers.PatternConverter</a></code> 
-</ul>
-<p>
-<hr>
-<a name="process"><h2>The Process</h2></a>
-Below are steps required to add additional attributes available
-for logging by extending log4j.  This will allow you to specify
-their output formats in the same manner as those provided by the
-<code>PatternLayout</code> class.  The steps are numbered for
-reference only.  It makes no difference in which order they are
-followed.
-<p>
-It's helpful if you know the attributes you wish to add and a 
-<code>PatternLayout</code> symbol for each one before you begin.  Be
-sure to consult the <code>PatternLayout</code> documentation to ensure
-the symbols you select are not already in use.
-<p>
-Before we dig in, I should give the standard lecture on comments.
-If the log4j library were not well documented, it would be useless
-to everyone but the log4j creators; likewise with your extensions.
-Much like eating vegetables and saving the environment, we all agree
-commenting code properly should be done.  Yet it is often sacrificed 
-for more immediate pleasures.  We all write code faster without 
-comments; especially those pesky Javadoc comments.  But the reality
-is that the utility of undocumented code fades exponentially with time.
-<p>
-Since the log4j product comes with Javadoc comments together with
-the documentation it produces, it makes sense to include Javadoc
-comments in your extensions.  By their very nature, logging tools
-are strong candidates for reuse.  They can only be independently
-re-used if they are supported by strong documentation component.
-<p>
-This all having been said, I have elected to remove most comments from
-examples in the interest of space rather than including them to serve
-as a nagging reminder.  The reader is referred to the case study source 
-code files for a Javadoc version and a
-<a href="http://java.sun.com/javadoc">Javadoc website</a>
-for more information on Javadoc conventions.
-
-<a name="LoggingEvent"><h3>1. Extending <code>LoggingEvent</code></h3></a>
-
-Extending the <code>LoggingEvent</code> class should be one of the
-trivial steps.  All that is needed in the extension is the addition
-of public data members representing the new attributes and a new
-constructor to populate them.
-<p>
-<table border=1>
-<tr><td>
-<pre>
-import org.apache.log4j.Category;
-import org.apache.log4j.Priority;
-import org.apache.log4j.spi.LoggingEvent;
-
-public class AppServerLoggingEvent extends LoggingEvent
-                                   implements java.io.Serializable 
-{
-   public String hostname;
-   public String component;
-   public String server;
-   public String version;
-   
-   public AppServerLoggingEvent( String    fqnOfCategoryClass, 
-                                 AppServerCategory  category, 
-                                 Priority  priority, 
-                                 Object    message, 
-                                 Throwable throwable) 
-   {
-      super( fqnOfCategoryClass,
-             category,
-             priority,
-             message,
-             throwable );
-
-      hostname  = category.getHostname();
-      component = category.getComponent();
-      server    = category.getServer();
-      version   = category.getVersion();
-   }  
-}
-</pre>
-</table>
-<p>
-The constructor demonstrates that in most cases, the <code>Category</code>
-subclass will contain most of the information necessary to populate
-the attributes of the <code>LoggingEvent</code> subclass.  Extensions
-to <code>LoggingEvent</code> seem no more than a collection of strings
-with a constructor.  Most of the work is done by the super class.
-
-<a name="PatternLayout"><h3>2. Extending <code>PatternLayout</code></h3></a>
-
-Extending the <code>PatternLayout</code> class should be another
-simple matter.  The extension to <code>PatternLayout</code> should 
-differ from its parent only in the creation of a
-<code>PatternParser</code> instance.  The extended
-<code>PatternLayout</code> should create an extended
-<code>PatternParser</code> class.  Fortunately, this task in
-<code>PatternLayout</code> is encapsulated within a single method.
-<p>
-<table border=1> <tr><td>
-<pre>
-import org.apache.log4j.PatternParser;
-import org.apache.log4j.PatternLayout;
-
-public class AppServerPatternLayout extends PatternLayout 
-{
-   public AppServerPatternLayout() 
-   {
-      this(DEFAULT_CONVERSION_PATTERN);
-   }
-
-   public MyPatternLayout(String pattern) 
-   {
-      super(pattern);
-   }
-    
-   public PatternParser createPatternParser(String pattern) 
-   {
-      PatternParser result;
-      if ( pattern == null )
-         result = new AppserverPatternParser( DEFAULT_CONVERSION_PATTERN );
-      else
-         result = new AppServerPatternParser ( pattern );
-
-      return result;
-  }
-}
-</pre>
-</table>
-
-<a name="PatternParser"><h3>3. Extend <code>PatternParser</code> and <code>PatternConverter</code></h3></a>
-
-Recall from our <a href="#peek">peek under the hood</a> that the
-<code>PatternParser</code> does much of its work in its
-<code>parse</code> method.  The <code>PatternLayout</code> object
-instantiates a <code>PatternParser</code> object by passing it
-the pattern string.  The PatternLayout then invokes the
-<code>parse</code> method of <code>PatternParser</code> to produce
-a linked list of <code>PatternConverter</code> subclass instances.
-It is this linked list of converters that is used to convert an
-event instance into a string used by appenders.
-<p>
-Our job will be to subclass <code>PatternParser</code> to properly
-interpret formatting characters we wish to add.  Fortunately,
-<code>PatternParser</code> has been designed so that only the one
-step in the parsing process differing for each formatting character
-has to be overridden.  The grunt work of parsing is still performed
-by the <code>PatternParser.parse()</code> method.  Only the
-<code>PatternParser.finalizeConverter</code> method has to be
-overridden.  This is the method that decides which
-<code>PatternConverter</code> to create based on a formatting
-character.
-<p>
-The extension to <code>PatternParser</code>, 
-<code>AppServerPatternParser</code>, is similar to its super class.
-It uses
-<ul>
-<li>constants to identify the various formats
-<li>a converter defined as private static inner-classes of
-	<code>AppServerPatternParser</code>.
-<li>a <code>finalizeConverter</code> method which instantiates
-	the appropriate converter for a given format character.
-</ul>
-<p>
-<code>AppServerPatternParser</code> differs principally by 
-dedicating a separate converter type for each logging
-attribute to be formatted.
-Rather than placing switch logic in the converter, like its
-parent class, each converter only converts one format character.
-This means the decision of which converter subclass
-to instantiate is made at layout instantiation time rather
-than in a switch statement at logging time.
-<p>
-It also differs in that the format constants are characters 
-rather than integers.
-<p>
-<table border=1>
-<tr><td>
-<pre>
-import org.apache.log4j.*;
-import org.apache.log4j.helpers.FormattingInfo;
-import org.apache.log4j.helpers.PatternConverter;
-import org.apache.log4j.helpers.PatternParser;
-import org.apache.log4j.spi.LoggingEvent;
-
-public class AppServerPatternParser extends PatternParser 
-{
-   static final char HOSTNAME_CHAR  = 'h';
-   static final char SERVER_CHAR    = 's';
-   static final char COMPONENT_CHAR = 'b';
-   static final char VERSION_CHAR   = 'v';
-
-   public AppServerPatternParser(String pattern) 
-   {
-      super(pattern);
-   }
-    
-   public void finalizeConverter(char formatChar) 
-   {
-      PatternConverter pc = null;
-      switch( formatChar )
-      {
-         case HOSTNAME_CHAR:
-            pc = new HostnamePatternConverter( formattingInfo );
-            currentLiteral.setLength(0);
-            addConverter( pc );
-            break;
-         case SERVER_CHAR:
-            pc = new ServerPatternConverter( formattingInfo );
-            currentLiteral.setLength(0);
-            addConverter( pc );
-            break;
-         case COMPONENT_CHAR:
-            pc = new ComponentPatternConverter( formattingInfo );
-            currentLiteral.setLength(0);
-            addConverter( pc );
-            break;
-         case VERSION_CHAR:
-            pc = new VersionPatternConverter( formattingInfo );
-            currentLiteral.setLength(0);
-            addConverter( pc );
-            break;
-         default:
-            super.finalizeConverter( formatChar );
-      }
-   }
-  
-   private static abstract class AppServerPatternConverter extends PatternConverter 
-   {
-      AppServerPatternConverter(FormattingInfo formattingInfo) 
-      {
-         super(formattingInfo);     
-      }
-
-      public String convert(LoggingEvent event) 
-      {
-         String result = null;
-         AppServerLoggingEvent appEvent = null;
-
-         if ( event instanceof AppServerLoggingEvent )
-         {
-            appEvent = (AppServerLoggingEvent) event;
-            result = convert( appEvent );
-         }
-         return result;
-      }
-
-      public abstract String convert( AppServerLoggingEvent event );
-   }
-
-   private static class HostnamePatternConverter extends AppServerPatternConverter
-   {
-      HostnamePatternConverter( FormattingInfo formatInfo )
-      {  super( formatInfo );  }
-
-      public String convert( AppServerLoggingEvent event )
-      {  return event.hostname;  }
-   }
-
-   private static class ServerPatternConverter extends AppServerPatternConverter
-   {
-      ServerPatternConverter( FormattingInfo formatInfo )
-      {  super( formatInfo );  }
-
-      public String convert( AppServerLoggingEvent event )
-      {  return event.server;  }
-   }
-
-   private static class ComponentPatternConverter extends AppServerPatternConverter
-   {
-      ComponentPatternConverter( FormattingInfo formatInfo )
-      {  super( formatInfo );  }
-
-      public String convert( AppServerLoggingEvent event )
-      {  return event.component;  }
-   }
-
-   private static class VersionPatternConverter extends AppServerPatternConverter
-   {
-      VersionPatternConverter( FormattingInfo formatInfo )
-      {  super( formatInfo );  }
-
-      public String convert( AppServerLoggingEvent event )
-      {  return event.version;  }
-   }
-}
-</pre>
-</table>
-<p>
-<a name="Category"><h3>4. Extending <code>Category</code></h3></a>
-Extending <code>Category</code> and its factory will be more straight 
-forward than extending <code>PatternParser</code> and the converters.
-The following tasks are involved in overridding 
-<code>Category</code> for our purposes.
-<p>
-<ul>
-<li>Add fields corresponding to the new attributes with their
-	corresponding getters and setters.
-<p>
-<li>Override the constructor to accept or acquire information 
-	about new attributes.
-<p>
-<li>Override the <code>forcedLog</code> method to ensure that a 
-	correctly populated instance of 
-	<code>AppServerLoggingEvent</code> is instantiated rather than
-	the default <code>LoggingEvent</code>.
-<p>
-<li>Override the <code>getInstance</code> method to use our
-	<code>CategoryFactory</code> (described in the next step).  This will
-	require that we hold a static reference to our factory and provide a
-	way to initialize it.
-</ul>
-<p>
-Most of the code below is standard getter/setter verbage which has been
-somewhat abbreviated.  The notable parts are in bold.  We add five more
-attributes to <code>Category</code>: the four new logging attributes
-plus a static <code>AppServerCategoryFactory</code> reference.  This is
-pre-initialized to an instance with attributes set to null as a
-precautionary measure.  Otherwise the <code>getInstance</code> method
-will result in a null pointer exception if invoked before the
-<code>setFactory</code> method.
-<p>
-The <code>getInstance</code> method simply invokes its parent class
-method that accepts a <code>CategoryFactory</code> reference in
-addition to the category name.
-<p>
-The <code>forcedLog</code> method follows closely the corresponding
-parent class method.  The most important difference is the instantiation
-of the <code>AppServerLoggingEvent</code>.  A minor yet necessary 
-difference is the use of the <code>getRendererMap()</code> method rather
-than accessing the data member directory as in <code>Category</code>.
-<code>Category</code> can do this because the rendererMap 
-is package level accessible.
-<p>
-The <code>setFactory</code> method is provided to allow application code 
-to set the factory used in the <code>getInstance</code> method.
-<p>
-<table border=1>
-<tr><td>
-<pre>
-import org.apache.log4j.Priority;
-import org.apache.log4j.Category;
-import org.apache.log4j.spi.CategoryFactory;
-import org.apache.log4j.spi.LoggingEvent;
-
-public class AppServerCategory extends Category
-{
-   protected String <b>component</b>;
-   protected String <b>hostname</b>;
-   protected String <b>server</b>;
-   protected String <b>version</b>;
-   private static CategoryFactory <b>factory = 
-                  new AppServerCategoryFactory(null, null, null)</b>;
-
-   protected  AppServerCategory( String categoryName,
-                                 String hostname,
-                                 String server,
-                                 String component,
-                                 String version )
-   {
-      super( categoryName );
-      <b>instanceFQN = "org.apache.log4j.examples.appserver.AppServerCategory";</b>
-      
-      this.hostname  = hostname;
-      this.server    = server;
-      this.component = component;
-      this.version   = version;
-   }
-
-   public String getComponent()
-   { return (component == null ) ? "" : result; }
-
-   public String getHostname()
-   {  return ( hostname == null ) ? "" : hostname; }
-
-   public static Category <b>getInstance</b>(String name)
-   {
-      return Category.getInstance(name, factory);
-   }
-
-   public String getServer()
-   {  return ( server == null ) ? "" : server; }
-
-   public String getVersion()
-   {  return ( version == null ) ? "" : version; }
-
-   protected void <b>forcedLog</b>( String    fqn, 
-                             Priority  priority, 
-                             Object    message, 
-                             Throwable t) 
-   {
-<b>      LoggingEvent event = new AppServerLoggingEvent(fqn, this, priority, message, t);</b>
-      callAppenders( event );
-   }
-
-   public void setComponent(String componentName)
-   { component = componentName; }
-
-   public static void <b>setFactory</b>(CategoryFactory factory)
-   { AppServerCategory.factory = factory; }
-
-   public void setHostname(String hostname)
-   { this.hostname = hostname; }
-
-   public void setServer(String serverName)
-   { server = serverName; }
-
-   public void setVersion(String versionName)
-   { version = versionName; }
-}
-</pre>
-</table>
-<p>
-
-<a name="CategoryFactory"><h3>5. Extending <code>CategoryFactory</code></h3></a>
-
-The last step is to provide an implementation of the 
-<code>CategoryFactory</code> interface that will correctly 
-instantiate our <code>AppServerCategory</code> objects.  It
-will obtain the hostname of the machine on which it runs using the
-<code>java.net</code> API.  Aside from providing getters and
-setters for the attributes introduced, the only method to
-be implemented is the <code>makeNewCategoryInstance</code>.
-<p>
-Below is a snippet from <code>AppServerCategoryFactory</code>
-with getters, setters and comments removed.
-<p>
-<table border=1>
-<tr><td>
-<pre>
-import org.apache.log4j.Category;
-import org.apache.log4j.spi.CategoryFactory;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-public class AppServerCategoryFactory implements CategoryFactory
-{
-   protected String hostname;
-   protected String server;
-   protected String component;
-   protected String version;
-   protected ResourceBundle messageBundle;
-
-   protected  AppServerCategoryFactory( String serverName,
-                                        String componentName,
-                                        String versionName )
-   {
-      try
-      {
-         hostname = java.net.InetAddress.getLocalHost().getHostName();
-      }
-      catch ( java.net.UnknownHostException uhe )
-      {
-         System.err.println("Could not determine local hostname.");
-      }
-
-      server    = serverName;
-      component = componentName;
-      version   = versionName;
-   }
-
-   public Category makeNewCategoryInstance(String name)
-   {
-       Category result = new AppServerCategory( name, 
-                                                hostname, 
-                                                server, 
-                                                component, 
-                                                version);
-       return result;
-   }
-}
-</pre>
-</table>
-<p>
-<hr>
-<a name="usage"><h2>Usage</h2></a>
-We now arrive at how to use what we have created.  We must remember to
-initialize log4j by creating an instance of 
-<code>AppServerCategoryFactory</code> and passing it to 
-<code>AppServerCategory</code>.  Once done, we can obtain a
-<code>AppServerCategoryInstance</code> anytime by using the static
-<code>getInstance</code> method of <code>AppServerCategory</code>.
-This will ensure that <code>AppServerLoggingEvent</code> instances
-are generated by the category logging methods.
-<p>
-<table border=1>
-<tr><td>
-<pre>
-import org.apache.log4j.*;
-import org.apache.log4j.appserver.AppServerCategory;
-import org.apache.log4j.appserver.AppServerCategoryFactory;
-import org.apache.log4j.appserver.AppServerPatternLayout;
-
-public class test
-{
-   private static String formatString = 
-      "---------------------------------------------------%n" +
-      "Time:      %d%n" +
-      "Host:      %h%n" +
-      "Server:    %s%n" +
-      "Component: %b%n" +
-      "Version:   %v%n" +
-      "Priority:  %p%n" +
-      "Thread Id: %t%n" +
-      "Context:   %x%n" +
-      "Message:   %m%n";
-
-   public static void main(String[] args)
-   {
-      AppServerCategoryFactory factory;
-      factory = new AppServerCategoryFactory("MyServer", "MyComponent", "1.0");
-      AppServerCategory.setFactory( factory );
-      Category cat = AppServerCategory.getInstance("some.cat");
-
-      PatternLayout layout = new AppServerPatternLayout( formatString );
-      cat.addAppender( new FileAppender( layout, System.out) );
-
-      cat.debug("This is a debug statement.");
-      cat.info("This is an info statement.");
-      cat.warn("This is a warning statement.");
-      cat.error("This is an error statement.");
-      cat.fatal("This is a fatal statement.");
-   }
-}
-</pre>
-</table>
-<a name="configurators"><h3>Configurators</h3></a>
-There is one a word of caution concerning the use of configurators that
-may create <code>Category</code> instances (such as
-<a href="api/org/apache/log4j/PropertyConfigurator.html">
-<code>PropertyConfigurator</code></a> 
-and 
-<a href="api/org/apache/log4j/xml/DOMConfigurator.html">
-<code>DOMConfigurator</code></a>).  Since these configurators do not
-know about our extensions, any <code>Category</code> instances they 
-create will not be <code>AppServerCategory</code> instances.  To
-prevent this problem, any <code>AppServerCategory</code> that one
-might want to be configured through a configurator should be
-instantiated before the configure method is invoked.  In this way,
-the configurator will configure the <code>AppServerCategory</code>
-that already exists rather than creating an instance of its super
-class.
-<p>
-The consequence of a configurator creating the super class by
-mistake is merely that the extra attributes will not appear in 
-the log output.  All other attributes are conveyed properly.
-<p>
-<hr>
-<a name="enhancements"><h2>Further Enhancements</h2></a>
-There are some other directions in which this log4j extension 
-may be enhanced:
-<p>
-<ol>
-<li>The hostname attribute could incorportate a formatting convention
-	similar to that of class and category names whereby only a certain
-	number of the more significant components are displayed.  But
-	whereas with class and category names, the most significant component
-	is on the right, with host names, it is on the left.
-<p>
-<li>Specifying a version number could be dangerous since programmers
-	are apt to change versions of the code without changing the 
-	string constant in the code which specifies the version.  Some
-	source control programs provide for insertion of a version number
-	into source.  For those that don't, including the version number as
-	a constant is likely to lead to confusion later on.  It would be
-	nice to see this short-coming addressed.
-</body>
-</html>
diff --git a/docs/images/ceki-72x101.gif b/docs/images/ceki-72x101.gif
new file mode 100644
index 0000000..7c7f002
Binary files /dev/null and b/docs/images/ceki-72x101.gif differ
diff --git a/docs/images/chainsaw-fullscreen-small.jpg b/docs/images/chainsaw-fullscreen-small.jpg
new file mode 100644
index 0000000..e4de51f
Binary files /dev/null and b/docs/images/chainsaw-fullscreen-small.jpg differ
diff --git a/docs/images/chainsaw-fullscreen.jpg b/docs/images/chainsaw-fullscreen.jpg
new file mode 100644
index 0000000..14835d1
Binary files /dev/null and b/docs/images/chainsaw-fullscreen.jpg differ
diff --git a/docs/images/coverSmall.png b/docs/images/coverSmall.png
new file mode 100644
index 0000000..4b19db9
Binary files /dev/null and b/docs/images/coverSmall.png differ
diff --git a/docs/images/mark-72x99.gif b/docs/images/mark-72x99.gif
new file mode 100644
index 0000000..8d50730
Binary files /dev/null and b/docs/images/mark-72x99.gif differ
diff --git a/docs/images/psmith.jpg b/docs/images/psmith.jpg
new file mode 100644
index 0000000..edde7ad
Binary files /dev/null and b/docs/images/psmith.jpg differ
diff --git a/docs/images/yshapira.bmp b/docs/images/yshapira.bmp
new file mode 100644
index 0000000..c2f2bdd
Binary files /dev/null and b/docs/images/yshapira.bmp differ
diff --git a/docs/lf5/images/blue_on_white.gif b/docs/lf5/images/blue_on_white.gif
new file mode 100644
index 0000000..caeb5fa
Binary files /dev/null and b/docs/lf5/images/blue_on_white.gif differ
diff --git a/docs/lf5/images/console_window.gif b/docs/lf5/images/console_window.gif
new file mode 100644
index 0000000..315a7c5
Binary files /dev/null and b/docs/lf5/images/console_window.gif differ
diff --git a/docs/lf5/images/lf5.gif b/docs/lf5/images/lf5.gif
new file mode 100644
index 0000000..71c4c08
Binary files /dev/null and b/docs/lf5/images/lf5.gif differ
diff --git a/docs/lf5/images/lf5_about.gif b/docs/lf5/images/lf5_about.gif
new file mode 100644
index 0000000..206b545
Binary files /dev/null and b/docs/lf5/images/lf5_about.gif differ
diff --git a/docs/lf5/images/lf5_category_explorer.gif b/docs/lf5/images/lf5_category_explorer.gif
new file mode 100644
index 0000000..0adf254
Binary files /dev/null and b/docs/lf5/images/lf5_category_explorer.gif differ
diff --git a/docs/lf5/images/lf5_collapseall.gif b/docs/lf5/images/lf5_collapseall.gif
new file mode 100644
index 0000000..c32a665
Binary files /dev/null and b/docs/lf5/images/lf5_collapseall.gif differ
diff --git a/docs/lf5/images/lf5_colorchooser.gif b/docs/lf5/images/lf5_colorchooser.gif
new file mode 100644
index 0000000..4bb0447
Binary files /dev/null and b/docs/lf5/images/lf5_colorchooser.gif differ
diff --git a/docs/lf5/images/lf5_compactview.gif b/docs/lf5/images/lf5_compactview.gif
new file mode 100644
index 0000000..fd84c92
Binary files /dev/null and b/docs/lf5/images/lf5_compactview.gif differ
diff --git a/docs/lf5/images/lf5_configure.gif b/docs/lf5/images/lf5_configure.gif
new file mode 100644
index 0000000..5855c26
Binary files /dev/null and b/docs/lf5/images/lf5_configure.gif differ
diff --git a/docs/lf5/images/lf5_deselectall.gif b/docs/lf5/images/lf5_deselectall.gif
new file mode 100644
index 0000000..943c460
Binary files /dev/null and b/docs/lf5/images/lf5_deselectall.gif differ
diff --git a/docs/lf5/images/lf5_detailedview.gif b/docs/lf5/images/lf5_detailedview.gif
new file mode 100644
index 0000000..cc61b25
Binary files /dev/null and b/docs/lf5/images/lf5_detailedview.gif differ
diff --git a/docs/lf5/images/lf5_expandall.gif b/docs/lf5/images/lf5_expandall.gif
new file mode 100644
index 0000000..69f450c
Binary files /dev/null and b/docs/lf5/images/lf5_expandall.gif differ
diff --git a/docs/lf5/images/lf5_loglevels.gif b/docs/lf5/images/lf5_loglevels.gif
new file mode 100644
index 0000000..204a029
Binary files /dev/null and b/docs/lf5/images/lf5_loglevels.gif differ
diff --git a/docs/lf5/images/lf5_logo.gif b/docs/lf5/images/lf5_logo.gif
new file mode 100644
index 0000000..3fc62b7
Binary files /dev/null and b/docs/lf5/images/lf5_logo.gif differ
diff --git a/docs/lf5/images/lf5_logo_small.gif b/docs/lf5/images/lf5_logo_small.gif
new file mode 100644
index 0000000..c6fa96d
Binary files /dev/null and b/docs/lf5/images/lf5_logo_small.gif differ
diff --git a/docs/lf5/images/lf5_logtable.gif b/docs/lf5/images/lf5_logtable.gif
new file mode 100644
index 0000000..c804d17
Binary files /dev/null and b/docs/lf5/images/lf5_logtable.gif differ
diff --git a/docs/lf5/images/lf5_ndc_filtering.gif b/docs/lf5/images/lf5_ndc_filtering.gif
new file mode 100644
index 0000000..e44fc2f
Binary files /dev/null and b/docs/lf5/images/lf5_ndc_filtering.gif differ
diff --git a/docs/lf5/images/lf5_openfile.gif b/docs/lf5/images/lf5_openfile.gif
new file mode 100644
index 0000000..4ca07c5
Binary files /dev/null and b/docs/lf5/images/lf5_openfile.gif differ
diff --git a/docs/lf5/images/lf5_openurl.gif b/docs/lf5/images/lf5_openurl.gif
new file mode 100644
index 0000000..91a4765
Binary files /dev/null and b/docs/lf5/images/lf5_openurl.gif differ
diff --git a/docs/lf5/images/lf5_properties.gif b/docs/lf5/images/lf5_properties.gif
new file mode 100644
index 0000000..1758d1f
Binary files /dev/null and b/docs/lf5/images/lf5_properties.gif differ
diff --git a/docs/lf5/images/lf5_recorddetail.gif b/docs/lf5/images/lf5_recorddetail.gif
new file mode 100644
index 0000000..cd7c942
Binary files /dev/null and b/docs/lf5/images/lf5_recorddetail.gif differ
diff --git a/docs/lf5/images/lf5_remove_categories.gif b/docs/lf5/images/lf5_remove_categories.gif
new file mode 100644
index 0000000..0c45926
Binary files /dev/null and b/docs/lf5/images/lf5_remove_categories.gif differ
diff --git a/docs/lf5/images/lf5_search.gif b/docs/lf5/images/lf5_search.gif
new file mode 100644
index 0000000..bd218ab
Binary files /dev/null and b/docs/lf5/images/lf5_search.gif differ
diff --git a/docs/lf5/images/lf5_selectall.gif b/docs/lf5/images/lf5_selectall.gif
new file mode 100644
index 0000000..e8224a5
Binary files /dev/null and b/docs/lf5/images/lf5_selectall.gif differ
diff --git a/docs/lf5/images/lf5_small.gif b/docs/lf5/images/lf5_small.gif
new file mode 100644
index 0000000..0c6fc10
Binary files /dev/null and b/docs/lf5/images/lf5_small.gif differ
diff --git a/docs/lf5/images/lf5_standardview.gif b/docs/lf5/images/lf5_standardview.gif
new file mode 100644
index 0000000..5dffd91
Binary files /dev/null and b/docs/lf5/images/lf5_standardview.gif differ
diff --git a/docs/lf5/images/lf5_view.gif b/docs/lf5/images/lf5_view.gif
new file mode 100644
index 0000000..dace2eb
Binary files /dev/null and b/docs/lf5/images/lf5_view.gif differ
diff --git a/docs/lf5/images/small_right_arrow.gif b/docs/lf5/images/small_right_arrow.gif
new file mode 100644
index 0000000..deca2b4
Binary files /dev/null and b/docs/lf5/images/small_right_arrow.gif differ
diff --git a/docs/manual.html b/docs/manual.html
index 50c5331..db910d5 100644
--- a/docs/manual.html
+++ b/docs/manual.html
@@ -22,12 +22,12 @@
       distribution. This document is based on the article <a
       href="http://www.javaworld.com/jw-11-2000/jw-1122-log4j.html">"Log4j
       delivers control over logging"</a> published in November 2000
-      edition of <a
-      href="http://www.javaworld.com">JavaWorld</a>. However, the
-      present article contains more detailed and up to date
-      information. The short manual also borrows some text from the
-      book "log4j: the Manual" by the same author (yours truly).
-
+      edition of JavaWorld. However, the present article contains more
+      detailed and up to date information. The present short manual
+      also borrows some text from <a
+      href="https://www.qos.ch/shop/products/eclm/">"<em>The
+      complete log4j manual</em>"</a> by the same author (yours
+      truly).
 
 <h2>Abstract</h2>
 
@@ -52,9 +52,9 @@ fully-fledged open source license certified by the <a
 href="http://www.opensource.org">open source</a> initiative. The
 latest log4j version, including full-source code, class files and
 documentation can be found at <a
-href="http://jakarta.apache.org/log4j/"><b>http://jakarta.apache.org/log4j/</b></a>.
-By the way, log4j has been ported to the C, C++, C#, Python, Ruby, and
-Eiffel languages.
+href="http://logging.apache.org/log4j/"><b>http://logging.apache.org/log4j/</b></a>.
+By the way, log4j has been ported to the C, C++, C#, Perl, Python,
+Ruby, and Eiffel languages.
 
 <p>Inserting log statements into code is a low-tech method for
 debugging it. It may also be the only way because debuggers are not
@@ -70,7 +70,7 @@ to be studied at a later time. In addition to its use in the
 development cycle, a sufficiently rich logging package can also be
 viewed as an auditing tool.
 
-<p>As Brian W. Kernigan and Rob Pike put it in their truly excellent
+<p>As Brian W. Kernighan and Rob Pike put it in their truly excellent
 book <i>"The Practice of Programming"</i>
 <pre>
   As personal choice, we tend not to use debuggers beyond getting a
@@ -90,7 +90,7 @@ book <i>"The Practice of Programming"</i>
 application. If too verbose, it can cause scrolling blindness. To
 alleviate these concerns, log4j is designed to be reliable, fast and
 extensible. Since logging is rarely the main focus of an application,
-log4j API strives to be simple to understand and to use.
+the log4j API strives to be simple to understand and to use.
 
 <h2>Loggers, Appenders and Layouts</h2>
 
@@ -114,13 +114,13 @@ has replaced the <code>Category</code> class. For those familiar with
 earlier versions of log4j, the <code>Logger</code> class can be
 considered as a mere alias to the <code>Category</code> class.
 
-<p> Loggers are named entities. Logger names are case-sensitive and
+<p>Loggers are named entities. Logger names are case-sensitive and
 they follow the hierarchical naming rule:
 
 <p>
 <table bgcolor="#EEEE99">
  <tr>
-  <td>  
+  <td>
    <dl>
      <dt><b>Named Hierarchy</b>
 
@@ -142,11 +142,11 @@ ancestor of <code>"java.util.Vector"</code>.  This naming scheme
 should be familiar to most developers.
 
 <p>The root logger resides at the top of the logger hierarchy. It
-is exceptional in two ways: 
+is exceptional in two ways:
 
 <ol>
 <li> it always exists,
-<li> it cannot be retrieved by name. 
+<li> it cannot be retrieved by name.
 </ol>
 <p>Invoking the class static <a
 href="api/org/apache/log4j/Logger.html#getRootLogger()">Logger.getRootLogger</a>
@@ -162,18 +162,19 @@ below.
 <td>
 <pre>
   package org.apache.log4j;
-  
+
   public class <b>Logger</b> {
-  
+
     // Creation & retrieval methods:
     public static Logger getRootLogger();
     public static Logger getLogger(String name);
-    
+
     // printing methods:
     public void debug(Object message);
     public void info(Object message);
     public void warn(Object message);
     public void error(Object message);
+    public void fatal(Object message);
 
     // generic printing method:
     public void log(Level l, Object message);
@@ -183,19 +184,19 @@ below.
 </table>
 
 <p>Loggers <em>may</em> be assigned levels. The set of possible
-levels, that is 
+levels, that is
 
-<a href="api/org/apache/log4j/Level.html#DEBUG">DEBUG</a>, 
-<a href="api/org/apache/log4j/Level.html#INFO">INFO</a>, 
-<a href="api/org/apache/log4j/Level.html#WARN">WARN</a>, 
-<a href="api/org/apache/log4j/Level.html#ERROR">ERROR</a> and 
-<a href="api/org/apache/log4j/Level.html#FATAL">FATAL</a> 
+<a href="api/org/apache/log4j/Level.html#DEBUG">DEBUG</a>,
+<a href="api/org/apache/log4j/Level.html#INFO">INFO</a>,
+<a href="api/org/apache/log4j/Level.html#WARN">WARN</a>,
+<a href="api/org/apache/log4j/Level.html#ERROR">ERROR</a> and
+<a href="api/org/apache/log4j/Level.html#FATAL">FATAL</a>
 
 are defined in the <code><a
 href="api/org/apache/log4j/Level.html">org.apache.log4j.Level</a></code>
-class. Although we do not encourage you from doing so, you may define
+class. Although we do not encourage you to do so, you may define
 your own levels by sub-classing the <code>Level</code> class. A
-perhaps better approach is will be explained later on.
+perhaps better approach will be explained later on.
 
 <p>If a given logger is not assigned a level, then it inherits
 one from its closest ancestor with an assigned level. More
@@ -205,7 +206,7 @@ formally:
 <p>
 <table bgcolor="#EEEE99">
   <tr>
-  <td>  
+  <td>
    <dl>
      <dt><b>Level Inheritance</b>
 
@@ -231,10 +232,10 @@ resulting inherited levels according to the above rule.
     <tr align=left><td>X </td>      <td>none</td>  <td>Proot</td></tr>
     <tr align=left><td>X.Y </td>    <td>none</td>  <td>Proot</td></tr>
     <tr align=left><td>X.Y.Z</td>   <td>none</td>  <td>Proot</td></tr>
-    <caption align=bottom>Example 1</caption>    
+    <caption align=bottom>Example 1</caption>
 </table>
 
-<p>In example 1 above, only the root logger is assinged a
+<p>In example 1 above, only the root logger is assigned a
 level. This level value, <code>Proot</code>, is inherited by the
 other loggers <code>X</code>, <code>X.Y</code> and
 <code>X.Y.Z</code>.
@@ -288,17 +289,17 @@ having an assigned level..
 
 
 <p>Logging requests are made by invoking one of the printing methods
-of a logger instance. These printing methods are 
+of a logger instance. These printing methods are
 
 <code>
 <a href="api/org/apache/log4j/Logger.html#debug(java.lang.Object)">debug</a>,
 
-<a href="api/org/apache/log4j/Logger.html#info(java.lang.Object)">info</a>, 
+<a href="api/org/apache/log4j/Logger.html#info(java.lang.Object)">info</a>,
 
-<a href="api/org/apache/log4j/Logger.html#warn(java.lang.Object)">warn</a>, 
+<a href="api/org/apache/log4j/Logger.html#warn(java.lang.Object)">warn</a>,
 <a href="api/org/apache/log4j/Logger.html#error(java.lang.Object)">error</a>,
 <a href="api/org/apache/log4j/Logger.html#fatal(java.lang.Object)">fatal</a>
- and <a href="api/org/apache/log4j/Logger.html#log(org.apache.log4j.Level, java.lang.Object)">log</a></code>. 
+ and <a href="api/org/apache/log4j/Logger.html#log(org.apache.log4j.Level, java.lang.Object)">log</a></code>.
 
 
 <p>By definition, the printing method determines the level of a
@@ -321,8 +322,8 @@ summarized below.
 	<dt><b>Basic Selection Rule</b>
 
 	<dd><p>A log request of level <i>p</i> in a logger with
-	inherited level <i>q</i>, is enabled if <i> p &gt;=
-	q</i>. 	
+	(either assigned or inherited, whichever is appropriate) level <i>q</i>, is enabled if <i> p &gt;=
+	q</i>.
       </dl>
 </table>
 
@@ -330,7 +331,7 @@ summarized below.
 ordered. For the standard levels, we have <code>DEBUG &lt; INFO
 &lt; WARN &lt; ERROR &lt; FATAL</code>.
 
-<p>Here is an example of this rule. 
+<p>Here is an example of this rule.
 
 <p><table bgcolor="CCCCCC">
 <tr><td>
@@ -339,35 +340,35 @@ ordered. For the standard levels, we have <code>DEBUG &lt; INFO
    // get a logger instance named "com.foo"
    Logger  logger = Logger.getLogger(<strong>"com.foo"</strong>);
 
-   // Now set its level. Normally you do not need to set the 
-   // level of a logger progamitcally. This is usually done 
+   // Now set its level. Normally you do not need to set the
+   // level of a logger programmatically. This is usually done
    // in configuration files.
    <strong>logger</strong>.setLevel(<font
    color="0000AA"><strong>Level.INFO</strong></font>);
 
    Logger barlogger = Logger.getLogger(<strong>"com.foo.Bar"</strong>);
- 
+
    // This request is enabled, because <font color="00AA00"><strong>WARN</strong></font> &gt;= <font color="0000AA"><strong>INFO</strong></font>.
    logger.<font color="00AA00"><strong>warn</strong></font>("Low fuel level.");
-  
+
    // This request is disabled, because <font color="00AA00"><strong>DEBUG</strong></font> &lt; <font color="0000AA"><strong>INFO</strong></font>.
-   logger.<font color="00AA00"><strong>debug</strong></font>("Starting search for nearest gas station."); 
- 
+   logger.<font color="00AA00"><strong>debug</strong></font>("Starting search for nearest gas station.");
+
    // The logger instance barlogger, named "com.foo.Bar",
-   // will inherit its level from the logger named 
-   // "com.foo" Thus, the following request is enabled 
-   // because <font color="00AA00"><strong>INFO</strong></font> &gt;= <font color="0000AA"><strong>INFO</strong></font>.  
-   barlogger.<font color="00AA00"><strong>info</strong></font>("Located nearest gas station."); 
+   // will inherit its level from the logger named
+   // "com.foo" Thus, the following request is enabled
+   // because <font color="00AA00"><strong>INFO</strong></font> &gt;= <font color="0000AA"><strong>INFO</strong></font>.
+   barlogger.<font color="00AA00"><strong>info</strong></font>("Located nearest gas station.");
 
    // This request is disabled, because <font color="00AA00"><strong>DEBUG</strong></font> &lt; <font color="0000AA"><strong>INFO</strong></font>.
-   barlogger.<font color="00AA00"><strong>debug</strong></font>("Exiting gas station search"); 
+   barlogger.<font color="00AA00"><strong>debug</strong></font>("Exiting gas station search");
 </pre>
-</table>  
+</table>
 
 <p>Calling the <code>getLogger</code> method with the same name will
-always return a reference to the exact same logger object. 
+always return a reference to the exact same logger object.
 
-<p>For example, in 
+<p>For example, in
 
 <table bgcolor="CCCCCC">
 <tr><td>
@@ -422,7 +423,7 @@ href="api/org/apache/log4j/net/JMSAppender.html">JMS</a>,
 Event Loggers</a>, and remote UNIX <a
 href="api/org/apache/log4j/net/SyslogAppender.html">Syslog</a>
 daemons. It is also possible to log <a href="api/org/apache/log4j/AsyncAppender.html">asynchronously</a>.
- 
+
 <p>More than one appender can be attached to a logger.
 
 <p>The <a
@@ -486,14 +487,14 @@ the additivity flag</a> to <code>false</code>.
 <tr><td>x.y     <td>none       <td>true <td>A1, A-x1, A-x2
     <td>Appenders of "x" and root.
 
-<tr><td>x.y.z   <td>A-xyz1     <td>true <td>A1, A-x1, A-x2, A-xyz1	
+<tr><td>x.y.z   <td>A-xyz1     <td>true <td>A1, A-x1, A-x2, A-xyz1
     <td>Appenders in "x.y.z", "x" and root.
 
-<tr><td>security        <td>A-sec	   <td><font color="blue">false</font> 
+<tr><td>security        <td>A-sec	   <td><font color="blue">false</font>
                                            <td>A-sec
 
     <td>No appender accumulation since the additivity flag is set to
-        <code>false</code>. 
+        <code>false</code>.
 
 <tr><td>security.access <td>none <td> true <td> A-sec <td>Only
     appenders of "security" because the additivity flag in "security" is
@@ -507,7 +508,7 @@ destination but also the output format. This is accomplished by
 associating a <em>layout</em> with an appender. The layout is
 responsible for formatting the logging request according to the user's
 wishes, whereas an appender takes care of sending the formatted output
-to its destination. 
+to its destination.
 
 The <a
 href="api/org/apache/log4j/PatternLayout.html">PatternLayout</a>, part
@@ -533,7 +534,7 @@ message according to user specified criteria. For example, if you
 frequently need to log <code>Oranges</code>, an object type used in
 your current project, then you can register an
 <code>OrangeRenderer</code> that will be invoked whenever an orange
-needs to be logged. 
+needs to be logged.
 
 <p>Object rendering follows the class hierarchy. For example, assuming
 oranges are fruits, if you register an <code>FruitRenderer</code>, all
@@ -570,7 +571,7 @@ imaginary application <code>MyApp</code> that uses log4j.
  // Import log4j classes.
  <b>import org.apache.log4j.Logger;
  import org.apache.log4j.BasicConfigurator;</b>
- 
+
  public class MyApp {
 
    // Define a static logger variable so that it references the
@@ -585,7 +586,7 @@ imaginary application <code>MyApp</code> that uses log4j.
      logger.info("Entering application.");
      Bar bar = new Bar();
      bar.doIt();
-     logger.info("Exiting application.");    
+     logger.info("Exiting application.");
    }
  }
 </pre>
@@ -603,12 +604,12 @@ package <code>com.foo</code>.
 <pre>
  <b>package com.foo;</b>
  import org.apache.log4j.Logger;
- 
+
  public class Bar {
    <strong>static</strong> Logger logger = <strong>Logger.getLogger(Bar.class);</strong>
-  
+
    public void doIt() {
-     logger.debug("Did it again!");    
+     logger.debug("Did it again!");
    }
  }
 </pre>
@@ -624,7 +625,7 @@ href="api/org/apache/log4j/PatternLayout.html">PatternLayout</a> set
 to the pattern "%-4r [%t] %-5p %c %x - %m%n".
 
 <p>Note that by default, the root logger is assigned to
-<code>Level.DEBUG</code>. 
+<code>Level.DEBUG</code>.
 
 <p>The output of MyApp is:
 <pre>
@@ -635,7 +636,7 @@ to the pattern "%-4r [%t] %-5p %c %x - %m%n".
 
 <p>The figure below depicts the object diagram of <code>MyApp</code>
 after just having called the <code>BasicConfigurator.configure</code>
-method. 
+method.
 
 <p>
 <center>
@@ -658,7 +659,7 @@ retrieve the loggers they wish to use, and log away.
 <p>The previous example always outputs the same log information.
 Fortunately, it is easy to modify <code>MyApp</code> so that the log
 output can be controlled at run-time. Here is a slightly modified
-version.  
+version.
 
 <p><table bgcolor="CCCCCC"><tr><td>
 <pre>
@@ -666,21 +667,21 @@ version.
 
  import org.apache.log4j.Logger;
  <b>import org.apache.log4j.PropertyConfigurator;</b>
- 
+
  public class MyApp {
 
    static Logger logger = Logger.getLogger(MyApp.class.getName());
 
    public static void main(String[] args) {
 
-     
+
      // BasicConfigurator replaced with PropertyConfigurator.
      <strong>PropertyConfigurator.configure(args[0]);</strong>
 
      logger.info("Entering application.");
      Bar bar = new Bar();
      bar.doIt();
-     logger.info("Exiting application.");    
+     logger.info("Exiting application.");
    }
  }
 </pre>
@@ -697,10 +698,10 @@ output as the previous <code>BasicConfigurator</code> based example.
 <pre>
 # Set root logger level to DEBUG and its only appender to A1.
 log4j.rootLogger=DEBUG, A1
-  
-# A1 is set to be a ConsoleAppender. 
+
+# A1 is set to be a ConsoleAppender.
 log4j.appender.A1=org.apache.log4j.ConsoleAppender
-  
+
 # A1 uses PatternLayout.
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
@@ -721,10 +722,10 @@ configuration file shows one possible way of achieving this.
 log4j.rootLogger=DEBUG, A1
 log4j.appender.A1=org.apache.log4j.ConsoleAppender
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
-  
+
 # <strong>Print the date in ISO 8601 format</strong>
 log4j.appender.A1.layout.ConversionPattern=<strong>%d</strong> [%t] %-5p %c - %m%n
-  
+
 # Print only messages of level WARN or above in the package com.foo.
 <strong>log4j.logger.com.foo=WARN</strong>
 </pre>
@@ -813,13 +814,13 @@ control of a web-server.
 
 <ol>
 
- <li>Skip default initialization if the system property
- <b>log4j.defaultInitOverride</b> is set to any value other than
- "false".
+ <li>Setting the <b>log4j.defaultInitOverride</b> system property to
+ any other value then "false" will cause log4j to skip the default
+ initialization procedure (this procedure).
 
  <p><li>Set the <code>resource</code> string variable to the value of
  the <b>log4j.configuration</b> system property.  <em>The preferred
- way to specify the default initialization file is thourough the
+ way to specify the default initialization file is through the
  <b>log4j.configuration</b> system property.</em> In case the system
  property <b>log4j.configuration</b> is not defined, then set the
  string variable <code>resource</code> to its default value
@@ -932,7 +933,7 @@ web-application.
 tells log4j to use the file <code>c:\foobar.lcf</code> as the default
 configuration file. The configuration file is fully specified by the
 URL <code>file:/c:/foobar.lcf</code>. Thus, the same configuration
-file will be used for all web-applications. 
+file will be used for all web-applications.
 
 
 <p>Different web-applications will load the log4j classes through
@@ -963,9 +964,9 @@ import java.io.PrintWriter;
 import java.io.IOException;
 
 public class Log4jInit extends HttpServlet {
-  
+
   public
-  void <b>init()</b> { 
+  void <b>init()</b> {
     String prefix =  getServletContext().getRealPath("/");
     String file = getInitParameter("log4j-init-file");
     // if the log4j-init-file is not set, then no point in trying
@@ -1029,19 +1030,19 @@ user pushes contextual information into the NDC, the abbreviation of
 <em>Nested Diagnostic Context</em>. The NDC class is shown below.
 
 <pre>
-  public class NDC { 
-    // Used when printing the diagnostic 
-    public <strong>static</strong> String get(); 
- 
+  public class NDC {
+    // Used when printing the diagnostic
+    public <strong>static</strong> String get();
+
     // Remove the top of the context from the NDC.
-    public <strong>static</strong> String pop(); 
- 
+    public <strong>static</strong> String pop();
+
     // Add diagnostic context for the current thread.
-    public <strong>static</strong> void push(String message); 
- 
-    // Remove the diagnostic context for this thread.                      
-    public <strong>static</strong> void remove(); 
-  }                  
+    public <strong>static</strong> void push(String message);
+
+    // Remove the diagnostic context for this thread.
+    public <strong>static</strong> void remove();
+  }
 </pre>
 
 <p>The NDC is managed per thread as a <em>stack</em> of contextual
@@ -1096,7 +1097,7 @@ claims to be fast and flexible: speed first, flexibility second.
    machine this cost is typically in the 5 to 50 nanosecond range.
 
    <p>However, The method invocation involves the "hidden" cost of
-   parameter construction. 
+   parameter construction.
 
    <p>For example, for some logger <code>cat</code>, writing,
     <pre>
@@ -1113,12 +1114,12 @@ claims to be fast and flexible: speed first, flexibility second.
 
 
       <p>To avoid the parameter construction cost write:
-    <pre>   
+    <pre>
       if(logger.isDebugEnabled() {
         logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
       }
    </pre>
-      
+
       <p>This will not incur the cost of parameter
       construction if debugging is disabled.  On the other hand, if
       the logger is debug-enabled, it will incur twice the cost of
@@ -1127,7 +1128,7 @@ claims to be fast and flexible: speed first, flexibility second.
       <code>debug</code>. This is an insignificant
       overhead because evaluating a logger takes about 1%
       of the time it takes to actually log.
-      
+
    <p>In log4j, logging requests are made to instances of the Logger
    class. Logger is a class and not an interface. This measurably
    reduces the cost of method invocation at the cost of some
diff --git a/docs/overview.html b/docs/overview.html
index 40efccd..1dbe3ee 100644
--- a/docs/overview.html
+++ b/docs/overview.html
@@ -7,5 +7,6 @@
 
 <p>Make sure to read the <a href="../manual.html"><b>user manual</b></a>
 in addition to this javadoc documentation.
+</p>
 
 </body> </html>
diff --git a/docs/praise.html b/docs/praise.html
deleted file mode 100755
index e6d10d0..0000000
--- a/docs/praise.html
+++ /dev/null
@@ -1,266 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html> <head>
-<title>Praise from log4j users</title>
-</head>
-
-<body bgcolor="white">
-<h2>Praise from log4j users</h2>
-
-<hr><blockquote>
-Log4J was named as a finalist in the "Most Useful New or Revised Java API/Technology" 
-category, and Tomcat 3.2 was named as a finalist in the "Most Innovative Java Product" category.
-</blockquote>
-<p align=right><a href="http://www.javaworld.com" target="_blank">JavaWorld</a>,  April 2001
-
-<hr><blockquote>
-<p>Log4j is an incredibly well designed and functional logging tool. I
-caught the religion last summer and with every project I work on, most
-everyone agrees it's a must know/have tool. Previously I was using
-another Java logging library developed internally within my company
-which I liked. I had no desire to learn another but did so for the
-sake of due diligence. Log4j has the following features which set it
-apart from others I have seen.
-
-<p><b>Highly configurable</b> - the ability to configure the
-properties of your loggers (called Categories in log4j) from within a
-property file is indispensible. This allows you to change the
-characteristics of your logging without changing code. You can change
-the logging level, the format of the output and the output targets
-very easily.  One can also use XML files (though I haven't).
-
-<p><b>Unobtrusive</b> - I'm finishing a project where we started using another
-logging tool. The log statements were clumsily long and required using
-predefined constants that were hard to remember. When writing the
-initial code, "System.out.println" was so much easier to type that
-people did this for tracing with the best of intentions to place
-legitimate logging in later. You know the story. It never
-happened. Log4j statements are shorter than "System.out.println"
-statements. This encourages people to actually use it rather than
-simply agreeing to.
-
-<p><b>Easy configuration</b> - With just one statement, log4j will
-configure itself with a set of defaults that are useful until you get
-around to actually writing your property file, XML file or
-whatever. Like the point just made before, this allows log4j to be
-used at the outset of coding rather than having to wait because you
-haven't considered how you wish logging to be configured. The
-application code itself does not have to know how logging will be
-configured. 
-
-<p><b>Performance Concerns</b> - Since Java does not use pre-processor
-macros, most Java tracing is always compiled into the code. That means
-that the decision to compile is made at runtime.  There are times when
-performance is so paramount that even checking whether to log is a
-concern. There are other extremes where other delays make this
-insignificant so that the performance is easily sacrificed for the
-increased amount of information logged (such as method name, class
-name and line number in source code). The log4j javadoc documentation
-explains which information elements are quickly logged and which may
-compromise performance. It also includes benchmarks that demonstrate
-how fast certain statements are logged for a few sample machine
-configurations.
-
-<p><b>Hierarchical Categories</b> - This is highly useful in component
-based development. Each component has its own set of logging
-categories. When individually tested, the properties of these
-categories may be set however the developer wishes. When combined with
-other components, the categories inherit the properties determined by
-the integrator of the components. One can selectively elevate logging
-priorities on one component without affecting the other
-components. This is useful when you need a detailed trace from just a
-single component without crowding the trace file with messages from
-other components. All this can be done with property files - no change
-in the code is required.
-
-<p><b>Easily specified output format</b> - Some Java and OO purist
-disagree with me on this, but allowing one to use printf-style output
-format specification is powerful, convenient and compact. Log4j
-provides a Layout class with this capability. Of course, for those who
-wish, you may implement the Layout interface yourself with something
-"more OO". Naturally, the printf-style pattern can be specified in a
-property file.
-
-<p><b>Customization</b> - Like other loggers, log4j is interface-based
-making it possible to extend. Log4j supplies useful implementations
-that are extended easily without having to implement the interface
-from scratch.
-</blockquote>
-
-<p align=right>Paul Glezen (pglezen at atdial.net), December 3rd, 2000
-
-<hr><blockquote>
-This Java package is probably one of the best and most reliable packages
-around, and really helps development and maintenance of quality software.
-Thanks to all contributors who have made such a good work.
-</blockquote>
-
-<p align=right>Denis Balazuc (denis.balazuc at trader.com), December 8th,  2000
-
-<hr><blockquote> This is just a quick note of thanks for publishing
-your article in Javaworld.  Log4j is really easy to use.  While I was
-initially skeptical of the idea, code like this makes me a believer in
-the concept of Open Source.  
-</blockquote>
-
-<p align=right>Paul Hyndman (PaulHyndman at mynd.com),  November 29th, 2000
-
-<hr><blockquote>
-I just recently became aware of log4j and am just now begining to use
-it. I want to thank you and the rest of the log4j development team for
-making this functionality available. You are providing an outstanding
-service to the development community. Please pass my regards on to the
-other team members.
-</blockquote>
-
-<p align=right>Rich Coco (racoco at celoxnetworks.com), November 16th, 2000
-
-
-
-<hr><blockquote>
-
-Just thought I'd let you know that I am using your log4j as a part of
-an e-commerce application (<a
-href="http://www.consumerd.com">www.consumerd.com</a>).  I am using
-the XML configuration classes and have to say that I am most
-impressed.
-</blockquote>
-
-<p align=right>Richard King (Richard.King at capgemini.co.uk), October 25th, 2000 
-
-<hr><blockquote>
-
-You should see what we've used log4j for at work... I put together
-this Servlet that can interpret SOAP messages and invoke little
-"handlers".  Logging is pervasive through out the system, and the
-handler developers can "create" their own Categories dynamically using
-the getInstance method of Category.  
-
-<p>It's funny when I get an email from someone at work who's using the
-toolkit with a "it didn't work" question, and I ask them to check out
-the log... due to the coolness of log4j, they can track down their
-mistake immediately.
-
-</blockquote>
-<p align=right>Christopher Taylor (cstaylor at pacbell.net), September 2nd, 2000
-
-<hr><blockquote> 
-I am using log4j for a project I am currently working on. The
-simplicity and ease with which new appenders can be written makes it
-one of the best logging systems I have ever used.
-</blockquote>
-
-<p  align=right> Manish Balsara (manishb at aumsoft.com) August 28th, 2000
-
-<hr><blockquote>
-Thank you for writing this incredibly effective piece of software. You
-have made my and my team's lives much easier.
-</blockquote>
-
-<p align=right>Guy Nirpaz, Java Architect (guyn at tantian.com) August
-14th, 2000
-
-<hr><blockquote>
-Thank you <em>so</em> much for developing such a
-sleek package.  I think it's going to be a part of many of my projects in
-the future :)
-</blockquote>
-
-<p align=right>Alice Nakajima (alice.t.nakajima at saic.com) May 10th,
-2000
-
-
-<hr><blockquote>
-Thank you very much for your great work on log4j, which is really
-powerful and flexible logging system.  Log4j is now playing an
-important role in our project.
-</blockquote>
-
-<p align=right> Zeng Qiang (zeng.qiang at europeloan.com) April 26th, 2000
-
-<hr>
-<blockquote> Thank you and your team giving us a excellent tool to
-help us to develop our Java applications.  After evaluation, our team
-is ready to use log4j as our eCare product's diagnostic strategy.
-</blockquote> <p align=right>Jianbo Wang (jiwang at Daleen.com) April
-25th, 2000
-
-<hr>
-<blockquote> <!-- OK -->
-Was trying to use the log4j tracer ... great job, by the way !
-
-<p>Actually I'm evaluating the log4j package for use in our commercial
-projects. We have our own tracer package which is by far less
-powerfull and less configurable than yours.
-</blockquote> 
-<p align=right>Joerg Palmer (Joerg.Palmer at Compart.net) April 14th, 2000
-
-
-<hr>
-<blockquote><!-- OK -->
-Hooray, log4j! It's now all over my current project, and my colleagues
-were pleasantly surprised at the ease of debugging. I gave them my
-jarfile, it didn't work, I said "oh, just change this configuration
-file" and <em>presto</em>, logging to a file. They're happy.
-</blockquote>
-<p align=right>Nelson Minar CTO, Popular Power, Inc. (nelson at popularpower.com) April 14th, 2000
-
-<hr>
-<blockquote><!-- OK -->
-I really dig your log4j package... just started using it on our linux
-and os390 boxes for the java servlets we run in websphere.  Still
-trying to get the hang of it properly, but what I do have working is
-working great.  (Not to mention your makefile tutorial which has
-improved my life significantly!  :-)
-</blockquote>
-<p align=right>Anthony (ant at sanlam.co.za) April 13th, 2000
-
-
-<hr><!-- OK -->
-<blockquote>
-Thanks for providing log4j: it's a very useful package. 
-</blockquote>
-<p align=right>Andrew Harris (Andrew.Harris at capgemini.co.uk) April 10th, 2000
-
-<hr>
-<blockquote><!-- OK -->
-I just started using log4j v.0.8.1. It is quite what I was looking for.
-<p>So here is my <b>"THANK  YOU"</b> to all the contributors.
-I think I'll join the club.
-</blockquote>
-<p align=right>Avy Sharell (asharell at club-internet.fr) March 8th, 2000
-
-
-<hr>
-<blockquote><!-- OK -->
-I just wanted to thank you for log4j which is a great piece of software!
-
-<p>We are using it in the FREE e-democracy project
-<a href="http://www.thecouch.org/free/">http://www.thecouch.org/free/</a> to provide an effective security audit
-trail in our electronic voting software.
-</blockquote>
-<p align=right> Jason Kitcat (jeep at thecouch.org) March 29th, 2000 
-
-
-<hr>
-<blockquote>
-Thanks for making log4j available.
-I like the changes in v0.8 and am using it in all my java projects.
-</blockquote>
-<p align=right>Steven Marcus (srnm at awaretechnologies.com) February 19th, 2000
-
-<hr>
-<blockquote><!-- OK -->
-First congratulation for your great job on the Log mechanism log4j,
-it's really valuable.
-</blockquote>
-<p align=right>Sebastien Sahuc (ssahuc at imediation.com) January 4th, 2000
-
-
-<hr> <blockquote> Just a few remarks to your log4j Logging-Tool. First
-of all, in my opinion, it is exactly what many Java programmers need:
-A small but very useful tool complementing the debugger ;-) The logs
-help me to debug results generated on a distant client.  <p
-align=right>Jens Uwe Pipka (jens.pipka at gmx.de) October 25th, 1999
-
-<hr>
-</body> </html>
diff --git a/examples/MyPatternLayout.java b/examples/MyPatternLayout.java
index eba1787..9116864 100644
--- a/examples/MyPatternLayout.java
+++ b/examples/MyPatternLayout.java
@@ -46,9 +46,9 @@ public class MyPatternLayout extends PatternLayout {
   public
   static void main(String[] args) {
     Layout layout = new MyPatternLayout("[counter=%.10#] - %m%n");
-    Category cat = Category.getInstance("some.cat");
-    cat.addAppender(new ConsoleAppender(layout, ConsoleAppender.SYSTEM_OUT));
-    cat.debug("Hello, log");
-    cat.info("Hello again...");    
+    Logger logger = Logger.getLogger("some.cat");
+    logger.addAppender(new ConsoleAppender(layout, ConsoleAppender.SYSTEM_OUT));
+    logger.debug("Hello, log");
+    logger.info("Hello again...");    
   }
 }
diff --git a/examples/NumberCruncherServer.java b/examples/NumberCruncherServer.java
index d2eec74..a5dde22 100644
--- a/examples/NumberCruncherServer.java
+++ b/examples/NumberCruncherServer.java
@@ -14,7 +14,7 @@ import java.rmi.Naming;
 import java.util.Vector;
 
 
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
 import org.apache.log4j.NDC;
 import org.apache.log4j.PropertyConfigurator;
 
@@ -54,8 +54,7 @@ public class NumberCruncherServer extends UnicastRemoteObject
                                   implements  NumberCruncher {
 
 
-  static Category cat = Category.getInstance(
-					NumberCruncherServer.class.getName());
+  static Logger logger = Logger.getLogger(NumberCruncherServer.class);
 
   public
   NumberCruncherServer() throws RemoteException {
@@ -79,7 +78,7 @@ public class NumberCruncherServer extends UnicastRemoteObject
     // contained in cookies.
     NDC.push(String.valueOf(number));    
 
-    cat.info("Beginning to factor.");
+    logger.info("Beginning to factor.");
     if(number <= 0) {
       throw new IllegalArgumentException(number+" is not a positive integer.");
     }
@@ -93,10 +92,10 @@ public class NumberCruncherServer extends UnicastRemoteObject
       // It is bad practice to place log requests within tight loops.
       // It is done here to show interleaved log output from
       // different requests. 
-      cat.debug("Trying to see if " + i + " is a factor.");
+      logger.debug("Trying to see if " + i + " is a factor.");
 
       if((n % i) == 0) {
-	cat.info("Found factor "+i);
+	logger.info("Found factor "+i);
 	factors.addElement(new Integer(i));
 	do {
 	  n /= i;
@@ -108,7 +107,7 @@ public class NumberCruncherServer extends UnicastRemoteObject
     }
 
     if(n != 1) {
-      cat.info("Found factor "+n);
+      logger.info("Found factor "+n);
       factors.addElement(new Integer(n));
     }
     
@@ -153,10 +152,10 @@ public class NumberCruncherServer extends UnicastRemoteObject
     try {
       ncs = new NumberCruncherServer();
       Naming.rebind("Factor", ncs);
-      cat.info("NumberCruncherServer bound and ready to serve.");
+      logger.info("NumberCruncherServer bound and ready to serve.");
     }
     catch(Exception e) {
-      cat.error("Could not bind NumberCruncherServer.", e);
+      logger.error("Could not bind NumberCruncherServer.", e);
       return;
     }
     NumberCruncherClient.loop(ncs);          
diff --git a/examples/SortAlgo.java b/examples/SortAlgo.java
index a5a3f53..98a4b04 100644
--- a/examples/SortAlgo.java
+++ b/examples/SortAlgo.java
@@ -1,7 +1,7 @@
 
 package examples;
 
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
 import org.apache.log4j.NDC;
 
 /**
@@ -16,11 +16,11 @@ import org.apache.log4j.NDC;
 public class SortAlgo {
 
   final static String className = SortAlgo.class.getName();
-  final static Category CAT = Category.getInstance(className);
-  final static Category OUTER = Category.getInstance(className + ".OUTER");
-  final static Category INNER = Category.getInstance(className + ".INNER");
-  final static Category DUMP = Category.getInstance(className + ".DUMP");
-  final static Category SWAP = Category.getInstance(className + ".SWAP");
+  final static Logger LOG = Logger.getLogger(className);
+  final static Logger OUTER = Logger.getLogger(className + ".OUTER");
+  final static Logger INNER = Logger.getLogger(className + ".INNER");
+  final static Logger DUMP = Logger.getLogger(className + ".DUMP");
+  final static Logger SWAP = Logger.getLogger(className + ".SWAP");
 
   int[] intArray;
 
@@ -29,7 +29,7 @@ public class SortAlgo {
   }
     
   void bubbleSort() {
-    CAT.info( "Entered the sort method.");
+    LOG.info( "Entered the sort method.");
 
     for(int i = intArray.length -1; i >= 0  ; i--) {
       NDC.push("i=" + i);
diff --git a/examples/Trivial.java b/examples/Trivial.java
index 0f97056..9be452d 100644
--- a/examples/Trivial.java
+++ b/examples/Trivial.java
@@ -2,7 +2,7 @@
 package examples;
 
 
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
 import org.apache.log4j.BasicConfigurator;
 import org.apache.log4j.NDC;
 
@@ -33,31 +33,31 @@ import org.apache.log4j.NDC;
  */
 public class Trivial {
 
-  static Category cat = Category.getInstance(Trivial.class.getName());
+  static Logger logger = Logger.getLogger(Trivial.class);
 
   public static void main(String[] args) {
     BasicConfigurator.configure();
     NDC.push("Client #45890"); 
 
-    cat.info("Awake awake. Put on thy strength.");
+    logger.info("Awake awake. Put on thy strength.");
     Trivial.foo();
     InnerTrivial.foo();
-    cat.info("Exiting Trivial.");    
+    logger.info("Exiting Trivial.");    
   }
 
   static
   void foo() {
     NDC.push("DB"); 
-    cat.debug("Now king David was old.");    
+    logger.debug("Now king David was old.");    
     NDC.pop(); 
   }
 
   static class InnerTrivial {
-    static  Category cat = Category.getInstance(InnerTrivial.class.getName());
+    static  Logger logger = Logger.getLogger(InnerTrivial.class);
 
     static    
     void foo() {
-      cat.info("Entered foo."); 
+      logger.info("Entered foo."); 
     }
   }
 }
diff --git a/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java b/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java
new file mode 100644
index 0000000..e089069
--- /dev/null
+++ b/examples/lf5/InitUsingDefaultConfigurator/InitUsingDefaultConfigurator.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software
+ * License version 1.1, a copy of which has been included with this
+ * distribution in the LICENSE.txt file.
+ */
+package examples.lf5.InitUsingDefaultConfigurator;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.NDC;
+import org.apache.log4j.lf5.DefaultLF5Configurator;
+
+import java.io.IOException;
+
+/**
+ * This class is a simple example of how to configure the LogFactor5
+ * logging window using the DefaultLF5Configurator.
+ *
+ * The DefaultLF5Configurator uses a default configuration file stored
+ * in the log4j.jar in order to provide a default configuration for
+ * the LF5Appender.
+ *
+ * @author Brent Sprecher
+ */
+
+// Contributed by ThoughtWorks Inc.
+
+public class InitUsingDefaultConfigurator {
+    //--------------------------------------------------------------------------
+    //   Constants:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Protected Variables:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Variables:
+    //--------------------------------------------------------------------------
+    private static Logger logger =
+            Logger.getLogger(InitUsingDefaultConfigurator.class);
+
+    //--------------------------------------------------------------------------
+    //   Constructors:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Public Methods:
+    //--------------------------------------------------------------------------
+
+    public static void main(String[] args) throws IOException {
+        // Configure the LF5Appender using the DefaultLF5Configurator.  This
+        // will add the LF5Appender to the root of the Category tree.
+        DefaultLF5Configurator.configure();
+
+        // Add an NDC to demonstrate how NDC information is output.
+        NDC.push("#23856");
+        // Log some information.
+        for (int i = 0; i < 10; i++) {
+            logger.debug("Hello, my name is Homer Simpson.");
+            logger.info("Mmmmmm .... Chocolate.");
+            logger.warn("Mmm...forbidden donut.");
+        }
+        // Clean up NDC
+        NDC.pop();
+        NDC.remove();
+
+        NDC.push("Another NDC");
+        // Log some information.
+        logger.fatal("Hello, my name is Bart Simpson.");
+        logger.error("Hi diddly ho good neighbour.");
+        // Clean up NDC
+        NDC.pop();
+        NDC.remove();
+
+        // Call methods on both classes.
+        InitUsingDefaultConfigurator.foo();
+        InnerInitUsingDefaultConfigurator.foo();
+
+        logger.info("Exiting InitUsingDefaultConfigurator.");
+
+    }
+
+    public static void foo() {
+        logger.debug("Entered foo in InitUsingDefaultConfigurator class");
+
+        NDC.push("#123456");
+        logger.debug("Hello, my name is Marge Simpson.");
+        logger.info("D'oh!! A deer! A female deer.");
+        // Clean up NDC
+        NDC.pop();
+        NDC.remove();
+    }
+
+    //--------------------------------------------------------------------------
+    //   Protected Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Nested Top-Level Classes or Interfaces:
+    //--------------------------------------------------------------------------
+
+    public static class InnerInitUsingDefaultConfigurator {
+        static Logger logger =
+                Logger.getLogger(InnerInitUsingDefaultConfigurator.class.getName());
+
+        static void foo() throws IOException {
+            // Configure the LF5Appender again. You can call
+            // DefaultLF5Configurator.configure() as often as you want
+            // without unexpected behavior.
+            DefaultLF5Configurator.configure();
+
+            logger.info("Entered foo in InnerInitUsingDefaultConfigurator class.");
+        }
+    }
+}
+
+
+
+
+
diff --git a/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java b/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java
new file mode 100644
index 0000000..2679d6d
--- /dev/null
+++ b/examples/lf5/InitUsingLog4JProperties/InitUsingLog4JProperties.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software
+ * License version 1.1, a copy of which has been included with this
+ * distribution in the LICENSE.txt file.
+ */
+package examples.lf5.InitUsingLog4JProperties;
+
+import org.apache.log4j.Logger;
+
+import java.io.IOException;
+
+/**
+ * This class is a simple example of how to use the LogFactor5 logging
+ * window.
+ *
+ * The LF5Appender is the primary class that enables logging to the
+ * LogFactor5 logging window. The simplest method of using this Appender
+ * is to add the following line to your log4j.properties file:
+ *
+ *    log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
+ *
+ * The log4j.properties file MUST be in you system classpath. If this file
+ * is in your system classpath, a static initializer in the Category class
+ * will load the file during class initialization. The LF5Appender will be
+ * added to the root category of the Category tree.
+ *
+ * Create a log4j.properties file and add this line to it, or add this line
+ * to your existing log4j.properties file. Run the example at the command line
+ * and explore the results!
+ *
+ * @author Brent Sprecher
+ */
+
+// Contributed by ThoughtWorks Inc.
+
+public class InitUsingLog4JProperties {
+    //--------------------------------------------------------------------------
+    //   Constants:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Protected Variables:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Variables:
+    //--------------------------------------------------------------------------
+
+    private static Logger logger =
+            Logger.getLogger(InitUsingLog4JProperties.class);
+
+    //--------------------------------------------------------------------------
+    //   Constructors:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Public Methods:
+    //--------------------------------------------------------------------------
+
+    public static void main(String argv[]) {
+        // Add a bunch of logging statements ...
+        logger.debug("Hello, my name is Homer Simpson.");
+        logger.debug("Hello, my name is Lisa Simpson.");
+        logger.debug("Hello, my name is Marge Simpson.");
+        logger.debug("Hello, my name is Bart Simpson.");
+        logger.debug("Hello, my name is Maggie Simpson.");
+
+        logger.info("We are the Simpsons!");
+        logger.info("Mmmmmm .... Chocolate.");
+        logger.info("Homer likes chocolate");
+        logger.info("Doh!");
+        logger.info("We are the Simpsons!");
+
+        logger.warn("Bart: I am through with working! Working is for chumps!" +
+                "Homer: Son, I'm proud of you. I was twice your age before " +
+                "I figured that out.");
+        logger.warn("Mmm...forbidden donut.");
+        logger.warn("D'oh! A deer! A female deer!");
+        logger.warn("Truly, yours is a butt that won't quit." +
+                "- Bart, writing as Woodrow to Ms. Krabappel.");
+
+        logger.error("Dear Baby, Welcome to Dumpsville. Population: you.");
+        logger.error("Dear Baby, Welcome to Dumpsville. Population: you.",
+                new IOException("Dumpsville, USA"));
+        logger.error("Mr. Hutz, are you aware you're not wearing pants?");
+        logger.error("Mr. Hutz, are you aware you're not wearing pants?",
+                new IllegalStateException("Error !!"));
+
+
+        logger.fatal("Eep.");
+        logger.fatal("Mmm...forbidden donut.",
+                new SecurityException("Fatal Exception"));
+        logger.fatal("D'oh! A deer! A female deer!");
+        logger.fatal("Mmmmmm .... Chocolate.",
+                new SecurityException("Fatal Exception"));
+    }
+
+    //--------------------------------------------------------------------------
+    //   Protected Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Nested Top-Level Classes or Interfaces:
+    //--------------------------------------------------------------------------
+
+}
diff --git a/examples/lf5/InitUsingLog4JProperties/log4j.properties b/examples/lf5/InitUsingLog4JProperties/log4j.properties
new file mode 100644
index 0000000..98b54b5
--- /dev/null
+++ b/examples/lf5/InitUsingLog4JProperties/log4j.properties
@@ -0,0 +1,17 @@
+# For the general syntax of property based configuration files see the
+# documenation of org.apache.log4j.PropertyConfigurator.
+
+# The root category uses the appender called A1. Since no priority is
+# specified, the root category assumes the default priority for root
+# which is DEBUG in log4j. The root category is the only category that
+# has a default priority. All other categories need not be assigned a
+# priority in which case they inherit their priority from the
+# hierarchy.
+
+log4j.rootCategory=, A1
+
+# A1 is set to be a LF5Appender which outputs to a swing
+# logging console. 
+  
+log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
+log4j.appender.A1.MaxNumberOfRecords=1000
diff --git a/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java b/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java
new file mode 100644
index 0000000..c3d7a31
--- /dev/null
+++ b/examples/lf5/InitUsingMultipleAppenders/InitUsingMultipleAppenders.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software
+ * License version 1.1, a copy of which has been included with this
+ * distribution in the LICENSE.txt file.
+ */
+package examples.lf5.InitUsingMultipleAppenders;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
+import java.io.IOException;
+import java.net.URL;
+
+/**
+ * This example shows how to use LogFactor5 with other Log4J appenders
+ * (In this case the RollingFileAppender).
+ *
+ * The following lines can be added to the log4j.properties file or a
+ * standard Java properties file.
+ *
+ *   # Two appenders are registered with the root of the Category tree.
+ *
+ *   log4j.rootCategory=, A1, R
+ *
+ *   # A1 is set to be a LF5Appender which outputs to a swing
+ *   # logging console.
+ *
+ *   log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
+ *
+ *   # R is the RollingFileAppender that outputs to a rolling log
+ *   # file called rolling_log_file.log.
+ *
+ * log4j.appender.R=org.apache.log4j.RollingFileAppender
+ * log4j.appender.R.File=rolling_log_file.log
+ *
+ * log4j.appender.R.layout=org.apache.log4j.PatternLayout
+ * log4j.appender.R.layout.ConversionPattern=Date - %d{DATE}%nPriority
+ * - %p%nThread - %t%nCategory - %c%nLocation - %l%nMessage - %m%n%n
+ * log4j.appender.R.MaxFileSize=100KB
+ * log4j.appender.R.MaxBackupIndex=1
+ *
+ * To make this example work, either run the InitUsingMultipleAppenders.bat
+ * file located in the examples folder or run it at the command line. If you
+ * are running the example at the command line, you must ensure that the
+ * example.properties file is in your classpath.
+ *
+ * @author Brent Sprecher
+ * @author Brad Marlborough
+ */
+
+// Contributed by ThoughtWorks Inc.
+
+public class InitUsingMultipleAppenders {
+
+    //--------------------------------------------------------------------------
+    //   Constants:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Protected Variables:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Variables:
+    //--------------------------------------------------------------------------
+
+    private static Logger logger =
+            Logger.getLogger(InitUsingMultipleAppenders.class);
+
+    //--------------------------------------------------------------------------
+    //   Constructors:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Public Methods:
+    //--------------------------------------------------------------------------
+
+    public static void main(String argv[]) {
+        // Use a PropertyConfigurator to initialize from a property file.
+        String resource =
+                "/examples/lf5/InitUsingMultipleAppenders/example.properties";
+        URL configFileResource =
+                InitUsingMultipleAppenders.class.getResource(resource);
+        PropertyConfigurator.configure(configFileResource);
+
+        // Add a bunch of logging statements ...
+        logger.debug("Hello, my name is Homer Simpson.");
+        logger.debug("Hello, my name is Lisa Simpson.");
+        logger.debug("Hello, my name is Marge Simpson.");
+        logger.debug("Hello, my name is Bart Simpson.");
+        logger.debug("Hello, my name is Maggie Simpson.");
+
+        logger.info("We are the Simpsons!");
+        logger.info("Mmmmmm .... Chocolate.");
+        logger.info("Homer likes chocolate");
+        logger.info("Doh!");
+        logger.info("We are the Simpsons!");
+
+        logger.warn("Bart: I am through with working! Working is for chumps!" +
+                "Homer: Son, I'm proud of you. I was twice your age before " +
+                "I figured that out.");
+        logger.warn("Mmm...forbidden donut.");
+        logger.warn("D'oh! A deer! A female deer!");
+        logger.warn("Truly, yours is a butt that won't quit." +
+                "- Bart, writing as Woodrow to Ms. Krabappel.");
+
+        logger.error("Dear Baby, Welcome to Dumpsville. Population: you.");
+        logger.error("Dear Baby, Welcome to Dumpsville. Population: you.",
+                new IOException("Dumpsville, USA"));
+        logger.error("Mr. Hutz, are you aware you're not wearing pants?");
+        logger.error("Mr. Hutz, are you aware you're not wearing pants?",
+                new IllegalStateException("Error !!"));
+
+
+        logger.fatal("Eep.");
+        logger.fatal("Mmm...forbidden donut.",
+                new SecurityException("Fatal Exception"));
+        logger.fatal("D'oh! A deer! A female deer!");
+        logger.fatal("Mmmmmm .... Chocolate.",
+                new SecurityException("Fatal Exception"));
+    }
+
+    //--------------------------------------------------------------------------
+    //   Protected Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Nested Top-Level Classes or Interfaces:
+    //--------------------------------------------------------------------------
+
+}
diff --git a/examples/lf5/InitUsingMultipleAppenders/example.properties b/examples/lf5/InitUsingMultipleAppenders/example.properties
new file mode 100644
index 0000000..ac1f374
--- /dev/null
+++ b/examples/lf5/InitUsingMultipleAppenders/example.properties
@@ -0,0 +1,34 @@
+# For the general syntax of property based configuration files see the
+# documenation of org.apache.log4j.PropertyConfigurator.
+
+# The root category uses two appenders called A1 and R. Since no priority is
+# specified, the root category assumes the default priority for root
+# which is DEBUG in log4j. The root category is the only category that
+# has a default priority. All other categories need not be assigned a
+# priority in which case they inherit their priority from the
+# hierarchy.
+
+log4j.rootCategory=, A1, R
+
+# A1 is set to be a LF5Appender which outputs to a swing
+# logging console.   
+  
+log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
+
+# R is the RollingFileAppender that outputs to a rolling log 
+# file called rolling_log_file.log.
+
+log4j.appender.R=org.apache.log4j.RollingFileAppender
+log4j.appender.R.File=rolling_log_file.log
+
+# Define a pattern layout for the file.  
+# For more information on conversion characters (i.e. d,p,t,c,l,m,n)
+# please see the PatternLayout class of the Log4j API.
+
+log4j.appender.R.layout=org.apache.log4j.PatternLayout
+log4j.appender.R.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n
+
+# Set the max size of the file and the number of backup files
+
+log4j.appender.R.MaxFileSize=100KB
+log4j.appender.R.MaxBackupIndex=1
\ No newline at end of file
diff --git a/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java b/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java
new file mode 100644
index 0000000..71abb94
--- /dev/null
+++ b/examples/lf5/InitUsingPropertiesFile/InitUsingPropertiesFile.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software
+ * License version 1.1, a copy of which has been included with this
+ * distribution in the LICENSE.txt file.
+ */
+package examples.lf5.InitUsingPropertiesFile;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
+import java.io.IOException;
+import java.net.URL;
+
+/**
+ * This is another simple example of how to use the LogFactor5
+ * logging console.
+ *
+ * The LF5Appender is the primary class that enables logging to the
+ * LogFactor5 logging window. If the following line is added to a properties
+ * file, the LF5Appender will be appended to the root category when
+ * the properties file is loaded:
+ *
+ *    log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
+ *
+ * To make this example work, you must ensure that the example.properties file
+ * is in your classpath.You can then run the example at the command line.
+ *
+ * @author Brent Sprecher
+ */
+
+// Contributed by ThoughtWorks Inc.
+
+public class InitUsingPropertiesFile {
+    //--------------------------------------------------------------------------
+    //   Constants:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Protected Variables:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Variables:
+    //--------------------------------------------------------------------------
+
+    private static Logger logger =
+            Logger.getLogger(InitUsingPropertiesFile.class);
+
+    //--------------------------------------------------------------------------
+    //   Constructors:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Public Methods:
+    //--------------------------------------------------------------------------
+
+    public static void main(String argv[]) {
+        // Use a PropertyConfigurator to initialize from a property file.
+        String resource =
+                "/examples/lf5/InitUsingPropertiesFile/example.properties";
+        URL configFileResource =
+                InitUsingPropertiesFile.class.getResource(resource);
+        PropertyConfigurator.configure(configFileResource);
+
+        // Add a bunch of logging statements ...
+        logger.debug("Hello, my name is Homer Simpson.");
+        logger.debug("Hello, my name is Lisa Simpson.");
+        logger.debug("Hello, my name is Marge Simpson.");
+        logger.debug("Hello, my name is Bart Simpson.");
+        logger.debug("Hello, my name is Maggie Simpson.");
+
+        logger.info("We are the Simpsons!");
+        logger.info("Mmmmmm .... Chocolate.");
+        logger.info("Homer likes chocolate");
+        logger.info("Doh!");
+        logger.info("We are the Simpsons!");
+
+        logger.warn("Bart: I am through with working! Working is for chumps!" +
+                "Homer: Son, I'm proud of you. I was twice your age before " +
+                "I figured that out.");
+        logger.warn("Mmm...forbidden donut.");
+        logger.warn("D'oh! A deer! A female deer!");
+        logger.warn("Truly, yours is a butt that won't quit." +
+                "- Bart, writing as Woodrow to Ms. Krabappel.");
+
+        logger.error("Dear Baby, Welcome to Dumpsville. Population: you.");
+        logger.error("Dear Baby, Welcome to Dumpsville. Population: you.",
+                new IOException("Dumpsville, USA"));
+        logger.error("Mr. Hutz, are you aware you're not wearing pants?");
+        logger.error("Mr. Hutz, are you aware you're not wearing pants?",
+                new IllegalStateException("Error !!"));
+
+
+        logger.fatal("Eep.");
+        logger.fatal("Mmm...forbidden donut.",
+                new SecurityException("Fatal Exception"));
+        logger.fatal("D'oh! A deer! A female deer!");
+        logger.fatal("Mmmmmm .... Chocolate.",
+                new SecurityException("Fatal Exception"));
+    }
+
+    //--------------------------------------------------------------------------
+    //   Protected Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Nested Top-Level Classes or Interfaces:
+    //--------------------------------------------------------------------------
+
+}
diff --git a/examples/lf5/InitUsingPropertiesFile/example.properties b/examples/lf5/InitUsingPropertiesFile/example.properties
new file mode 100644
index 0000000..ab421d3
--- /dev/null
+++ b/examples/lf5/InitUsingPropertiesFile/example.properties
@@ -0,0 +1,17 @@
+# For the general syntax of property based configuration files see the
+# documenation of org.apache.log4j.PropertyConfigurator.
+
+# The root category uses the appender called A1. Since no priority is
+# specified, the root category assumes the default priority for root
+# which is DEBUG in log4j. The root category is the only category that
+# has a default priority. All other categories need not be assigned a
+# priority in which case they inherit their priority from the
+# hierarchy.
+
+log4j.rootCategory=, A1
+
+# A1 is set to be a LF5Appender which outputs to a swing
+# logging console. 
+  
+log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
+log4j.appender.A1.MaxNumberOfRecords=700
diff --git a/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java b/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java
new file mode 100644
index 0000000..8b21c98
--- /dev/null
+++ b/examples/lf5/InitUsingXMLPropertiesFile/InitUsingXMLPropertiesFile.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software
+ * License version 1.1, a copy of which has been included with this
+ * distribution in the LICENSE.txt file.
+ */
+package examples.lf5.InitUsingXMLPropertiesFile;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.xml.DOMConfigurator;
+
+import java.io.IOException;
+import java.net.URL;
+
+/**
+ * This is another simple example of how to use the LogFactor5
+ * logging console.
+ *
+ * To make this example work, ensure that the lf5.jar, lf5-license.jar
+ * and example.xml files are in your classpath. Once your classpath has
+ * been set up, you can run the example from the command line.
+ *
+ * @author Brent Sprecher
+ */
+
+// Contributed by ThoughtWorks Inc.
+
+public class InitUsingXMLPropertiesFile {
+    //--------------------------------------------------------------------------
+    //   Constants:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Protected Variables:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Variables:
+    //--------------------------------------------------------------------------
+
+    private static Logger logger =
+            Logger.getLogger(InitUsingXMLPropertiesFile.class);
+
+    //--------------------------------------------------------------------------
+    //   Constructors:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Public Methods:
+    //--------------------------------------------------------------------------
+
+    public static void main(String argv[]) {
+        // Use a PropertyConfigurator to initialize from a property file.
+        String resource =
+                "/examples/lf5/InitUsingXMLPropertiesFile/example.xml";
+        URL configFileResource =
+                InitUsingXMLPropertiesFile.class.getResource(resource);
+        DOMConfigurator.configure(configFileResource.getFile());
+
+        // Add a bunch of logging statements ...
+        logger.debug("Hello, my name is Homer Simpson.");
+        logger.debug("Hello, my name is Lisa Simpson.");
+        logger.debug("Hello, my name is Marge Simpson.");
+        logger.debug("Hello, my name is Bart Simpson.");
+        logger.debug("Hello, my name is Maggie Simpson.");
+
+        logger.info("We are the Simpsons!");
+        logger.info("Mmmmmm .... Chocolate.");
+        logger.info("Homer likes chocolate");
+        logger.info("Doh!");
+        logger.info("We are the Simpsons!");
+
+        logger.warn("Bart: I am through with working! Working is for chumps!" +
+                "Homer: Son, I'm proud of you. I was twice your age before " +
+                "I figured that out.");
+        logger.warn("Mmm...forbidden donut.");
+        logger.warn("D'oh! A deer! A female deer!");
+        logger.warn("Truly, yours is a butt that won't quit." +
+                "- Bart, writing as Woodrow to Ms. Krabappel.");
+
+        logger.error("Dear Baby, Welcome to Dumpsville. Population: you.");
+        logger.error("Dear Baby, Welcome to Dumpsville. Population: you.",
+                new IOException("Dumpsville, USA"));
+        logger.error("Mr. Hutz, are you aware you're not wearing pants?");
+        logger.error("Mr. Hutz, are you aware you're not wearing pants?",
+                new IllegalStateException("Error !!"));
+
+
+        logger.fatal("Eep.");
+        logger.fatal("Mmm...forbidden donut.",
+                new SecurityException("Fatal Exception"));
+        logger.fatal("D'oh! A deer! A female deer!");
+        logger.fatal("Mmmmmm .... Chocolate.",
+                new SecurityException("Fatal Exception"));
+    }
+
+    //--------------------------------------------------------------------------
+    //   Protected Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Nested Top-Level Classes or Interfaces:
+    //--------------------------------------------------------------------------
+
+}
diff --git a/examples/lf5/InitUsingXMLPropertiesFile/example.xml b/examples/lf5/InitUsingXMLPropertiesFile/example.xml
new file mode 100644
index 0000000..d167c5f
--- /dev/null
+++ b/examples/lf5/InitUsingXMLPropertiesFile/example.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<log4j:configuration>
+        
+  <appender name="LF5Appender" class="org.apache.log4j.lf5.LF5Appender">
+     <param name="MaxNumberOfRecords" value="1000"/> 
+  </appender>
+
+  <root>
+    <priority value ="debug" />
+    <appender-ref ref="LF5Appender"/>
+  </root>
+
+</log4j:configuration>
\ No newline at end of file
diff --git a/examples/lf5/OpeningLogFiles/sample.log b/examples/lf5/OpeningLogFiles/sample.log
new file mode 100644
index 0000000..1adbea5
--- /dev/null
+++ b/examples/lf5/OpeningLogFiles/sample.log
@@ -0,0 +1,184 @@
+[slf5s.start]26 Jul 2001 15:54:44,673[slf5s.DATE]
+DEBUG[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:102)[slf5s.LOCATION]
+Hello, my name is Homer Simpson.[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,743[slf5s.DATE]
+DEBUG[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:103)[slf5s.LOCATION]
+Hello, my name is Lisa Simpson.[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,743[slf5s.DATE]
+DEBUG[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:104)[slf5s.LOCATION]
+Hello, my name is Marge Simpson.[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,753[slf5s.DATE]
+DEBUG[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:105)[slf5s.LOCATION]
+Hello, my name is Bart Simpson.[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,793[slf5s.DATE]
+DEBUG[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:106)[slf5s.LOCATION]
+Hello, my name is Maggie Simpson.[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,793[slf5s.DATE]
+INFO[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:108)[slf5s.LOCATION]
+We are the Simpsons![slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE]
+INFO[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:109)[slf5s.LOCATION]
+Mmmmmm .... Chocolate.[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE]
+INFO[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:110)[slf5s.LOCATION]
+Homer likes chocolate[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE]
+INFO[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:111)[slf5s.LOCATION]
+Doh![slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE]
+INFO[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:112)[slf5s.LOCATION]
+We are the Simpsons![slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE]
+WARN[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:114)[slf5s.LOCATION]
+Bart: I am through with working! Working is for chumps!Homer: Son, I'm proud of you. I was twice your age before I figured that out.[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE]
+WARN[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:117)[slf5s.LOCATION]
+Mmm...forbidden donut.[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE]
+WARN[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:118)[slf5s.LOCATION]
+D'oh! A deer! A female deer![slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE]
+WARN[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:119)[slf5s.LOCATION]
+Truly, yours is a butt that won't quit.- Bart, writing as Woodrow to Ms. Krabappel.[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,803[slf5s.DATE]
+ERROR[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:122)[slf5s.LOCATION]
+Dear Baby, Welcome to Dumpsville. Population: you.[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,903[slf5s.DATE]
+ERROR[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:123)[slf5s.LOCATION]
+Dear Baby, Welcome to Dumpsville. Population: you.[slf5s.MESSAGE]
+
+java.io.IOException: Dumpsville, USA
+	at examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:123)
+[slf5s.start]26 Jul 2001 15:54:44,903[slf5s.DATE]
+ERROR[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:125)[slf5s.LOCATION]
+Mr. Hutz, are you aware you're not wearing pants?[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:44,903[slf5s.DATE]
+ERROR[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:126)[slf5s.LOCATION]
+Mr. Hutz, are you aware you're not wearing pants?[slf5s.MESSAGE]
+
+java.lang.IllegalStateException: Error !!
+	at examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:126)
+[slf5s.start]26 Jul 2001 15:54:44,903[slf5s.DATE]
+FATAL[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:130)[slf5s.LOCATION]
+Eep.[slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:45,063[slf5s.DATE]
+FATAL[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:131)[slf5s.LOCATION]
+Mmm...forbidden donut.[slf5s.MESSAGE]
+
+java.lang.SecurityException: Fatal Exception
+	at examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:131)
+[slf5s.start]26 Jul 2001 15:54:45,063[slf5s.DATE]
+FATAL[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:133)[slf5s.LOCATION]
+D'oh! A deer! A female deer![slf5s.MESSAGE]
+
+[slf5s.start]26 Jul 2001 15:54:45,063[slf5s.DATE]
+FATAL[slf5s.PRIORITY]
+[slf5s.NDC]
+main[slf5s.THREAD]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders[slf5s.CATEGORY]
+examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:134)[slf5s.LOCATION]
+Mmmmmm .... Chocolate.[slf5s.MESSAGE]
+
+java.lang.SecurityException: Fatal Exception
+	at examples.InitUsingMultipleAppenders.InitUsingMultipleAppenders.main(InitUsingMultipleAppenders.java:134)
diff --git a/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java b/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java
new file mode 100644
index 0000000..832ed95
--- /dev/null
+++ b/examples/lf5/UsingLogMonitorAdapter/CustomizedLogLevels.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software
+ * License version 1.1, a copy of which has been included with this
+ * distribution in the LICENSE.txt file.
+ */
+
+package examples.lf5.UsingLogMonitorAdapter;
+
+import org.apache.log4j.lf5.LogLevel;
+import org.apache.log4j.lf5.util.LogMonitorAdapter;
+
+/**
+ * This class is a simple example of how use the LogMonitorAdapter to
+ * bypass the Log4JAppender and post LogRecords directly to the LogMonitor
+ * using customized LogLevels
+ *
+ * To make this example work, ensure that the lf5.jar and lf5-license.jar
+ * files are in your classpath, and then run the example at the command line.
+ *
+ * @author Richard Hurst
+ */
+
+// Contributed by ThoughtWorks Inc.
+
+public class CustomizedLogLevels {
+    //--------------------------------------------------------------------------
+    //   Constants:
+    //--------------------------------------------------------------------------
+    public final static LogLevel LEVEL_ONE = new LogLevel("LEVEL 1", 1);
+    public final static LogLevel LEVEL_TWO = new LogLevel("LEVEL 2", 2);
+    public final static LogLevel LEVEL_THREE = new LogLevel("LEVEL 3", 3);
+    public final static LogLevel LEVEL_FOUR = new LogLevel("LEVEL 4", 4);
+    public final static LogLevel DEFAULT = new LogLevel("DEFAULT", 0);
+
+    //--------------------------------------------------------------------------
+    //   Protected Variables:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Variables:
+    //--------------------------------------------------------------------------
+    private static LogMonitorAdapter _adapter;
+
+    static {
+        // The first LogLevel in the Array will be used as the default LogLevel.
+        _adapter = LogMonitorAdapter.newInstance(new LogLevel[]{DEFAULT, LEVEL_ONE,
+                                                                LEVEL_TWO, LEVEL_THREE, LEVEL_FOUR, LogLevel.FATAL});
+        // if a different log level is to be used it can be specified as such
+        // _adapter.setDefaultLevel(LEVEL_THREE);
+    }
+    //--------------------------------------------------------------------------
+    //   Constructors:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Public Methods:
+    //--------------------------------------------------------------------------
+
+    public static void main(String[] args) {
+        CustomizedLogLevels test = new CustomizedLogLevels();
+        test.doMyBidding();
+    }
+
+    public void doMyBidding() {
+        // tell the LogMonitorAdapter which LogLevel is the severe Level if necessary
+        _adapter.setSevereLevel(LEVEL_ONE);
+
+        String levels = this.getClass().getName();
+
+        // will used the default Level
+        _adapter.log(levels, "Using the customized LogLevels");
+
+        _adapter.log(levels, LEVEL_FOUR, "This is a test");
+        _adapter.log(levels, LEVEL_THREE, "Hmmm fobidden doughnut");
+        _adapter.log(levels, LEVEL_ONE, "Danger Danger Will Robinson",
+                new RuntimeException("DANGER"), "32");
+        _adapter.log(levels, LEVEL_TWO, "Exit stage right->");
+        _adapter.log(levels, LEVEL_FOUR, "What's up Doc?",
+                new NullPointerException("Unfortunate exception"));
+
+    }
+
+    //--------------------------------------------------------------------------
+    //   Protected Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Nested Top-Level Classes or Interfaces:
+    //--------------------------------------------------------------------------
+}
+
+
+
+
+
diff --git a/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java
new file mode 100644
index 0000000..0484859
--- /dev/null
+++ b/examples/lf5/UsingLogMonitorAdapter/UsingLogMonitorAdapter.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software
+ * License version 1.1, a copy of which has been included with this
+ * distribution in the LICENSE.txt file.
+ */
+package examples.lf5.UsingLogMonitorAdapter;
+
+import org.apache.log4j.lf5.LogLevel;
+import org.apache.log4j.lf5.util.AdapterLogRecord;
+import org.apache.log4j.lf5.util.LogMonitorAdapter;
+
+/**
+ * This class is a simple example of how use the LogMonitorAdapter to
+ * bypass the Log4JAppender and post LogRecords directly to the LogMonitor
+ *
+ * To make this example work, ensure that the lf5.jar and lf5-license.jar
+ * files are in your classpath, and then run the example at the command line.
+ *
+ * @author Richard Hurst
+ */
+
+// Contributed by ThoughtWorks Inc.
+
+public class UsingLogMonitorAdapter {
+  //--------------------------------------------------------------------------
+  //   Constants:
+  //--------------------------------------------------------------------------
+
+  //--------------------------------------------------------------------------
+  //   Protected Variables:
+  //--------------------------------------------------------------------------
+
+  //--------------------------------------------------------------------------
+  //   Private Variables:
+  //--------------------------------------------------------------------------
+  private static LogMonitorAdapter _adapter;
+
+  static {
+    _adapter = LogMonitorAdapter.newInstance(LogMonitorAdapter.LOG4J_LOG_LEVELS);
+  }
+  //--------------------------------------------------------------------------
+  //   Constructors:
+  //--------------------------------------------------------------------------
+
+  //--------------------------------------------------------------------------
+  //   Public Methods:
+  //--------------------------------------------------------------------------
+
+  public static void main(String[] args) {
+    UsingLogMonitorAdapter test = new UsingLogMonitorAdapter();
+    test.doMyBidding();
+  }
+
+  public void doMyBidding() {
+    String logger = this.getClass().getName();
+
+    // will default to debug log level
+    _adapter.log(logger, "Doh this is a debugging");
+
+    _adapter.log(logger, LogLevel.INFO, "Hmmm fobidden doughnut");
+    _adapter.log(logger, LogLevel.WARN, "Danger Danger Will Robinson",
+        new RuntimeException("DANGER"), "32");
+    _adapter.log(logger, LogLevel.ERROR, "Exit stage right->");
+    _adapter.log(logger, LogLevel.FATAL, "What's up Doc?",
+        new NullPointerException("Unfortunate exception"));
+  }
+
+  //--------------------------------------------------------------------------
+  //   Protected Methods:
+  //--------------------------------------------------------------------------
+
+  //--------------------------------------------------------------------------
+  //   Private Methods:
+  //--------------------------------------------------------------------------
+
+  //--------------------------------------------------------------------------
+  //   Nested Top-Level Classes or Interfaces:
+  //--------------------------------------------------------------------------
+}
+
+
+
+
+
diff --git a/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java
new file mode 100644
index 0000000..4274890
--- /dev/null
+++ b/examples/lf5/UsingSocketAppenders/UsingSocketAppenders.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software
+ * License version 1.1, a copy of which has been included with this
+ * distribution in the LICENSE.txt file.
+ */
+
+package examples.lf5.UsingSocketAppenders;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
+import java.io.IOException;
+import java.net.URL;
+
+/**
+ * This is another simple example of how to use the LogFactor5
+ * logging console.
+ *
+ * The LF5Appender is the primary class that enables logging to the
+ * LogFactor5 logging window. If the following line is added to a properties
+ * file, the LF5Appender will be appended to the root category when
+ * the properties file is loaded:
+ *
+ *    log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
+ *
+ * To make this example work, you must ensure that the example.properties file
+ * is in your classpath.You can then run the example at the command line.
+ *
+ * @author Brent Sprecher
+ */
+
+// Contributed by ThoughtWorks Inc.
+
+public class UsingSocketAppenders {
+    //--------------------------------------------------------------------------
+    //   Constants:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Protected Variables:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Variables:
+    //--------------------------------------------------------------------------
+
+    private static Logger logger1 =
+            Logger.getLogger(UsingSocketAppenders.class);
+    private static Logger logger2 =
+            Logger.getLogger("TestClass.Subclass");
+    private static Logger logger3 =
+            Logger.getLogger("TestClass.Subclass.Subclass");
+    //--------------------------------------------------------------------------
+    //   Constructors:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Public Methods:
+    //--------------------------------------------------------------------------
+
+    public static void main(String argv[]) {
+        // Use a PropertyConfigurator to initialize from a property file.
+        String resource =
+                "/examples/lf5/UsingSocketAppenders/socketclient.properties";
+        URL configFileResource =
+                UsingSocketAppenders.class.getResource(resource);
+        PropertyConfigurator.configure(configFileResource);
+
+        // Add a bunch of logging statements ...
+        logger1.debug("Hello, my name is Homer Simpson.");
+        logger1.debug("Hello, my name is Lisa Simpson.");
+        logger2.debug("Hello, my name is Marge Simpson.");
+        logger2.debug("Hello, my name is Bart Simpson.");
+        logger3.debug("Hello, my name is Maggie Simpson.");
+
+        logger2.info("We are the Simpsons!");
+        logger2.info("Mmmmmm .... Chocolate.");
+        logger3.info("Homer likes chocolate");
+        logger3.info("Doh!");
+        logger3.info("We are the Simpsons!");
+
+        logger1.warn("Bart: I am through with working! Working is for chumps!" +
+                "Homer: Son, I'm proud of you. I was twice your age before " +
+                "I figured that out.");
+        logger1.warn("Mmm...forbidden donut.");
+        logger1.warn("D'oh! A deer! A female deer!");
+        logger1.warn("Truly, yours is a butt that won't quit." +
+                "- Bart, writing as Woodrow to Ms. Krabappel.");
+
+        logger2.error("Dear Baby, Welcome to Dumpsville. Population: you.");
+        logger2.error("Dear Baby, Welcome to Dumpsville. Population: you.",
+                new IOException("Dumpsville, USA"));
+        logger3.error("Mr. Hutz, are you aware you're not wearing pants?");
+        logger3.error("Mr. Hutz, are you aware you're not wearing pants?",
+                new IllegalStateException("Error !!"));
+
+
+        logger3.fatal("Eep.");
+
+        logger3.fatal("Mmm...forbidden donut.",
+                new SecurityException("Fatal Exception ... "));
+
+        logger3.fatal("D'oh! A deer! A female deer!");
+        logger2.fatal("Mmmmmm .... Chocolate.",
+                new SecurityException("Fatal Exception"));
+
+        // Put the main thread is put to sleep for 5 seconds to allow the
+        // SocketServer to process all incoming messages before the Socket is
+        // closed. This is done to overcome some basic limitations with the
+        // way the SocketServer and SocketAppender classes manage sockets.
+        try {
+            Thread.currentThread().sleep(5000);
+        } catch (InterruptedException ie) {
+        }
+
+    }
+
+    //--------------------------------------------------------------------------
+    //   Protected Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Private Methods:
+    //--------------------------------------------------------------------------
+
+    //--------------------------------------------------------------------------
+    //   Nested Top-Level Classes or Interfaces:
+    //--------------------------------------------------------------------------
+
+}
diff --git a/examples/lf5/UsingSocketAppenders/socketclient.properties b/examples/lf5/UsingSocketAppenders/socketclient.properties
new file mode 100644
index 0000000..b051365
--- /dev/null
+++ b/examples/lf5/UsingSocketAppenders/socketclient.properties
@@ -0,0 +1,18 @@
+# For the general syntax of property based configuration files see the
+# documenation of org.apache.log4j.PropertyConfigurator.
+
+# The root category uses the appender called A1. Since no priority is
+# specified, the root category assumes the default priority for root
+# which is DEBUG in log4j. The root category is the only category that
+# has a default priority. All other categories need not be assigned a
+# priority in which case they inherit their priority from the
+# hierarchy.
+
+log4j.rootCategory=, A1
+
+# A1 is set to be a LF5Appender which outputs to a swing
+# logging console. 
+  
+log4j.appender.A1=org.apache.log4j.net.SocketAppender
+log4j.appender.A1.RemoteHost=localhost
+log4j.appender.A1.Port=8887
diff --git a/examples/lf5/UsingSocketAppenders/socketserver.properties b/examples/lf5/UsingSocketAppenders/socketserver.properties
new file mode 100644
index 0000000..da14ac0
--- /dev/null
+++ b/examples/lf5/UsingSocketAppenders/socketserver.properties
@@ -0,0 +1,19 @@
+# For the general syntax of property based configuration files see the
+# documenation of org.apache.log4j.PropertyConfigurator.
+
+# The root category uses the appender called A1. Since no priority is
+# specified, the root category assumes the default priority for root
+# which is DEBUG in log4j. The root category is the only category that
+# has a default priority. All other categories need not be assigned a
+# priority in which case they inherit their priority from the
+# hierarchy.
+
+#log4j.rootCategory=DEBUG, A1
+log4j.rootCategory=, A1
+
+# A1 is set to be a LF5Appender which outputs to a swing
+# logging console. 
+
+#log4j.category.org.apache.log4j.net.SocketNode=DEBUG
+log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
+log4j.appender.A1.MaxNumberOfRecords=700
\ No newline at end of file
diff --git a/examples/lf5/index.html b/examples/lf5/index.html
new file mode 100644
index 0000000..9a39752
--- /dev/null
+++ b/examples/lf5/index.html
@@ -0,0 +1,11 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+  <head>
+  </head> 
+  <body bgcolor="#FFFFFF" text="#000000">
+ 
+    <p>See <a href="../../docs/lf5/examples.html">Examples</a>
+    section in the LogFactor5 user guide.
+    </p>
+  </body>
+</html>
diff --git a/examples/mycat.bad b/examples/mycat.bad
index 86ef942..fcfdc61 100644
--- a/examples/mycat.bad
+++ b/examples/mycat.bad
@@ -1,16 +1,18 @@
 
 # The usual stuff. Note that A1 is configured in root not in "some.cat"
-log4j.rootCategory=DEBUG, A1
+log4j.rootLogger=DEBUG, A1
 log4j.appender.A1=org.apache.log4j.ConsoleAppender
 
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%5p [%t] %c - %m%n
 
 # Set the priority of "some.cat" to TRACE (defined in
-# org.apache.log4j.xml.examples.XPriority). This will actually have
-# the side effect of instanciating a category object having the name
-# "some.cat" this will cause a ClassCastException if the category
-# object is cast as a MyCategory object.
+# examples.customLevel.XLevel). This will actually have the side
+# effect of instanciating a logger object having the name "some.cat"
+# this will cause a ClassCastException if the logger object is cast
+# as a MyLogger object.
+
+log4j.logger.some.cat=TRACE#examples.customLevel.XLevel
+
 
-log4j.category.some.cat=TRACE#org.apache.log4j.xml.examples.XPriority
 
diff --git a/examples/mycat.good b/examples/mycat.good
index 6d08136..c2e02ee 100644
--- a/examples/mycat.good
+++ b/examples/mycat.good
@@ -1,13 +1,13 @@
-# Setting the category factory to MyCategoryFactory solves the
+# Setting the logger factory to MyLoggerFactory solves the
 # ClassCastException problem encountered with the "mycat.bad"
 # configuration file.
 
-log4j.categoryFactory=org.apache.log4j.examples.MyCategoryFactory
+log4j.loggerFactory=examples.subclass.MyLoggerFactory
 
 
 # The usual stuff. Note that A1 is configured in root not in "some.cat"
 
-log4j.rootCategory=DEBUG, A1
+log4j.rootLogger=DEBUG, A1
 log4j.appender.A1=org.apache.log4j.ConsoleAppender
 
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
@@ -15,10 +15,10 @@ log4j.appender.A1.layout.ConversionPattern=%5p [%t] %c - %m%n
 
 
 # Set the priority of "some.cat" to TRACE (defined in
-# org.apache.log4j.xml.examples.XPriority). Since we specified
-# MyCategoryFactory as the category factory, the following line willl
-# also have the side effect of instanciating a MyCategory object
-# having the name "some.cat".
+# examples.customLevel.XLevel). Since we specified MyLoggerFactory as
+# the logger factory, the following line willl also have the side
+# effect of instanciating a MyLogger object having the name
+# "some.cat".
 
-log4j.category.some.cat=TRACE#org.apache.log4j.xml.examples.XPriority
+log4j.logger.some.cat=TRACE#examples.customLevel.XLevel
 
diff --git a/examples/subclass/MyLogger.java b/examples/subclass/MyLogger.java
index e91c46f..521dea5 100644
--- a/examples/subclass/MyLogger.java
+++ b/examples/subclass/MyLogger.java
@@ -50,16 +50,6 @@ public class MyLogger extends Logger {
   }
 
   /**
-     This method overrides {@link Logger#getInstance} by supplying
-     its own factory type as a parameter.
-  */
-  public 
-  static
-  Category getInstance(String name) {
-    return Logger.getLogger(name, myFactory); 
-  }
-  
-  /**
      This method overrides {@link Logger#getLogger} by supplying
      its own factory type as a parameter.
   */
diff --git a/examples/subclass/MyLoggerTest.java b/examples/subclass/MyLoggerTest.java
index 4f1ffa1..5c69dea 100644
--- a/examples/subclass/MyLoggerTest.java
+++ b/examples/subclass/MyLoggerTest.java
@@ -58,7 +58,7 @@ public class MyLoggerTest {
       usage("Incorrect number of parameters.");
     }
     try {
-      MyLogger c = (MyLogger) MyLogger.getInstance("some.cat");    
+      MyLogger c = (MyLogger) MyLogger.getLogger("some.cat");    
       c.trace("Hello");
       c.debug("Hello");
     } catch(ClassCastException e) {
diff --git a/slf4j.xml b/slf4j.xml
new file mode 100644
index 0000000..c314fb5
--- /dev/null
+++ b/slf4j.xml
@@ -0,0 +1,82 @@
+<project name="slf4j" default="usage" basedir="." >
+
+  <!-- The directory where source files are stored. -->
+  <property name="java.source.dir" value="./src/java/"/>
+
+  <!-- Destination for compiled files -->
+  <property name="javac.dest" value="./classes"/>
+	
+  <!-- The directory where source files are stored. -->
+  <property name="version" value="1.0alpha"/>
+
+  <!-- Deprecation warning? --> 
+  <property name="deprecation" value="on"/>
+
+	
+  <property name="SLF4J_STEM" value="org/slf4j"/>
+  
+
+  <!-- ================================================================= -->
+  <!-- Default target                                                    -->
+  <!-- ================================================================= -->
+  <target name="usage">
+    <echo>      
+      These are some of the targets supported by this ANT build scpript:
+      
+      svnCheckout - get SLF4J files into src/filtered-java
+
+      refresh-slf4j - copy source files into the log4j source tree, using
+    	              variable substitution
+    </echo>
+  </target>
+
+  <target name="init">
+    <mkdir dir="tmp"/>
+	<mkdir dir="${java.source.dir}/${SLF4J_STEM}"/>
+  </target>
+	
+  <!-- ================================================================= -->
+  <!-- Remove all generated (compiled) class files.                      -->
+  <!-- ================================================================= -->
+  <target name="clean" description="Delete all compiled SLF4J files.">
+    <delete dir="${javac.dest}/org/slf4j" />
+  </target>
+
+  <!-- =================================================================== -->
+  <!-- Copy SLF4J files into log4j source tree. This step is necessary for -->
+  <!-- building log4j. However, it needs to be done whenever code in SLF4J -->
+  <!-- changes, that is seldom                                             -->
+  <!-- =================================================================== -->
+  <target name="refresh-slf4j" depends="init, svnCheckout">	
+  	<!-- delete any stale copy of LoggerFactory.java -->
+ 	<delete>
+ 		<fileset dir="src/java/org/slf4j" 
+ 		         includes="**/*.java"
+	             excludes="impl/Log4jLoggerFA.java"/>
+ 	</delete>
+  	
+   	<!-- copy a filtered version of slf4j to tmp/src -->
+  	<copy todir="src/java">
+  	  <fileset dir="src/filtered-java">
+  	  	<include name="**/*.java"/>
+  	    <exclude name="**/impl/JDK14*.java"/>
+  	  </fileset>
+  	  <filterset><filter token="IMPL" value="Log4j"/></filterset>
+  	</copy>
+  </target>
+
+
+  <target name="svnCheckout">
+    <property name="repository.URL" value="http://svn.slf4j.org/repos/slf4j/trunk/src/filtered-java"/>
+	<java classname="org.tmatesoft.svn.cli.SVN" dir="src/" fork="true">
+	   <arg value="co"/>
+	   <arg value="${repository.URL}"/>
+	   <arg value="filtered-java"/>
+	   <classpath>
+	     <pathelement location="lib/javasvn.jar" />
+	     <pathelement location="lib/javasvn-cli.jar" />
+	   </classpath>
+	</java>
+  </target>
+	
+</project>
diff --git a/src/filtered-java/org/slf4j/LoggerFactory.java b/src/filtered-java/org/slf4j/LoggerFactory.java
new file mode 100644
index 0000000..e4bb471
--- /dev/null
+++ b/src/filtered-java/org/slf4j/LoggerFactory.java
@@ -0,0 +1,84 @@
+/* 
+ * Copyright (c) 2004-2005 SLF4J.ORG
+ *
+ * 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, and/or sell copies of  the Software, and to permit persons
+ * to whom  the Software is furnished  to do so, provided  that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the  Software and  that both  the above  copyright notice(s)  and this
+ * permission notice appear in supporting documentation.
+ * 
+ * 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
+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR
+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY
+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as  contained in  this notice, the  name of a  copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ */
+
+package org.slf4j;
+
+// WARNING
+// WARNING Modifications MUST be made to the original file found at
+// WARNING $SLF4J_HOME/src/filtered-java/org/slf4j/LoggerFactory.java
+// WARNING
+
+/**
+ * The <code>LoggerFactory</code> can produce Loggers for various logging APIs,
+ * most notably for log4j, JDK 1.4 logging. Other implemenations such as
+ * {@link org.slf4j.impl.NOPLogger NOPLogger} and
+ * {@link org.slf4j.impl.SimpleLogger SimpleLogger} are also supported.
+ *
+ * @author Ceki G&uuml;lc&uuml;
+ */
+public class LoggerFactory {
+  static LoggerFactoryAdapter adapter;
+
+  // 
+  // WARNING Modify the original in
+  //         $SLF4J_HOME/src/filtered-java/org/slf4j/
+  
+  static {
+    String adapterClassStr = "org.slf4j.impl.@IMPL@LoggerFA";
+    System.out.println("SLF4J built for "+adapterClassStr);
+    try {
+      adapter = new org.slf4j.impl.@IMPL@LoggerFA();
+    } catch (Exception e) {
+      // unless there was a problem with the build or the JVM we will never
+      // get exceptions
+      System.err.println(
+        "Could not instantiate instance of class [" + adapterClassStr + "]");
+      e.printStackTrace();
+    }
+  }
+
+  public static ULogger getLogger(String name) {
+    return adapter.getLogger(name);
+  }
+
+  public static ULogger getLogger(String domainName, String subDomainName) {
+    return adapter.getLogger(domainName, subDomainName);
+  }
+
+  public static ULogger getLogger(Class clazz) {
+    return adapter.getLogger(clazz.getName());
+  }
+
+  public static ULogger getLogger(Class clazz, String subDomainName) {
+    return adapter.getLogger(clazz.getName(), subDomainName);
+  }
+}
diff --git a/src/filtered-java/org/slf4j/LoggerFactoryAdapter.java b/src/filtered-java/org/slf4j/LoggerFactoryAdapter.java
new file mode 100644
index 0000000..55b047e
--- /dev/null
+++ b/src/filtered-java/org/slf4j/LoggerFactoryAdapter.java
@@ -0,0 +1,60 @@
+/* 
+ * Copyright (c) 2004-2005 SLF4J.ORG
+ * 
+ * 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, and/or sell copies of  the Software, and to permit persons
+ * to whom  the Software is furnished  to do so, provided  that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the  Software and  that both  the above  copyright notice(s)  and this
+ * permission notice appear in supporting documentation.
+ * 
+ * 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
+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR
+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY
+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as  contained in  this notice, the  name of a  copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ */
+
+package org.slf4j;
+
+/**
+ * LoggerFactoryAdapter interface is used internally by {@link
+ * LoggerFactory}.
+ * 
+ * <p>Only developers wishing to write new UGLI adapters need to worry
+ * about this interface.
+ * 
+ * @author Ceki G&uuml;lc&uuml;
+ *
+ */
+public interface LoggerFactoryAdapter {
+  
+  /**
+   * Return the appropriate named {@link ULogger} instance.
+   */
+  public ULogger getLogger(String name);
+  
+  /**
+   * Return a {@link ULogger} instance in <code>domain</code>, <code>subDomain</code>. 
+   *
+   * @param domain
+   * @param subDomain
+   * @return ULogger instance
+   */
+  public ULogger getLogger(String domain, String subDomain);  
+}
diff --git a/src/filtered-java/org/slf4j/ULogger.java b/src/filtered-java/org/slf4j/ULogger.java
new file mode 100644
index 0000000..279178e
--- /dev/null
+++ b/src/filtered-java/org/slf4j/ULogger.java
@@ -0,0 +1,104 @@
+/* 
+ * Copyright (c) 2004-2005 SLF4J.ORG
+ * 
+ * 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, and/or sell copies of  the Software, and to permit persons
+ * to whom  the Software is furnished  to do so, provided  that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the  Software and  that both  the above  copyright notice(s)  and this
+ * permission notice appear in supporting documentation.
+ * 
+ * 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
+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR
+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY
+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as  contained in  this notice, the  name of a  copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ */
+
+package org.slf4j;
+
+/**
+ * 
+ * The main user inteface to logging. It is expected that logging
+ * takes places through concerete implemetations of the ULogger
+ * interface.
+ * 
+ * @author Ceki G&uuml;lc&uuml;
+ */
+public interface ULogger {
+
+  /**
+   * Is the logger instance enabled for the DEBUG level?
+   * @return True if this ULogger is enabled for the DEBUG level,
+   * false otherwise.
+   */
+  public boolean isDebugEnabled();
+  
+  /**
+   * Log a message object with the DEBUG level. 
+   * @param msg - the message object to be logged
+   */
+  public void debug(Object msg);
+  
+  
+  /**
+   * Log a parameterized message object at the DEBUG level. 
+   * 
+   * <p>This form is useful in avoiding the superflous object creation
+   * problem when invoking this method while it is disabled.
+   * </p>
+   * @param parameterizedMsg - the parameterized message object
+   * @param param1 - the parameter 
+   */
+  public void debug(Object parameterizedMsg, Object param1);
+  
+  /**
+   * Log a parameterized message object at the DEBUG level. 
+   * 
+   * <p>This form is useful in avoiding the superflous object creation
+   * problem when invoking this method while it is disabled.
+   * </p>
+   * @param parameterizedMsg - the parameterized message object
+   * @param param1 - the first parameter 
+   * @param param2 - the second parameter 
+   */
+  public void debug(String parameterizedMsg, Object param1, Object param2);
+  public void debug(Object msg, Throwable t);
+
+
+  public boolean isInfoEnabled();
+  public void info(Object msg);
+  public void info(Object parameterizedMsg, Object param1);
+  public void info(String parameterizedMsg, Object param1, Object param2);
+  public void info(Object msg, Throwable t);
+
+
+  public boolean isWarnEnabled();
+  public void warn(Object msg);
+  public void warn(Object parameterizedMsg, Object param1);
+  public void warn(String parameterizedMsg, Object param1, Object param2);
+  public void warn(Object msg, Throwable t);
+
+
+  public boolean isErrorEnabled();
+  public void error(Object msg);
+  public void error(Object parameterizedMsg, Object param1);
+  public void error(String parameterizedMsg, Object param1, Object param2);
+  public void error(Object msg, Throwable t);
+
+}
diff --git a/src/filtered-java/org/slf4j/impl/JDK14Logger.java b/src/filtered-java/org/slf4j/impl/JDK14Logger.java
new file mode 100644
index 0000000..9ae8506
--- /dev/null
+++ b/src/filtered-java/org/slf4j/impl/JDK14Logger.java
@@ -0,0 +1,243 @@
+/* 
+ * Copyright (c) 2004-2005 SLF4J.ORG
+ * Copyright (c) 2004-2005 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, and/or sell copies of  the Software, and to permit persons
+ * to whom  the Software is furnished  to do so, provided  that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the  Software and  that both  the above  copyright notice(s)  and this
+ * permission notice appear in supporting documentation.
+ * 
+ * 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
+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR
+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY
+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as  contained in  this notice, the  name of a  copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ */
+
+package org.slf4j.impl;
+import org.slf4j.ULogger;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+/**
+ * A wrapper over @{link java.utill.Logger} which conforms to the 
+ * {@link ULogger} interface.
+ * 
+ * @author Ceki G&uuml;lc&uuml;
+ */
+public class JDK14Logger implements ULogger {
+  final Logger logger;
+
+  // WARN: JDK14Logger constructor should have only package access so that
+  // only JDK14LoggerFA be able to create one.
+  JDK14Logger(Logger logger) {
+    this.logger = logger;
+  }
+
+  /**
+   * Is the logger instance enabled for the DEBUG level?
+   * @return
+   */
+  public boolean isDebugEnabled() {
+    return logger.isLoggable(Level.FINE);
+  }
+
+  //
+
+  /**
+   * Log a message object with the DEBUG level.
+   * @param msg - the message object to be logged
+   */
+  public void debug(Object msg) {
+    logger.fine(String.valueOf(msg));
+  }
+
+  /**
+   * Log a parameterized message object at the DEBUG level.
+   *
+   * <p>This form is useful in avoiding the superflous object creation
+   * problem when invoking this method while it is disabled.
+   * </p>
+   * @param parameterizedMsg - the parameterized message object
+   * @param param1 - the parameter
+   */
+  public void debug(Object parameterizedMsg, Object param1) {
+    if (logger.isLoggable(Level.FINE)) {
+      if (parameterizedMsg instanceof String) {
+        String msgStr = (String) parameterizedMsg;
+        msgStr = MessageFormatter.format(msgStr, param1);
+        logger.fine(msgStr);
+      } else {
+        // To be failsafe, we handle the case where 'messagePattern' is not
+        // a String. Unless the user makes a mistake, this should not happen.
+        logger.fine(parameterizedMsg.toString());
+      }
+    }
+  }
+
+  /**
+   * Log a parameterized message object at the DEBUG level.
+   *
+   * <p>This form is useful in avoiding the superflous object creation
+   * problem when invoking this method while it is disabled.
+   * </p>
+   * @param parameterizedMsg - the parameterized message object
+   * @param param1 - the first parameter
+   * @param param2 - the second parameter
+   */
+  public void debug(String parameterizedMsg, Object param1, Object param2) {
+    if (logger.isLoggable(Level.FINE)) {
+      if (parameterizedMsg instanceof String) {
+        String msgStr = (String) parameterizedMsg;
+        msgStr = MessageFormatter.format(msgStr, param1, param2);
+        logger.fine(msgStr);
+      } else {
+        // To be failsafe, we handle the case where 'messagePattern' is not
+        // a String. Unless the user makes a mistake, this should not happen.
+        logger.fine(parameterizedMsg.toString());
+      }
+    }
+  }
+
+  public void debug(Object msg, Throwable t) {
+    logger.log(Level.FINE, msg.toString(), t);
+  }
+
+  public boolean isInfoEnabled() {
+    return logger.isLoggable(Level.INFO);
+  }
+
+  public void info(Object msg) {
+    logger.info(msg.toString());
+  }
+
+  public void info(Object parameterizedMsg, Object param1) {
+    if (logger.isLoggable(Level.INFO)) {
+      if (parameterizedMsg instanceof String) {
+        String msgStr = (String) parameterizedMsg;
+        msgStr = MessageFormatter.format(msgStr, param1);
+        logger.info(msgStr);
+      } else {
+        // To be failsafe, we handle the case where 'messagePattern' is not
+        // a String. Unless the user makes a mistake, this should not happen.
+        logger.info(parameterizedMsg.toString());
+      }
+    }
+  }
+
+  public void info(String parameterizedMsg, Object param1, Object param2) {
+    if (logger.isLoggable(Level.INFO)) {
+      if (parameterizedMsg instanceof String) {
+        String msgStr = (String) parameterizedMsg;
+        msgStr = MessageFormatter.format(msgStr, param1, param2);
+        logger.info(msgStr);
+      } else {
+        // To be failsafe, we handle the case where 'messagePattern' is not
+        // a String. Unless the user makes a mistake, this should not happen.
+        logger.info(parameterizedMsg.toString());
+      }
+    }
+  }
+
+  public void info(Object msg, Throwable t) {
+    logger.log(Level.INFO, msg.toString(), t);
+  }
+
+  public boolean isWarnEnabled() {
+    return logger.isLoggable(Level.WARNING);
+  }
+
+  public void warn(Object msg) {
+    logger.warning(msg.toString());
+  }
+
+  public void warn(Object parameterizedMsg, Object param1) {
+    if (logger.isLoggable(Level.WARNING)) {
+      if (parameterizedMsg instanceof String) {
+        String msgStr = (String) parameterizedMsg;
+        msgStr = MessageFormatter.format(msgStr, param1);
+        logger.warning(msgStr);
+      } else {
+        // To be failsafe, we handle the case where 'messagePattern' is not
+        // a String. Unless the user makes a mistake, this should not happen.
+        logger.warning(parameterizedMsg.toString());
+      }
+    }
+  }
+
+  public void warn(String parameterizedMsg, Object param1, Object param2) {
+    if (logger.isLoggable(Level.WARNING)) {
+      if (parameterizedMsg instanceof String) {
+        String msgStr = (String) parameterizedMsg;
+        msgStr = MessageFormatter.format(msgStr, param1, param2);
+        logger.warning(msgStr);
+      } else {
+        // To be failsafe, we handle the case where 'messagePattern' is not
+        // a String. Unless the user makes a mistake, this should not happen.
+        logger.warning(parameterizedMsg.toString());
+      }
+    }
+  }
+
+  public void warn(Object msg, Throwable t) {
+    logger.log(Level.WARNING, msg.toString(), t);
+  }
+
+  public boolean isErrorEnabled() {
+    return logger.isLoggable(Level.SEVERE);
+  }
+
+  public void error(Object msg) {
+    logger.severe(msg.toString());
+  }
+
+  public void error(Object parameterizedMsg, Object param1) {
+    if (logger.isLoggable(Level.WARNING)) {
+      if (parameterizedMsg instanceof String) {
+        String msgStr = (String) parameterizedMsg;
+        msgStr = MessageFormatter.format(msgStr, param1);
+        logger.severe(msgStr);
+      } else {
+        // To be failsafe, we handle the case where 'messagePattern' is not
+        // a String. Unless the user makes a mistake, this should not happen.
+        logger.severe(parameterizedMsg.toString());
+      }
+    }
+  }
+  
+  public void error(String parameterizedMsg, Object param1, Object param2) {
+    if (logger.isLoggable(Level.WARNING)) {
+      if (parameterizedMsg instanceof String) {
+        String msgStr = (String) parameterizedMsg;
+        msgStr = MessageFormatter.format(msgStr, param1, param2);
+        logger.severe(msgStr);
+      } else {
+        // To be failsafe, we handle the case where 'messagePattern' is not
+        // a String. Unless the user makes a mistake, this should not happen.
+        logger.severe(parameterizedMsg.toString());
+      }
+    }
+  }
+  public void error(Object msg, Throwable t) {
+    logger.log(Level.SEVERE, msg.toString(), t);
+  }
+}
diff --git a/src/filtered-java/org/slf4j/impl/JDK14LoggerFA.java b/src/filtered-java/org/slf4j/impl/JDK14LoggerFA.java
new file mode 100644
index 0000000..b90154c
--- /dev/null
+++ b/src/filtered-java/org/slf4j/impl/JDK14LoggerFA.java
@@ -0,0 +1,74 @@
+/* 
+ * Copyright (c) 2004-2005 SLF4J.ORG
+ * Copyright (c) 2004-2005 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, and/or sell copies of  the Software, and to permit persons
+ * to whom  the Software is furnished  to do so, provided  that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the  Software and  that both  the above  copyright notice(s)  and this
+ * permission notice appear in supporting documentation.
+ * 
+ * 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
+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR
+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY
+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as  contained in  this notice, the  name of a  copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ */
+
+package org.slf4j.impl;
+
+import org.slf4j.LoggerFactoryAdapter;
+import org.slf4j.ULogger;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+
+/**
+ *
+ * @author Ceki G&uuml;lc&uuml;
+ */
+public class JDK14LoggerFA implements LoggerFactoryAdapter {
+  Map map;
+
+  public JDK14LoggerFA() {
+    map = new HashMap();
+  }
+
+  /* (non-Javadoc)
+   * @see org.slf4j.LoggerFactoryAdapter#getLogger(java.lang.String)
+   */
+  public ULogger getLogger(String name) {
+    ULogger ulogger = (ULogger) map.get(name);
+    if (ulogger == null) {
+      Logger logger = Logger.getLogger(name);
+      ulogger = new JDK14Logger(logger);
+      map.put(name, ulogger);
+    }
+    return ulogger;
+  }
+
+  /* (non-Javadoc)
+   * @see org.slf4j.LoggerFactoryAdapter#getLogger(java.lang.String, java.lang.String)
+   */
+  public ULogger getLogger(String domainName, String subDomainName) {
+    return getLogger(domainName);
+  }
+}
diff --git a/src/filtered-java/org/slf4j/impl/MessageFormatter.java b/src/filtered-java/org/slf4j/impl/MessageFormatter.java
new file mode 100644
index 0000000..c650c39
--- /dev/null
+++ b/src/filtered-java/org/slf4j/impl/MessageFormatter.java
@@ -0,0 +1,143 @@
+/* 
+ * Copyright (c) 2004-2005 SLF4J.ORG
+ * Copyright (c) 2004-2005 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, and/or sell copies of  the Software, and to permit persons
+ * to whom  the Software is furnished  to do so, provided  that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the  Software and  that both  the above  copyright notice(s)  and this
+ * permission notice appear in supporting documentation.
+ * 
+ * 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
+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR
+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY
+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as  contained in  this notice, the  name of a  copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ */
+
+package org.slf4j.impl;
+
+
+/**
+ * Formats messages according to very simple rules. 
+ * See {@link #format(String, Object)} and 
+ * {@link #format(String, Object, Object)} for more details.
+ *
+ * @author Ceki G&uuml;lc&uuml;
+ */
+public class MessageFormatter {
+  static final char DELIM_START = '{';
+  static final char DELIM_STOP = '}';
+
+  /**
+   * Performs single argument substitution for the 'messagePattern' passed as
+   * parameter.
+   * <p>
+   * For example, <code>MessageFormatter.format("Hi {}.", "there");</code> will
+   * return the string "Hi there.".
+   * <p>
+   * The {} pair is called the formatting element. It serves to designate the
+   * location where the argument needs to be inserted within the pattern.
+   * 
+   * @param messagePattern The message pattern which will be parsed and formatted
+   * @param argument The argument to be inserted instead of the formatting element
+   * @return The formatted message
+   */
+  public static String format(String messagePattern, Object argument) {
+    int j = messagePattern.indexOf(DELIM_START);
+    int len = messagePattern.length();
+    char escape = 'x';
+
+    // if there are no { characters or { is the last character of the messsage
+    // then we just return messagePattern
+    if (j == -1 || (j+1 == len)) {
+      return messagePattern;
+    } else {
+      if(j+1 == len) {
+      }
+      
+      char delimStop = messagePattern.charAt(j + 1);
+      if (j > 0) {
+        escape = messagePattern.charAt(j - 1);
+      }
+      if ((delimStop != DELIM_STOP) || (escape == '\\')) {
+        // invalid DELIM_START/DELIM_STOP pair or espace character is
+        // present
+        return messagePattern;
+      } else {
+        StringBuffer sbuf = new StringBuffer(len + 20);
+        sbuf.append(messagePattern.substring(0, j));
+        sbuf.append(argument);
+        sbuf.append(messagePattern.substring(j + 2));
+        return sbuf.toString();
+      }
+    }
+  }
+
+  /**
+   * /**
+   * Performs a two argument substitution for the 'messagePattern' passed as
+   * parameter.
+   * <p>
+   * For example, <code>MessageFormatter.format("Hi {}. My name is {}.", 
+   * "there", "David");</code> will return the string "Hi there. My name is David.".
+   * <p>
+   * The '{}' pair is called a formatting element. It serves to designate the
+   * location where the arguments need to be inserted within the message pattern.
+   * 
+   * @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
+   * @return The formatted message
+   */
+  public static String format(String messagePattern, Object arg1, Object arg2) {
+    int i = 0;
+    int len = messagePattern.length();
+    int j = messagePattern.indexOf(DELIM_START);
+
+    StringBuffer sbuf = new StringBuffer(messagePattern.length() + 50);
+
+    for (int L = 0; L < 2; L++) {
+      j = messagePattern.indexOf(DELIM_START, i);
+
+      if (j == -1 || (j+1 == len)) {
+        // no more variables
+        if (i == 0) { // this is a simple string
+          return messagePattern;
+        } else { // add the tail string which contains no variables and return the result.
+          sbuf.append(messagePattern.substring(i, messagePattern.length()));
+          return sbuf.toString();
+        }
+      } else {
+        char delimStop = messagePattern.charAt(j + 1);
+        if ((delimStop != DELIM_STOP)) {
+          // invalid DELIM_START/DELIM_STOP pair
+          sbuf.append(messagePattern.substring(i, messagePattern.length()));
+          return sbuf.toString();
+        }
+        sbuf.append(messagePattern.substring(i, j));
+        sbuf.append((L == 0) ? arg1 : arg2);
+        i = j + 2;
+      }
+    }
+    // append the characters following the second {} pair.
+    sbuf.append(messagePattern.substring(i, messagePattern.length()));
+    return sbuf.toString();
+  }
+}
diff --git a/src/filtered-java/org/slf4j/impl/NOPLogger.java b/src/filtered-java/org/slf4j/impl/NOPLogger.java
new file mode 100644
index 0000000..d0c4820
--- /dev/null
+++ b/src/filtered-java/org/slf4j/impl/NOPLogger.java
@@ -0,0 +1,200 @@
+/* 
+ * Copyright (c) 2004-2005 SLF4J.ORG
+ * Copyright (c) 2004-2005 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, and/or sell copies of  the Software, and to permit persons
+ * to whom  the Software is furnished  to do so, provided  that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the  Software and  that both  the above  copyright notice(s)  and this
+ * permission notice appear in supporting documentation.
+ * 
+ * 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
+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR
+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY
+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as  contained in  this notice, the  name of a  copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ */
+
+package org.slf4j.impl;
+
+import org.slf4j.ULogger;
+
+
+/**
+ * A no operation (NOP) implementation of {@link ULogger}.
+ * 
+ * @author Ceki G&uuml;lc&uuml;
+ */
+public class NOPLogger implements ULogger {
+
+  /**
+   * The unique instance of NOPLogger.
+   */
+  public final static NOPLogger NOP_LOGGER = new NOPLogger();
+  
+  /**
+   * There is no point in people creating multiple instances of NullLogger. 
+   * Hence, the private access modifier. 
+   */
+  private NOPLogger() {
+  }
+  
+  /* Always returns false.
+   * 
+   * @see org.slf4j.Logger#isDebugEnabled()
+   */
+  public boolean isDebugEnabled() {
+    return false;
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#debug(java.lang.Object)
+   */
+  public void debug(Object msg) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#debug(java.lang.Object, java.lang.Object)
+   */
+  public void debug(Object parameterizedMsg, Object param1) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#debug(java.lang.Object, java.lang.Object, java.lang.Object)
+   */
+  public void debug(String parameterizedMsg, Object param1, Object param2) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#debug(java.lang.Object, java.lang.Throwable)
+   */
+  public void debug(Object msg, Throwable t) {
+    // NOP
+  }
+
+  /* Always returns false.
+   * @see org.slf4j.Logger#isInfoEnabled()
+   */
+  public boolean isInfoEnabled() {
+    // NOP
+    return false;
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#info(java.lang.Object)
+   */
+  public void info(Object msg) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#info(java.lang.Object, java.lang.Object)
+   */
+  public void info(Object parameterizedMsg, Object param1) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#info(java.lang.Object, java.lang.Object, java.lang.Object)
+   */
+  public void info(String parameterizedMsg, Object param1, Object param2) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#info(java.lang.Object, java.lang.Throwable)
+   */
+  public void info(Object msg, Throwable t) {
+    // NOP
+  }
+
+  /* Always returns false.
+   * @see org.slf4j.Logger#isWarnEnabled()
+   */
+  public boolean isWarnEnabled() {
+    return false;
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#warn(java.lang.Object)
+   */
+  public void warn(Object msg) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#warn(java.lang.Object, java.lang.Object)
+   */
+  public void warn(Object parameterizedMsg, Object param1) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#warn(java.lang.Object, java.lang.Object, java.lang.Object)
+   */
+  public void warn(String parameterizedMsg, Object param1, Object param2) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#warn(java.lang.Object, java.lang.Throwable)
+   */
+  public void warn(Object msg, Throwable t) {
+    // NOP
+  }
+
+  /* Always returns false.
+   * @see org.slf4j.Logger#isErrorEnabled()
+   */
+  public boolean isErrorEnabled() {
+    return false;
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#error(java.lang.Object)
+   */
+  public void error(Object msg) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#error(java.lang.Object, java.lang.Object)
+   */
+  public void error(Object parameterizedMsg, Object param1) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#error(java.lang.Object, java.lang.Object, java.lang.Object)
+   */
+  public void error(String parameterizedMsg, Object param1, Object param2) {
+    // NOP
+  }
+
+  /* A NOP implementation.
+   * @see org.slf4j.Logger#error(java.lang.Object, java.lang.Throwable)
+   */
+  public void error(Object msg, Throwable t) {
+    // NOP
+  }
+
+}
diff --git a/src/filtered-java/org/slf4j/impl/NOPLoggerFA.java b/src/filtered-java/org/slf4j/impl/NOPLoggerFA.java
new file mode 100644
index 0000000..2d321ad
--- /dev/null
+++ b/src/filtered-java/org/slf4j/impl/NOPLoggerFA.java
@@ -0,0 +1,58 @@
+/* 
+ * Copyright (c) 2004-2005 SLF4J.ORG
+ * Copyright (c) 2004-2005 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, and/or sell copies of  the Software, and to permit persons
+ * to whom  the Software is furnished  to do so, provided  that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the  Software and  that both  the above  copyright notice(s)  and this
+ * permission notice appear in supporting documentation.
+ * 
+ * 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
+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR
+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY
+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as  contained in  this notice, the  name of a  copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ */
+
+package org.slf4j.impl;
+
+import org.slf4j.LoggerFactoryAdapter;
+import org.slf4j.ULogger;
+
+
+/**
+ * NOPLoggerFA is am implementation of {@link LoggerFactoryAdapter}
+ * which always returns the unique instance of NOPLogger.
+ * 
+ * @author Ceki Gulcu
+ */
+public class NOPLoggerFA implements LoggerFactoryAdapter {
+  
+  public NOPLoggerFA() {
+    // nothing to do
+  }
+  
+  public ULogger getLogger(String name) {
+    return NOPLogger.NOP_LOGGER;
+  }
+  public ULogger getLogger(String domainName, String subDomainName) {
+    return NOPLogger.NOP_LOGGER;  
+  }  
+}
diff --git a/src/filtered-java/org/slf4j/impl/SimpleLogger.java b/src/filtered-java/org/slf4j/impl/SimpleLogger.java
new file mode 100644
index 0000000..7b8be4a
--- /dev/null
+++ b/src/filtered-java/org/slf4j/impl/SimpleLogger.java
@@ -0,0 +1,290 @@
+/* 
+ * Copyright (c) 2004-2005 SLF4J.ORG
+ * Copyright (c) 2004-2005 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, and/or sell copies of  the Software, and to permit persons
+ * to whom  the Software is furnished  to do so, provided  that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the  Software and  that both  the above  copyright notice(s)  and this
+ * permission notice appear in supporting documentation.
+ * 
+ * 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
+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR
+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY
+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as  contained in  this notice, the  name of a  copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ */
+
+package org.slf4j.impl;
+
+import org.slf4j.ULogger;
+
+
+/**
+ * A simple implementation that logs messages of level INFO or higher on
+ * the console (<code>System.out<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.
+ * <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 SortAlgo.DUMP - Dump of interger array:
+317 [main] INFO SortAlgo.DUMP - Element [0] = 0
+331 [main] INFO SortAlgo.DUMP - Element [1] = 1
+343 [main] INFO examples.Sort - The next log statement should be an error message.
+346 [main] ERROR SortAlgo.DUMP - 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&uuml;lc&uuml;
+ */
+public class SimpleLogger implements ULogger {
+
+  String loggerName;
+  
+  /**
+   * Mark the time when this class gets loaded into memory.
+   */
+  static private long startTime = System.currentTimeMillis();
+  
+  public static final String LINE_SEPARATOR = System.getProperty("line.separator");
+  
+  static private String INFO_STR = "INFO";
+  static private String WARN_STR = "WARN";
+  static private String ERROR_STR = "ERROR";
+  
+  /**
+   * Package access allows only {@link SimpleLoggerFA} to instantiate 
+   * SimpleLogger instances.
+   */
+  SimpleLogger(String name) {
+    this.loggerName = name;
+  }
+  
+  /**
+   * Always returns false.
+   */
+  public boolean isDebugEnabled() {
+    return false;
+  }
+
+  /**
+   * A NOP implementation.
+   */
+  public void debug(Object msg) {
+    // NOP
+  }
+
+  /**
+   * A NOP implementation.
+   */
+  public void debug(Object parameterizedMsg, Object param1) {
+    // NOP
+  }
+
+  /**
+   * A NOP implementation.
+   */
+  public void debug(String parameterizedMsg, Object param1, Object param2) {
+    // NOP
+  }
+
+  /**
+   * A NOP implementation.
+   */
+  public void debug(Object msg, Throwable t) {
+    // NOP
+  }
+
+  /**
+   * This is our internal implementation for logging regular (non-parameterized)
+   * log messages.
+   * 
+   * @param level
+   * @param message
+   * @param t
+   */
+  private void log(String level, String message, Throwable t) {
+    StringBuffer buf = new StringBuffer();
+    
+    long millis  = System.currentTimeMillis();
+    buf.append(millis-startTime);
+    
+    buf.append(" [");
+    buf.append(Thread.currentThread().getName());
+    buf.append("] ");
+    
+    buf.append(level);
+    buf.append(" ");
+    
+    buf.append(loggerName);
+    buf.append(" - ");
+
+    buf.append(message);
+
+    buf.append(LINE_SEPARATOR);
+    
+    System.out.print(buf.toString());
+    if(t != null) {
+      t.printStackTrace(System.out);
+    }
+    System.out.flush();
+  }
+  /**
+   * For parameterized messages, first substitute parameters and then log.
+   * 
+   * @param level
+   * @param parameterizedMsg
+   * @param param1
+   * @param param2
+   */
+  private void parameterizedLog(String level, Object parameterizedMsg, Object param1, Object param2) {
+    if (parameterizedMsg instanceof String) {
+      String msgStr = (String) parameterizedMsg;
+      msgStr = MessageFormatter.format(msgStr, param1, param2);
+      log(level, msgStr, null);
+    } else {
+      // To be failsafe, we handle the case where 'messagePattern' is not
+      // a String. Unless the user makes a mistake, this should not happen.
+      log(level, parameterizedMsg.toString(), null);
+    }
+  }
+  
+  /**
+   * Always returns true.
+   */
+  public boolean isInfoEnabled() {
+    return true;
+  }
+
+  /**
+   * A simple implementation which always logs messages of level INFO according
+   * to the format outlined above.
+   */
+  public void info(Object msg) {
+    log(INFO_STR, msg.toString(), null);
+  }
+
+  
+  /**
+   * Perform single parameter substituion before logging the message of level 
+   * INFO according to the format outlined above.
+   */
+  public void info(Object parameterizedMsg, Object param1) {
+    parameterizedLog(INFO_STR, parameterizedMsg, param1, null);
+  }
+
+  /**
+   * Perform double parameter substituion before logging the message of level 
+   * INFO according to the format outlined above.
+   */
+  
+  public void info(String parameterizedMsg, Object param1, Object param2) {
+    parameterizedLog(INFO_STR, parameterizedMsg, param1, param2);
+  }
+
+  /** 
+   * Log a message of level INFO, including an exception.
+   */
+  public void info(Object msg, Throwable t) {
+    log(INFO_STR, msg.toString(), t);
+  }
+
+  /**
+   * Always returns true.
+   */
+  public boolean isWarnEnabled() {
+    return true;
+  }
+
+  /**
+   * A simple implementation which always logs messages of level WARN according
+   * to the format outlined above.
+  */
+  public void warn(Object msg) {
+    log(WARN_STR, msg.toString(), null);
+  }
+
+  /**
+   * Perform single parameter substituion before logging the message of level 
+   * WARN according to the format outlined above.
+   */
+  public void warn(Object parameterizedMsg, Object param1) {
+    parameterizedLog(WARN_STR, parameterizedMsg, param1, null);
+  }
+
+  /**
+   * Perform double parameter substituion before logging the message of level 
+   * WARN according to the format outlined above.
+   */
+  public void warn(String parameterizedMsg, Object param1, Object param2) {
+    parameterizedLog(WARN_STR, parameterizedMsg, param1, param2);
+  }
+
+  /**
+   * Log a message of level WARN, including an exception.
+   */
+  public void warn(Object msg, Throwable t) {
+    log(WARN_STR, msg.toString(), t);
+  }
+
+  /**
+   * Always returns true.
+   */
+  public boolean isErrorEnabled() {
+    return true;
+  }
+
+  /**
+   * A simple implementation which always logs messages of level ERROR acoording
+   * to the format outlined above.
+   */
+  public void error(Object msg) {
+    log(ERROR_STR, msg.toString(), null);
+  }
+
+
+  /**
+   * Perform single parameter substituion before logging the message of level 
+   * ERROR according to the format outlined above.
+   */
+  public void error(Object parameterizedMsg, Object param1) {
+    parameterizedLog(ERROR_STR, parameterizedMsg, param1, null);
+  }
+
+  /**
+   * Perform double parameter substituion before logging the message of level 
+   * ERROR according to the format outlined above.
+   */
+  public void error(String parameterizedMsg, Object param1, Object param2) {
+    parameterizedLog(ERROR_STR, parameterizedMsg, param1, param2);
+  }
+
+  /** 
+   * Log a message of level ERROR, including an exception.
+   */
+  public void error(Object msg, Throwable t) {
+    log(ERROR_STR, msg.toString(), t);
+  }
+
+}
diff --git a/src/filtered-java/org/slf4j/impl/SimpleLoggerFA.java b/src/filtered-java/org/slf4j/impl/SimpleLoggerFA.java
new file mode 100644
index 0000000..6b04340
--- /dev/null
+++ b/src/filtered-java/org/slf4j/impl/SimpleLoggerFA.java
@@ -0,0 +1,83 @@
+/* 
+ * Copyright (c) 2004-2005 SLF4J.ORG
+ * Copyright (c) 2004-2005 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, and/or sell copies of  the Software, and to permit persons
+ * to whom  the Software is furnished  to do so, provided  that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the  Software and  that both  the above  copyright notice(s)  and this
+ * permission notice appear in supporting documentation.
+ * 
+ * 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
+ * OF  THIRD PARTY  RIGHTS. IN  NO EVENT  SHALL THE  COPYRIGHT  HOLDER OR
+ * HOLDERS  INCLUDED IN  THIS  NOTICE BE  LIABLE  FOR ANY  CLAIM, OR  ANY
+ * SPECIAL INDIRECT  OR CONSEQUENTIAL DAMAGES, OR  ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS  OF USE, DATA OR PROFITS, WHETHER  IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE  OR OTHER TORTIOUS  ACTION, ARISING OUT OF  OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as  contained in  this notice, the  name of a  copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ */
+
+package org.slf4j.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.slf4j.LoggerFactoryAdapter;
+import org.slf4j.ULogger;
+
+
+/**
+ * An implementation of {@link LoggerFactoryAdapter} which always returns
+ * {@link SimpleLogger} instances.
+ * 
+ * @author Ceki G&uuml;lc&uuml;
+ */
+public class SimpleLoggerFA implements LoggerFactoryAdapter {
+
+  Map map;
+  
+  public SimpleLoggerFA() {
+    map = new HashMap();
+  }
+
+
+  /**
+   * Return an appropriate {@link SimpleLogger} instance by name. At this time,
+   * 
+   */
+  /**
+   * Return an appropriate {@link SimpleLogger} instance.
+   * */
+  public ULogger getLogger(String name) {
+    ULogger ulogger = (ULogger) map.get(name);
+    if(ulogger == null) {
+      ulogger = new SimpleLogger(name);
+      map.put(name, ulogger);
+    }
+    return ulogger;
+  }
+
+  /*
+   *  (non-Javadoc)
+   * @see org.slf4j.LoggerFactoryAdapter#getLogger(java.lang.String, java.lang.String)
+   */
+  public ULogger getLogger(String domainName, String subDomainName) {
+    return getLogger(domainName);
+  }
+  
+  
+}
diff --git a/src/java/org/apache/log4j/Appender.java b/src/java/org/apache/log4j/Appender.java
index 3642811..aa8a310 100644
--- a/src/java/org/apache/log4j/Appender.java
+++ b/src/java/org/apache/log4j/Appender.java
@@ -73,7 +73,7 @@ public interface Appender {
   /**
      Set the {@link ErrorHandler} for this appender.
 
-     @ since 0.9.0
+     @since 0.9.0
    */
   public
   void setErrorHandler(ErrorHandler errorHandler);
diff --git a/src/java/org/apache/log4j/AppenderSkeleton.java b/src/java/org/apache/log4j/AppenderSkeleton.java
index caf95ba..d815fcd 100644
--- a/src/java/org/apache/log4j/AppenderSkeleton.java
+++ b/src/java/org/apache/log4j/AppenderSkeleton.java
@@ -17,13 +17,14 @@ import org.apache.log4j.helpers.LogLog;
 
 
 /** 
-   Abstract superclass of the other appenders in the package.
-   
-   This class provides the code for common functionality, such as
-   support for threshold filtering and support for general filters.
-
-   @since 0.8.1
-   @author Ceki G&uuml;lc&uuml; */
+ * Abstract superclass of the other appenders in the package.
+ *  
+ *  This class provides the code for common functionality, such as
+ *  support for threshold filtering and support for general filters.
+ *
+ * @since 0.8.1
+ * @author Ceki G&uuml;lc&uuml; 
+ * */
 public abstract class AppenderSkeleton implements Appender, OptionHandler {
 
   /** The layout variable does not need to be set if the appender
@@ -99,11 +100,10 @@ public abstract class AppenderSkeleton implements Appender, OptionHandler {
   }
 
   /**
-     Finalize this appender by calling the imlenentation's
+     Finalize this appender by calling the derived class'
      <code>close</code> method.
 
-     @since 0.8.4
-  */
+     @since 0.8.4 */
   public
   void finalize() {
     // An appender might be closed then garbage collected. There is no
@@ -191,11 +191,10 @@ public abstract class AppenderSkeleton implements Appender, OptionHandler {
 
 
   /**
-     This method performs threshold checks and invokes filters before
-     delegating actual logging to the subclasses specific {@link
-     AppenderSkeleton#append} method.
-
-   */
+    * This method performs threshold checks and invokes filters before
+    * delegating actual logging to the subclasses specific {@link
+    * AppenderSkeleton#append} method.
+    * */
   public
   synchronized 
   void doAppend(LoggingEvent event) {
@@ -204,7 +203,7 @@ public abstract class AppenderSkeleton implements Appender, OptionHandler {
       return;
     }
     
-    if(!isAsSevereAsThreshold(event.level)) {
+    if(!isAsSevereAsThreshold(event.getLevel())) {
       return;
     }
 
diff --git a/src/java/org/apache/log4j/AsyncAppender.java b/src/java/org/apache/log4j/AsyncAppender.java
index e9fb7d6..33bc061 100644
--- a/src/java/org/apache/log4j/AsyncAppender.java
+++ b/src/java/org/apache/log4j/AsyncAppender.java
@@ -33,11 +33,7 @@ import java.util.Enumeration;
 
    <p><b>Important note:</b> The <code>AsyncAppender</code> can only
    be script configured using the {@link
-   org.apache.log4j.xml.DOMConfigurator}. Refer to example  configuration
-   files <a href="xml/examples/doc-files/sample4.xml">sample4.xml</a>
-   and <a href="xml/examples/doc-files/sample5.xml">sample5.xml</a>.
-
-
+   org.apache.log4j.xml.DOMConfigurator}.
 
    @author Ceki G&uuml;lc&uuml;
    @since 0.9.1 */
@@ -57,8 +53,7 @@ public class AsyncAppender extends AppenderSkeleton
 
   boolean interruptedWarningMessage = false;
 
-  public
-  AsyncAppender() {
+  public AsyncAppender() {
     // Note: The dispatcher code assumes that the aai is set once and
     // for all.
     aai = new AppenderAttachableImpl();
@@ -67,15 +62,13 @@ public class AsyncAppender extends AppenderSkeleton
   }
 
 
-  public
-  void addAppender(Appender newAppender) {
+  public void addAppender(Appender newAppender) {
     synchronized(aai) {
       aai.addAppender(newAppender);
     }
   }
 
-  public
-  void append(LoggingEvent event) {
+  public void append(LoggingEvent event) {
     // Set the NDC and thread name for the calling thread as these
     // LoggingEvent fields were not set at event creation time.
     event.getNDC();
@@ -114,8 +107,7 @@ public class AsyncAppender extends AppenderSkeleton
      dispatcher thread which will process all pending events before
      exiting.
   */
-  public
-  void close() {
+  public void close() {
     synchronized(this) {
       // avoid multiple close, otherwise one gets NullPointerException
       if(closed) { 
@@ -139,15 +131,13 @@ public class AsyncAppender extends AppenderSkeleton
     bf = null;
   }
 
-  public
-  Enumeration getAllAppenders() {
+  public Enumeration getAllAppenders() {
     synchronized(aai) {
       return aai.getAllAppenders();
     }
   }
 
-  public
-  Appender getAppender(String name) {
+  public Appender getAppender(String name) {
     synchronized(aai) {
       return aai.getAppender(name);
     }
@@ -156,89 +146,80 @@ public class AsyncAppender extends AppenderSkeleton
   /**
      Returns the current value of the <b>LocationInfo</b> option.
   */
-  public
-  boolean getLocationInfo() {
+  public boolean getLocationInfo() {
     return locationInfo;
   }
 
   /**
      Is the appender passed as parameter attached to this category?
    */
-  public
-  boolean isAttached(Appender appender) {
+  public boolean isAttached(Appender appender) {
     return aai.isAttached(appender);
   }
 
 
   /**
      The <code>AsyncAppender</code> does not require a layout. Hence,
-     this method always returns <code>false</code>. */
-  public
-  boolean requiresLayout() {
+     this method always returns <code>false</code>. 
+  */
+  public boolean requiresLayout() {
     return false;
   }
 
-  public
-  void removeAllAppenders() {
+  public void removeAllAppenders() {
     synchronized(aai) {
       aai.removeAllAppenders();
     }
   }
 
 
-  public
-  void removeAppender(Appender appender) {
+  public void removeAppender(Appender appender) {
     synchronized(aai) {
       aai.removeAppender(appender);
     }
   }
 
-  public
-  void removeAppender(String name) {
+  public void removeAppender(String name) {
     synchronized(aai) {
       aai.removeAppender(name);
     }
   }
 
   /**
-     The <b>LocationInfo</b> option takes a boolean value. By
-     default, it is set to false which means there will be no effort
-     to extract the location information related to the event. As a
-     result, the event that will be ultimately logged will likely to
-     contain the wrong location information (if present in the log
-     format).
-
-     <p>Location information extraction is comparatively very slow and
-     should be avoided unless performance is not a concern.
-   */
-  public
-  void setLocationInfo(boolean flag) {
+   * The <b>LocationInfo</b> option takes a boolean value. By default,
+   * it is set to false which means there will be no effort to extract
+   * the location information related to the event. As a result, the
+   * event that will be ultimately logged will likely to contain the
+   * wrong location information (if present in the log format).
+   *
+   * <p>Location information extraction is comparatively very slow and
+   * should be avoided unless performance is not a concern.
+   * */
+  public void setLocationInfo(boolean flag) {
     locationInfo = flag;
   }
 
 
   /**
-     The <b>BufferSize</b> option takes a non-negative integer
-     value.  This integer value determines the maximum size of the
-     bounded buffer. Increasing the size of the buffer is always
-     safe. However, if an existing buffer holds unwritten elements,
-     then <em>decreasing the buffer size will result in event
-     loss.</em> Nevertheless, while script configuring the
-     AsyncAppender, it is safe to set a buffer size smaller than the
-     {@link #DEFAULT_BUFFER_SIZE default buffer size} because
-     configurators guarantee that an appender cannot be used before
-     being completely configured.
-   */
-  public
-  void setBufferSize(int size) {
+   * The <b>BufferSize</b> option takes a non-negative integer value.
+   * This integer value determines the maximum size of the bounded
+   * buffer. Increasing the size of the buffer is always
+   * safe. However, if an existing buffer holds unwritten elements,
+   * then <em>decreasing the buffer size will result in event
+   * loss.</em> Nevertheless, while script configuring the
+   * AsyncAppender, it is safe to set a buffer size smaller than the
+   * {@link #DEFAULT_BUFFER_SIZE default buffer size} because
+   * configurators guarantee that an appender cannot be used before
+   * being completely configured.  
+   * */
+  public void setBufferSize(int size) {
     bf.resize(size);
   }
 
   /**
      Returns the current value of the <b>BufferSize</b> option.
    */
-  public
-  int getBufferSize() {
+  public int getBufferSize() {
     return bf.getMaxSize();
   }
 
@@ -256,10 +237,14 @@ class Dispatcher extends Thread {
   Dispatcher(BoundedFIFO bf, AsyncAppender container) {
     this.bf = bf;
     this.container = container;
-    this.aai = container.aai;
+    this.aai = container.aai;    
+    // It is the user's responsibility to close appenders before
+    // exiting. 
+    this.setDaemon(true);
     // set the dispatcher priority to lowest possible value
     this.setPriority(Thread.MIN_PRIORITY);
     this.setName("Dispatcher-"+getName());
+
     // set the dispatcher priority to MIN_PRIORITY plus or minus 2
     // depending on the direction of MIN to MAX_PRIORITY.
     //+ (Thread.MAX_PRIORITY > Thread.MIN_PRIORITY ? 1 : -1)*2);
@@ -289,8 +274,7 @@ class Dispatcher extends Thread {
     <p>Other approaches might yield better results.
 
   */
-  public
-  void run() {
+  public void run() {
 
     //Category cat = Category.getInstance(Dispatcher.class.getName());
 
@@ -302,7 +286,7 @@ class Dispatcher extends Thread {
 	  // Exit loop if interrupted but only if the the buffer is empty.
 	  if(interrupted) {
 	    //cat.info("Exiting.");
-	    return;
+	    break;
 	  }
 	  try {
 	    //LogLog.debug("Waiting for new event to dispatch.");
@@ -327,5 +311,8 @@ class Dispatcher extends Thread {
 	}
       }
     } // while
+    
+    // close and remove all appenders
+    aai.removeAllAppenders();
   }
 }
diff --git a/src/java/org/apache/log4j/Category.java b/src/java/org/apache/log4j/Category.java
index 110b86d..f8dfdf4 100644
--- a/src/java/org/apache/log4j/Category.java
+++ b/src/java/org/apache/log4j/Category.java
@@ -31,42 +31,50 @@ import java.util.Enumeration;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
+import org.slf4j.impl.MessageFormatter;
 
 /**
-   <font color="#AA2222"><b>This class has been deprecated and
-   replaced by the {@link Logger} <em>subclass</em>.</b></font> It
-   will be kept around to preserve backward compatibility until mid
-   2003.
-
-   <p><code>Logger</code> is a subclass of Category, i.e. it extends
-   Category. In other words, a logger <em>is</em> a category. Thus,
-   all operations that can be performed on a category can be performed
-   on a logger. Whenever log4j is asked to produce a Category object,
-   it will instead produce a Logger object. However, methods that
-   previously accepted category objects still continue to accept
-   category objects.
-
-   <p>For example, the following are all legal and will work as expected.
-
+  * <font color="#AA2222"><b>This class has been deprecated and
+  * replaced by the {@link Logger} <em>subclass</em></b></font>. It
+  * will be kept around to preserve backward compatibility until mid
+  * 2003.
+  * 
+  * <p><code>Logger</code> is a subclass of Category, i.e. it extends
+  * Category. In other words, a logger <em>is</em> a category. Thus,
+  * all operations that can be performed on a category can be
+  * performed on a logger. Internally, whenever log4j is asked to
+  * produce a Category object, it will instead produce a Logger
+  * object. Log4j 1.2 will <em>never</em> produce Category objects but
+  * only <code>Logger</code> instances. In order to preserve backward
+  * compatibility, methods that previously accepted category objects
+  * still continue to accept category objects.
+  * 
+  * <p>For example, the following are all legal and will work as
+  * expected.
+  * 
    <pre>
-   &nbsp;&nbsp;&nbsp;// Deprecated form:
-   &nbsp;&nbsp;&nbsp;Category cat = Category.getInstance("foo.bar")
-
-   &nbsp;&nbsp;&nbsp;// Preferred form for retrieving loggers:
-   &nbsp;&nbsp;&nbsp;Logger logger = Logger.getLogger("foo.bar")
+    &nbsp;&nbsp;&nbsp;// Deprecated form:
+    &nbsp;&nbsp;&nbsp;Category cat = Category.getInstance("foo.bar")
+   
+    &nbsp;&nbsp;&nbsp;// Preferred form for retrieving loggers:
+    &nbsp;&nbsp;&nbsp;Logger logger = Logger.getLogger("foo.bar")
    </pre>
-
-   <p>The first form is deprecated and should be avoided.
-
-   <p><b>There is absolutely no need for new client code to use or
-   refer to the <code>Category</code> class.</b> Whenever possible,
-   please avoid referring to it or using it.
-
-  <p>See the <a href="../../../../manual.html">short manual</a> for an
-  introduction on this class.
-
-  @author Ceki G&uuml;lc&uuml;
-  @author Anders Kristensen */
+   
+  *  <p>The first form is deprecated and should be avoided.
+  * 
+  *  <p><b>There is absolutely no need for new client code to use or
+  *  refer to the <code>Category</code> class.</b> Whenever possible,
+  *  please avoid referring to it or using it.
+  * 
+  * <p>See the <a href="../../../../manual.html">short manual</a> for an
+  * introduction on this class.
+  * <p>
+  * See the document entitled <a href="http://www.qos.ch/logging/preparingFor13.html">preparing
+  *  for log4j 1.3</a> for a more detailed discussion.
+  *
+  * @author Ceki G&uuml;lc&uuml;
+  * @author Anders Kristensen 
+  */
 public class Category implements AppenderAttachable {
 
   /**
@@ -77,9 +85,6 @@ public class Category implements AppenderAttachable {
   //final Hierarchy defaultHierarchy = new Hierarchy(new
   //					   RootCategory(Level.DEBUG));
 
-
-  static int nooptimize;
-
   /**
      The name of this category.
   */
@@ -207,10 +212,10 @@ public class Category implements AppenderAttachable {
   */
   synchronized
   void closeNestedAppenders() {
-    Enumeration enum = this.getAllAppenders();
-    if(enum != null) {
-      while(enum.hasMoreElements()) {
-	Appender a = (Appender) enum.nextElement();
+    Enumeration enumeration = this.getAllAppenders();
+    if(enumeration != null) {
+      while(enumeration.hasMoreElements()) {
+	Appender a = (Appender) enumeration.nextElement();
 	if(a instanceof AppenderAttachable) {
 	  a.close();
 	}
@@ -245,6 +250,60 @@ public class Category implements AppenderAttachable {
     }
   }
 
+  /**
+   * Log a message with the <code>DEBUG</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.2.10
+   */
+  public void debug(Object messagePattern, Object arg) {
+    if (repository.isDisabled(Level.DEBUG_INT)) {
+      return;
+    }
+    
+    if (Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
+      if (messagePattern instanceof String){
+        String msgStr = (String) messagePattern;
+        msgStr = MessageFormatter.format(msgStr, arg);
+        forcedLog(FQCN, Level.DEBUG, 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.DEBUG, messagePattern, null);
+      }
+    }
+  }
+
+  /**
+   * Log a message with the <code>DEBUG</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.2.10
+   */
+  public void debug(String messagePattern, Object arg1, Object arg2) {
+    if (repository.isDisabled(Level.DEBUG_INT)) {
+      return;
+    }
+    if (Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
+      messagePattern = MessageFormatter.format(messagePattern, arg1, arg2);
+      forcedLog(FQCN, Level.DEBUG, messagePattern, null);
+    }
+  }
 
   /**
    Log a message object with the <code>DEBUG</code> level including
@@ -289,6 +348,62 @@ public class Category implements AppenderAttachable {
       forcedLog(FQCN, Level.ERROR, message, null);
   }
 
+
+/**
+   * Log a message with the <code>ERROR</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.2.10
+   */
+  public void error(Object messagePattern, Object arg) {
+    if (repository.isDisabled(Level.ERROR_INT)) {
+      return;
+    }
+
+    if (Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel())) {
+      if (messagePattern instanceof String){
+        String msgStr = (String) messagePattern;
+        msgStr = MessageFormatter.format(msgStr, arg);
+        forcedLog(FQCN, Level.ERROR, 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.ERROR, messagePattern, null);
+      }
+    }
+  }
+  
+  /**
+   * Log a message with the <code>ERROR</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.2.10
+   */
+  public void error(String messagePattern, Object arg1, Object arg2) {
+    if (repository.isDisabled(Level.ERROR_INT)) {
+      return;
+    }
+    if (Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel())) {
+      messagePattern = MessageFormatter.format(messagePattern, arg1, arg2);
+      forcedLog(FQCN, Level.ERROR, messagePattern, null);
+    }
+  }
+
   /**
    Log a message object with the <code>ERROR</code> level including
    the stack trace of the {@link Throwable} <code>t</code> passed as
@@ -315,7 +430,7 @@ public class Category implements AppenderAttachable {
 
      @deprecated Please use {@link LogManager#exists} instead.
 
-     @version 0.8.5 */
+     @since 0.8.5 */
   public
   static
   Logger exists(String name) {
@@ -431,9 +546,10 @@ public class Category implements AppenderAttachable {
   }
 
   /**
-
-     @deprecated Has been replaced by the {@link #getEffectiveLevel}
-     method.  */
+    *
+    * @deprecated Please use the the {@link #getEffectiveLevel} method
+    * instead.  
+    * */
   public
   Priority getChainedPriority() {
     for(Category c = this; c != null; c=c.parent) {
@@ -497,40 +613,20 @@ public class Category implements AppenderAttachable {
 
 
  /**
-     Retrieve a category with named as the <code>name</code>
-     parameter. If the named category already exists, then the
-     existing instance will be reutrned. Otherwise, a new instance is
-     created.
-
-     By default, categories do not have a set level but inherit
-     it from the hierarchy. This is one of the central features of
-     log4j.
-
-     <b>Deprecated</b> Please use {@link Logger#getLogger(String)}
-     instead.
-
-     @param name The name of the category to retrieve.  */
+  * @deprecated Make sure to use {@link Logger#getLogger(String)} instead.
+  */
   public
   static
   Category getInstance(String name) {
-     nooptimize++;
     return LogManager.getLogger(name);
   }
 
  /**
-    Shorthand for <code>getInstance(clazz.getName())</code>.
-
-    @param clazz The name of <code>clazz</code> will be used as the
-    name of the category to retrieve.  See {@link
-    #getInstance(String)} for more detailed information.
-
-    <b>Deprecated</b> Please use {@link Logger#getLogger(Class)} instead.
-
-    @since 1.0 */
+  * @deprecated Please make sure to use {@link Logger#getLogger(Class)} instead.
+  */ 
   public
   static
   Category getInstance(Class clazz) {
-    nooptimize++;
     return LogManager.getLogger(clazz);
   }
 
@@ -581,16 +677,7 @@ public class Category implements AppenderAttachable {
 
 
   /**
-     Return the root of the default category hierrachy.
-
-     <p>The root category is always instantiated and available. It's
-     name is "root".
-
-     <p>Nevertheless, calling {@link #getInstance
-     Category.getInstance("root")} does not retrieve the root category
-     but a category just under root named "root".
-
-     <b>Deprecated</b> Use {@link Logger#getRootLogger()} instead.
+   *  @deprecated Please use {@link Logger#getRootLogger()} instead.
    */
   final
   public
@@ -679,6 +766,60 @@ public class Category implements AppenderAttachable {
   }
 
   /**
+   * Log a message with the <code>INFO</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.2.10
+   */
+  public void info(Object messagePattern, Object arg) {
+    if (repository.isDisabled(Level.INFO_INT)) {
+      return;
+    }
+
+    if (Level.INFO.isGreaterOrEqual(this.getEffectiveLevel())) {
+      if (messagePattern instanceof String){
+        String msgStr = (String) messagePattern;
+        msgStr = MessageFormatter.format(msgStr, arg);
+        forcedLog(FQCN, Level.INFO, 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.INFO, messagePattern, null);
+      }
+    }
+  }
+  
+  /**
+   * Log a message with the <code>INFO</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.2.10
+   */
+  public void info(String messagePattern, Object arg1, Object arg2) {
+    if (repository.isDisabled(Level.INFO_INT)) {
+      return;
+    }
+    if (Level.INFO.isGreaterOrEqual(this.getEffectiveLevel())) {
+      messagePattern = MessageFormatter.format(messagePattern, arg1, arg2);
+      forcedLog(FQCN, Level.INFO, messagePattern, null);
+    }
+  }
+  /**
    Log a message object with the <code>INFO</code> level including
    the stack trace of the {@link Throwable} <code>t</code> passed as
    parameter.
@@ -777,6 +918,33 @@ public class Category implements AppenderAttachable {
     return Level.INFO.isGreaterOrEqual(this.getEffectiveLevel());
   }
 
+  /**
+    Check whether this category is enabled for the info Level.
+    See also {@link #isDebugEnabled}.
+
+    @return boolean - <code>true</code> if this category is enabled
+    for level WARN, <code>false</code> otherwise.
+    @since 1.2.10
+  */
+  public boolean isWarnEnabled() {
+    if(repository.isDisabled(Level.WARN_INT))
+      return false;
+    return Level.WARN.isGreaterOrEqual(this.getEffectiveLevel());
+  }
+
+  /**
+    Check whether this category is enabled for the info Level.
+    See also {@link #isDebugEnabled}.
+
+    @return boolean - <code>true</code> if this category is enabled
+    for level ERROR, <code>false</code> otherwise.
+    @since 1.2.10
+  */
+  public boolean isErrorEnabled() {
+    if(repository.isDisabled(Level.ERROR_INT))
+      return false;
+    return Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel());
+  }
 
   /**
      Log a localized message. The user supplied parameter
@@ -1023,6 +1191,60 @@ public class Category implements AppenderAttachable {
       forcedLog(FQCN, Level.WARN, message, null);
   }
 
+ /**
+   * Log a message with the <code>WARN</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.2.10
+   */
+  public void warn(Object messagePattern, Object arg) {
+    if (repository.isDisabled(Level.WARN_INT)) {
+      return;
+    }
+
+    if (Level.WARN.isGreaterOrEqual(this.getEffectiveLevel())) {
+      if (messagePattern instanceof String){
+        String msgStr = (String) messagePattern;
+        msgStr = MessageFormatter.format(msgStr, arg);
+        forcedLog(FQCN, Level.WARN, 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.WARN, messagePattern, null);
+      }
+    }
+  }
+  /**
+   * Log a message with the <code>WARN</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.2.10
+   */
+  public void warn(String messagePattern, Object arg1, Object arg2) {
+    if (repository.isDisabled(Level.WARN_INT)) {
+      return;
+    }
+    if (Level.WARN.isGreaterOrEqual(this.getEffectiveLevel())) {
+      messagePattern = MessageFormatter.format(messagePattern, arg1, arg2);
+      forcedLog(FQCN, Level.WARN, messagePattern, null);
+    }
+  }
+
   /**
    Log a message with the <code>WARN</code> level including the
    stack trace of the {@link Throwable} <code>t</code> passed as
diff --git a/src/java/org/apache/log4j/ConsoleAppender.java b/src/java/org/apache/log4j/ConsoleAppender.java
index fc14474..bd43ede 100644
--- a/src/java/org/apache/log4j/ConsoleAppender.java
+++ b/src/java/org/apache/log4j/ConsoleAppender.java
@@ -11,12 +11,12 @@ import java.io.OutputStreamWriter;
 import org.apache.log4j.helpers.LogLog;
 
 /**
-   ConsoleAppender appends log events to <code>System.out</code> or
-   <code>System.err</code> using a layout specified by the
-   user. The default target is <code>System.out</code>.
-
-   @author Ceki G&uuml;lc&uuml;
-   @since 1.1 */
+  * ConsoleAppender appends log events to <code>System.out</code> or
+  * <code>System.err</code> using a layout specified by the user. The
+  * default target is <code>System.out</code>.
+  *
+  * @author Ceki G&uuml;lc&uuml; 
+  * @since 1.1 */
 public class ConsoleAppender extends WriterAppender {
 
   public static final String SYSTEM_OUT = "System.out";
@@ -47,9 +47,10 @@ public class ConsoleAppender extends WriterAppender {
   }
 
   /**
-     Sets the value of the <b>Target</b> option. Recognized values are
-     "System.out" and "System.err". Any other value will be ignored.
-  */
+   *  Sets the value of the <b>Target</b> option. Recognized values
+   *  are "System.out" and "System.err". Any other value will be
+   *  ignored.  
+   * */
   public
   void setTarget(String value) {
     String v = value.trim();
@@ -64,12 +65,11 @@ public class ConsoleAppender extends WriterAppender {
   }
 
   /**
-      Returns the current value of the <b>Target</b> property. The default
-      value of the option is "System.out".
-
-      See also {@link #setTarget}.
-
-  */
+   * Returns the current value of the <b>Target</b> property. The
+   * default value of the option is "System.out".
+   *
+   * See also {@link #setTarget}.
+   * */
   public
   String getTarget() {
     return target;
@@ -77,7 +77,7 @@ public class ConsoleAppender extends WriterAppender {
 
   void targetWarn(String val) {
     LogLog.warn("["+val+"] should be System.out or System.err.");
-    LogLog.warn("Using System.out (default).");
+    LogLog.warn("Using previously set target, System.out by default.");
   }
 
   public
@@ -90,8 +90,10 @@ public class ConsoleAppender extends WriterAppender {
   }
 
   /**
-     Override the parent method to do nothing.
-   */
+   *  This method overrides the parent {@link
+   *  WriterAppender#closeWriter} implementation to do nothing because
+   *  the console stream is not ours to close.
+   * */
   protected
   final
   void closeWriter() {
diff --git a/src/java/org/apache/log4j/DailyRollingFileAppender.java b/src/java/org/apache/log4j/DailyRollingFileAppender.java
index c90a209..50d1e9e 100644
--- a/src/java/org/apache/log4j/DailyRollingFileAppender.java
+++ b/src/java/org/apache/log4j/DailyRollingFileAppender.java
@@ -52,11 +52,10 @@ import org.apache.log4j.spi.LoggingEvent;
    <td><code>'.'yyyy-MM</code>
    <td>Rollover at the beginning of each month</td>
 
-   <td>Assuming the first day of the week is Sunday, at Sunday 00:00,
-   March 25th, 2001, <code>/foo/bar.log</code> will be copied to
-   <code>/foo/bar.log.2001-03</code>. Logging for the month of April
-   will be output to <code>/foo/bar.log</code> until it rolls over
-   at the beginning of May.
+   <td>At midnight of May 31st, 2002 <code>/foo/bar.log</code> will be
+   copied to <code>/foo/bar.log.2002-05</code>. Logging for the month
+   of June will be output to <code>/foo/bar.log</code> until it is
+   also rolled over the next month.
 
    <tr>
    <td><code>'.'yyyy-ww</code>
@@ -64,18 +63,19 @@ import org.apache.log4j.spi.LoggingEvent;
    <td>Rollover at the first day of each week. The first day of the
    week depends on the locale.</td>
 
-   <td>At midnight, on March 31st, 2001, <code>/foo/bar.log</code>
-   will be copied to <code>/foo/bar.log.2001-08</code>. Logging for
-   the 9th week of 2001 will be output to <code>/foo/bar.log</code>
-   until it is rolled over the next week.
+   <td>Assuming the first day of the week is Sunday, on Saturday
+   midnight, June 9th 2002, the file <i>/foo/bar.log</i> will be
+   copied to <i>/foo/bar.log.2002-23</i>.  Logging for the 24th week
+   of 2002 will be output to <code>/foo/bar.log</code> until it is
+   rolled over the next week.
 
    <tr>
    <td><code>'.'yyyy-MM-dd</code>
 
    <td>Rollover at midnight each day.</td>
 
-   <td>At midnight, on March 9th, 2001, <code>/foo/bar.log</code> will
-   be copied to <code>/foo/bar.log.2001-03-08</code>. Logging for the
+   <td>At midnight, on March 8th, 2002, <code>/foo/bar.log</code> will
+   be copied to <code>/foo/bar.log.2002-03-08</code>. Logging for the
    9th day of March will be output to <code>/foo/bar.log</code> until
    it is rolled over the next day.
 
@@ -84,19 +84,19 @@ import org.apache.log4j.spi.LoggingEvent;
 
    <td>Rollover at midnight and midday of each day.</td>
 
-   <td>At noon, on March 9th, 2001, <code>/foo/bar.log</code> will be
-   copied to <code>/foo/bar.log.2001-03-09-AM</code>. Logging for the
+   <td>At noon, on March 9th, 2002, <code>/foo/bar.log</code> will be
+   copied to <code>/foo/bar.log.2002-03-09-AM</code>. Logging for the
    afternoon of the 9th will be output to <code>/foo/bar.log</code>
-   until it is rolled over the next morning, i.e at midnight 00:00.
+   until it is rolled over at midnight.
 
    <tr>
    <td><code>'.'yyyy-MM-dd-HH</code>
 
    <td>Rollover at the top of every hour.</td>
 
-   <td>At approximately 11:00,000, on March 9th, 2001,
+   <td>At approximately 11:00.000 o'clock on March 9th, 2002,
    <code>/foo/bar.log</code> will be copied to
-   <code>/foo/bar.log.2001-03-09-10</code>. Logging for the 11th hour
+   <code>/foo/bar.log.2002-03-09-10</code>. Logging for the 11th hour
    of the 9th of March will be output to <code>/foo/bar.log</code>
    until it is rolled over at the beginning of the next hour.
 
@@ -143,13 +143,19 @@ public class DailyRollingFileAppender extends FileAppender {
   private String datePattern = "'.'yyyy-MM-dd";
 
   /**
-     The actual formatted filename that is currently being written to.
+     The log file will be renamed to the value of the
+     scheduledFilename variable when the next interval is entered. For
+     example, if the rollover period is one hour, the log file will be
+     renamed to the value of "scheduledFilename" at the beginning of
+     the next hour. 
+
+     The precise time when a rollover occurs depends on logging
+     activity. 
   */
   private String scheduledFilename;
 
   /**
-     The timestamp when we shall next recompute the filename.
-  */
+     The next time we estimate a rollover should occur. */
   private long nextCheck = System.currentTimeMillis () - 1;
 
   Date now = new Date();
@@ -160,14 +166,13 @@ public class DailyRollingFileAppender extends FileAppender {
 
   int checkPeriod = TOP_OF_TROUBLE;
 
-
+  // The gmtTimeZone is used only in computeCheckPeriod() method.
   static final TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT");
 
 
   /**
      The default constructor does nothing. */
-  public
-  DailyRollingFileAppender() {
+  public DailyRollingFileAppender() {
   }
 
   /**
@@ -188,19 +193,16 @@ public class DailyRollingFileAppender extends FileAppender {
      expected by {@link SimpleDateFormat}. This options determines the
      rollover schedule.
    */
-  public
-  void setDatePattern(String pattern) {
+  public void setDatePattern(String pattern) {
     datePattern = pattern;
   }
 
   /** Returns the value of the <b>DatePattern</b> option. */
-  public
-  String getDatePattern() {
+  public String getDatePattern() {
     return datePattern;
   }
 
-  public
-  void activateOptions() {
+  public void activateOptions() {
     super.activateOptions();
     if(datePattern != null && fileName != null) {
       now.setTime(System.currentTimeMillis());
@@ -212,8 +214,8 @@ public class DailyRollingFileAppender extends FileAppender {
       scheduledFilename = fileName+sdf.format(new Date(file.lastModified()));
 
     } else {
-      LogLog.error("Either Filename or DatePattern options are not set for ["+
-		   name+"].");
+      LogLog.error("Either File or DatePattern options are not set for appender ["
+		   +name+"].");
     }
   }
 
@@ -290,6 +292,9 @@ public class DailyRollingFileAppender extends FileAppender {
     }
 
     String datedFilename = fileName+sdf.format(now);
+    // It is too early to roll over because we are still within the
+    // bounds of the current interval. Rollover will occur once the
+    // next interval is reached.
     if (scheduledFilename.equals(datedFilename)) {
       return;
     }
@@ -303,8 +308,12 @@ public class DailyRollingFileAppender extends FileAppender {
     }
 
     File file = new File(fileName);
-    file.renameTo(target);
-    LogLog.debug(fileName +" -> "+ scheduledFilename);
+    boolean result = file.renameTo(target);
+    if(result) {
+      LogLog.debug(fileName +" -> "+ scheduledFilename);
+    } else {
+      LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"].");
+    }
 
     try {
       // This will also close the file. This is OK since multiple
@@ -318,17 +327,14 @@ public class DailyRollingFileAppender extends FileAppender {
   }
 
   /**
-     This method differentiates DailyRollingFileAppender from its
-     super class.
-
-     <p>Before actually logging, this method will check whether it is
-     time to do a rollover. If it is, it will schedule the next
-     rollover time and then rollover.
-
-
-  */
-  protected
-  void subAppend(LoggingEvent event) {
+   * This method differentiates DailyRollingFileAppender from its
+   * super class.
+   *
+   * <p>Before actually logging, this method will check whether it is
+   * time to do a rollover. If it is, it will schedule the next
+   * rollover time and then rollover.
+   * */
+  protected void subAppend(LoggingEvent event) {
     long n = System.currentTimeMillis();
     if (n >= nextCheck) {
       now.setTime(n);
@@ -345,16 +351,10 @@ public class DailyRollingFileAppender extends FileAppender {
 }
 
 /**
-   RollingCalendar is a helper class to
-   DailyRollingFileAppender. Using this class, it is easy to compute
-   and access the next Millis().
-
-   It subclasses the standard {@link GregorianCalendar}-object, to
-   allow access to the protected function getTimeInMillis(), which it
-   then exports.
-
-   @author <a HREF="mailto:eirik.lygre@evita.no">Eirik Lygre</a> */
-
+ *  RollingCalendar is a helper class to DailyRollingFileAppender.
+ *  Given a periodicity type and the current time, it computes the
+ *  start of the next interval.  
+ * */
 class RollingCalendar extends GregorianCalendar {
 
   int type = DailyRollingFileAppender.TOP_OF_TROUBLE;
@@ -371,13 +371,11 @@ class RollingCalendar extends GregorianCalendar {
     this.type = type;
   }
 
-  public
-  long getNextCheckMillis(Date now) {
+  public long getNextCheckMillis(Date now) {
     return getNextCheckDate(now).getTime();
   }
 
-  public
-  Date getNextCheckDate(Date now) {
+  public Date getNextCheckDate(Date now) {
     this.setTime(now);
 
     switch(type) {
diff --git a/src/java/org/apache/log4j/FileAppender.java b/src/java/org/apache/log4j/FileAppender.java
index e3b212e..c1de794 100644
--- a/src/java/org/apache/log4j/FileAppender.java
+++ b/src/java/org/apache/log4j/FileAppender.java
@@ -20,24 +20,24 @@ import org.apache.log4j.helpers.LogLog;
 //              Ben Sandee
 
 /**
-   FileAppender appends log events to a file.
-
-   <p>Support for <code>java.io.Writer</code> and console appending
-   has been deprecated and then removed. See the replacement
-   solutions: {@link WriterAppender} and {@link ConsoleAppender}.
-
-
-   @author Ceki G&uuml;lc&uuml; */
+ *  FileAppender appends log events to a file.
+ *
+ *  <p>Support for <code>java.io.Writer</code> and console appending
+ *  has been deprecated and then removed. See the replacement
+ *  solutions: {@link WriterAppender} and {@link ConsoleAppender}.
+ *
+ * @author Ceki G&uuml;lc&uuml; 
+ * */
 public class FileAppender extends WriterAppender {
 
-  /** Append to or truncate the file? The default value for this
-      variable is <code>true</code>, meaning that by default a
-      <code>FileAppender</code> will append to an existing file and
-      not truncate it.
-
-      <p>This option is meaningful only if the FileAppender opens the
-      file.
-  */
+  /** Controls file truncatation. The default value for this variable
+   * is <code>true</code>, meaning that by default a
+   * <code>FileAppender</code> will append to an existing file and not
+   * truncate it.
+   *
+   * <p>This option is meaningful only if the FileAppender opens the
+   * file.
+   */
   protected boolean fileAppend = true;
 
   /**
@@ -49,7 +49,8 @@ public class FileAppender extends WriterAppender {
   protected boolean bufferedIO = false;
 
   /**
-     How big should the IO buffer be? Default is 8K. */
+   * Determines the size of IO buffer be. Default is 8K. 
+   */
   protected int bufferSize = 8*1024;
 
 
diff --git a/src/java/org/apache/log4j/HTMLLayout.java b/src/java/org/apache/log4j/HTMLLayout.java
index 013b7c5..961c301 100644
--- a/src/java/org/apache/log4j/HTMLLayout.java
+++ b/src/java/org/apache/log4j/HTMLLayout.java
@@ -130,22 +130,22 @@ public class HTMLLayout extends Layout {
     sbuf.append("</td>" + Layout.LINE_SEP);
 
     sbuf.append("<td title=\"Level\">");
-    if (event.level.equals(Level.DEBUG)) {
+    if (event.getLevel().equals(Level.DEBUG)) {
       sbuf.append("<font color=\"#339933\">");
-      sbuf.append(event.level);
+      sbuf.append(event.getLevel());
       sbuf.append("</font>");
     }
-    else if(event.level.isGreaterOrEqual(Level.WARN)) {
+    else if(event.getLevel().isGreaterOrEqual(Level.WARN)) {
       sbuf.append("<font color=\"#993300\"><strong>");
-      sbuf.append(event.level);
+      sbuf.append(event.getLevel());
       sbuf.append("</strong></font>");
     } else {
-      sbuf.append(event.level);
+      sbuf.append(event.getLevel());
     }
     sbuf.append("</td>" + Layout.LINE_SEP);
 
-    sbuf.append("<td title=\"" + event.categoryName + " category\">");
-    sbuf.append(Transform.escapeTags(event.categoryName));
+    sbuf.append("<td title=\"" + event.getLoggerName() + " category\">");
+    sbuf.append(Transform.escapeTags(event.getLoggerName()));
     sbuf.append("</td>" + Layout.LINE_SEP);
 
     if(locationInfo) {
diff --git a/src/java/org/apache/log4j/LogManager.java b/src/java/org/apache/log4j/LogManager.java
index 0189b8a..d01b99e 100644
--- a/src/java/org/apache/log4j/LogManager.java
+++ b/src/java/org/apache/log4j/LogManager.java
@@ -11,7 +11,7 @@ import org.apache.log4j.spi.LoggerRepository;
 import org.apache.log4j.spi.LoggerFactory;
 import org.apache.log4j.spi.RepositorySelector;
 import org.apache.log4j.spi.DefaultRepositorySelector;
-import org.apache.log4j.spi.RootCategory;
+import org.apache.log4j.spi.RootLogger;
 import org.apache.log4j.helpers.Loader;
 import org.apache.log4j.helpers.OptionConverter;
 import org.apache.log4j.helpers.LogLog;
@@ -23,84 +23,40 @@ import java.net.MalformedURLException;
 import java.util.Enumeration;
 
 /**
-  Use the <code>LogManager</code> to retreive instances of {@link Logger}.
-
-  @author Ceki G&uuml;lc&uuml;
-*/
+ * Use the <code>LogManager</code> class to retreive {@link Logger}
+ * instances or to operate on the current {@link
+ * LoggerRepository}. When the <code>LogManager</code> class is loaded
+ * into memory the default initalzation procedure is inititated. The
+ * default intialization procedure</a> is described in the <a
+ * href="../../../../manual.html#defaultInit">short log4j manual</a>.
+ *
+ * @author Ceki G&uuml;lc&uuml; */
 public class LogManager {
 
   /**
-     This string constant is set to <b>log4j.properties</b> the name
-     of the file that will be searched by default in classpath. If the
-     file can be found, then it is fed to the {@link
-     PropertyConfigurator}.
-
-     See also {@link #DEFAULT_CONFIGURATION_KEY} for a more general
-     alternative.
-
-     <p>See also the full description of <a
-     href="../../../../manual.html#defaultInit">default
-     intialization</a> procedure.
-
-     @since 0.8.5 */
-     static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties";
-     
-  /**
-     This string constant is set to <b>log4j.configuration</b>. 
-
-     <p>It corresponds to name of a system property that, if set,
-     specifies the name of the resource containing the properties file
-     or {@link URL} with which log4j should configure itself. See
-     {@link OptionConverter#selectAndConfigure} for more detailed
-     information on the processing of this option.
-
-     <p>Setting the <b>log4j.configuration</b> system property
-     overrides the default search for the file <b>log4j.properties</b>.
-
-     <p>Note that all property keys are case sensitive.  
-
-     <p>See also the full description of <a
-     href="../../../../manual.html#defaultInit">default
-     intialization</a> procedure.
-
-     @since 1.0 */
-     static final public String DEFAULT_CONFIGURATION_KEY="log4j.configuration";
-
- /**
-     This string constant is set to <b>log4j.configuratorClass</b>. 
-
-     <p>It corresponds to name of a system property that, if set,
-     specifies the class name to use to automatically configure
-     log4j. See {@link OptionConverter#selectAndConfigure} for more
-     detailed information on the processing of this option.
-
-     <p>Setting the <b>log4j.configuration</b> system property
-     overrides the default search for the file <b>log4j.properties</b>.
-
-     <p>Note that all property keys are case sensitive.  
-
-     <p>See also the full description of <a
-     href="../../../../manual.html#defaultInit">default
-     intialization</a> procedure.
+   * @deprecated This variable is for internal use only. It will
+   * become package protected in future versions.
+   * */
+  static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties";
+  
+  static final String DEFAULT_XML_CONFIGURATION_FILE = "log4j.xml";  
    
-     @since 1.2 */
-     static final public String CONFIGURATOR_CLASS_KEY="log4j.configuratorClass";
-
   /**
-      Setting the system property <b>log4j.defaultInitOverride</b> to
-      "true" or any other value than "false" will skip default
-      configuration process.
-
-     <p>The current value of the DEFAULT_INIT_OVERRIDE_KEY string
-     constant is <b>log4j.defaultInitOverride</b>.
-
-     <p>See also the full description of <a
-     href="../../../../manual.html#defaultInit">default
-     intialization</a> procedure.
+   * @deprecated This variable is for internal use only. It will
+   * become private in future versions.
+   * */
+  static final public String DEFAULT_CONFIGURATION_KEY="log4j.configuration";
 
-     <p>Note that all property keys are case sensitive.  
+  /**
+   * @deprecated This variable is for internal use only. It will
+   * become private in future versions.
+   * */
+  static final public String CONFIGURATOR_CLASS_KEY="log4j.configuratorClass";
 
-     @since 0.8.5 */
+  /**
+  * @deprecated This variable is for internal use only. It will
+  * become private in future versions.
+  */
   public static final String DEFAULT_INIT_OVERRIDE_KEY = 
                                                  "log4j.defaultInitOverride";
 
@@ -110,42 +66,54 @@ public class LogManager {
 
   static {
     // By default we use a DefaultRepositorySelector which always returns 'h'.
-    Hierarchy h = new Hierarchy(new RootCategory((Level) Level.DEBUG));
+    Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));
     repositorySelector = new DefaultRepositorySelector(h);
 
     /** Search for the properties file log4j.properties in the CLASSPATH.  */
     String override =OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY,
 						       null);
 
-    // if there is no default init override, them get the resource
+    // if there is no default init override, then get the resource
     // specified by the user or the default config file.
     if(override == null || "false".equalsIgnoreCase(override)) {
-      String resource = OptionConverter.getSystemProperty(
-						  DEFAULT_CONFIGURATION_KEY, 
-						  DEFAULT_CONFIGURATION_FILE);
+
+      String configurationOptionStr = OptionConverter.getSystemProperty(
+							  DEFAULT_CONFIGURATION_KEY, 
+							  null);
 
       String configuratorClassName = OptionConverter.getSystemProperty(
                                                    CONFIGURATOR_CLASS_KEY, 
 						   null);
 
       URL url = null;
-      try {
-	// so, resource is not a URL:
-	// attempt to get the resource from the class path
-	url = new URL(resource);
-      } catch (MalformedURLException ex) {
-	url = Loader.getResource(resource); 
-      }	
+
+      // if the user has not specified the log4j.configuration
+      // property, we search first for the file "log4j.xml" and then
+      // "log4j.properties"
+      if(configurationOptionStr == null) {	
+	url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
+	if(url == null) {
+	  url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
+	}
+      } else {
+	try {
+	  url = new URL(configurationOptionStr);
+	} catch (MalformedURLException ex) {
+	  // so, resource is not a URL:
+	  // attempt to get the resource from the class path
+	  url = Loader.getResource(configurationOptionStr); 
+	}	
+      }
       
       // If we have a non-null url, then delegate the rest of the
       // configuration to the OptionConverter.selectAndConfigure
       // method.
       if(url != null) {
-	LogLog.debug("Using URL ["+url+"] for automatic log4j configuration.");        
+	LogLog.debug("Using URL ["+url+"] for automatic log4j configuration.");      
 	OptionConverter.selectAndConfigure(url, configuratorClassName, 
 					   LogManager.getLoggerRepository());
       } else {
-	LogLog.debug("Could not find resource: ["+resource+"].");
+	LogLog.debug("Could not find resource: ["+configurationOptionStr+"].");
       }
     }  
   } 
diff --git a/src/java/org/apache/log4j/Logger.java b/src/java/org/apache/log4j/Logger.java
index aab789d..369d952 100644
--- a/src/java/org/apache/log4j/Logger.java
+++ b/src/java/org/apache/log4j/Logger.java
@@ -8,6 +8,7 @@
 package org.apache.log4j;
 
 import org.apache.log4j.spi.LoggerFactory;
+import org.slf4j.ULogger;
 
 
 /**
@@ -17,7 +18,7 @@ import org.apache.log4j.spi.LoggerFactory;
   @since log4j 1.2
 
   @author Ceki G&uuml;lc&uuml; */
-public class Logger extends Category {
+public class Logger extends Category implements ULogger {
 
   /**
      The fully qualified name of the Level class. See also the
@@ -77,7 +78,16 @@ public class Logger extends Category {
   //}
 
   /**
-     Retrieve a logger by name.
+   * Retrieve a logger named according to the value of the
+   * <code>name</code> parameter. If the named logger already exists,
+   * then the existing instance will be returned. Otherwise, a new
+   * instance is created.  
+   *
+   * <p>By default, loggers do not have a set level but inherit it
+   * from their neareast ancestor with a set level. This is one of the
+   * central features of log4j.
+   *
+   * @param name The name of the logger to retrieve.  
   */
   static
   public
@@ -86,7 +96,11 @@ public class Logger extends Category {
   }
 
   /**
-     Same as calling <code>getLogger(clazz.getName())</code>.
+   * Shorthand for <code>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.
    */
   static
   public
@@ -96,7 +110,15 @@ public class Logger extends Category {
 
 
   /**
-     Retrieve the root logger.
+   * Return the root logger for the current logger repository.
+   * <p>
+   * The {@link #getName Logger.getName()} method for the root logger always returns
+   * stirng value: "root". However, calling
+   * <code>Logger.getLogger("root")</code> does not retrieve the root
+   * logger but a logger just under root named "root".
+   * <p>
+   * In other words, calling this method is the only way to retrieve the 
+   * root logger.
    */
   public
   static
diff --git a/src/java/org/apache/log4j/MDC.java b/src/java/org/apache/log4j/MDC.java
index 002b399..9fd93ff 100644
--- a/src/java/org/apache/log4j/MDC.java
+++ b/src/java/org/apache/log4j/MDC.java
@@ -88,11 +88,10 @@ public class MDC {
 
 
   /**
-     Get the current thread's MDC as a hashtable.
-   */
-  public
-  static
-  Hashtable getContext() {
+   * Get the current thread's MDC as a hashtable. This method is
+   * intended to be used internally.  
+   * */
+  public static Hashtable getContext() {
     return mdc.getContext0();
   }
 
@@ -104,8 +103,8 @@ public class MDC {
     } else {
       Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get();
       if(ht == null) {
-	ht = new Hashtable(HT_SIZE);
-	((ThreadLocalMap)tlm).set(ht);
+        ht = new Hashtable(HT_SIZE);
+        ((ThreadLocalMap)tlm).set(ht);
       }    
       ht.put(key, o);
     }
@@ -117,10 +116,10 @@ public class MDC {
       return null;
     } else {       
       Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get();
-      if(ht != null) {
-	return ht.get(key);
+      if(ht != null && key != null) {
+        return ht.get(key);
       } else {
-	return null;
+        return null;
       }
     }
   }
@@ -130,7 +129,7 @@ public class MDC {
     if(!java1) {
       Hashtable ht = (Hashtable) ((ThreadLocalMap)tlm).get();
       if(ht != null) {
-	ht.remove(key);
+        ht.remove(key);
       } 
     }
   }
diff --git a/src/java/org/apache/log4j/NDC.java b/src/java/org/apache/log4j/NDC.java
index aa44615..ee34b21 100644
--- a/src/java/org/apache/log4j/NDC.java
+++ b/src/java/org/apache/log4j/NDC.java
@@ -192,7 +192,8 @@ public class NDC {
 
 
   /**
-     Used when printing the diagnostic context.
+     <font color="#FF4040"><b>Never use this method directly, use the {@link
+     org.apache.log4j.spi.LoggingEvent#getNDC} method instead</b></font>.
   */
   static
   public
@@ -205,10 +206,10 @@ public class NDC {
   }
   
   /**
-     Get the current nesting depth of this diagnostic context.
-
-     @see #setMaxDepth
-     @since 0.7.5
+   * Get the current nesting depth of this diagnostic context.
+   *
+   * @see #setMaxDepth
+   * @since 0.7.5
    */
   public
   static
@@ -239,13 +240,13 @@ public class NDC {
 
       int misses = 0;
       v = new Vector(); 
-      Enumeration enum = ht.keys();
+      Enumeration enumeration = ht.keys();
       // We give up after 4 straigt missses. That is 4 consecutive
       // inspected threads in 'ht' that turn out to be alive.
       // The higher the proportion on dead threads in ht, the higher the
       // chances of removal.
-      while(enum.hasMoreElements() && (misses <= 4)) {
-	Thread t = (Thread) enum.nextElement();
+      while(enumeration.hasMoreElements() && (misses <= 4)) {
+	Thread t = (Thread) enumeration.nextElement();
 	if(t.isAlive()) {
 	  misses++;
 	} else {
diff --git a/src/java/org/apache/log4j/Priority.java b/src/java/org/apache/log4j/Priority.java
index fd2fe98..61e82a4 100644
--- a/src/java/org/apache/log4j/Priority.java
+++ b/src/java/org/apache/log4j/Priority.java
@@ -9,10 +9,10 @@
 // Contributors:  Kitching Simon <Si...@orange.ch>
 
 package org.apache.log4j;
-
+  
 /**
    <font color="#AA4444">Refrain from using this class directly, use
-   the {@link Level} class instead.</font>
+   the {@link Level} class instead</font>.
 
    @author Ceki G&uuml;lc&uuml; */
 public class Priority {
@@ -31,31 +31,28 @@ public class Priority {
   public final static int ALL_INT = Integer.MIN_VALUE;
 
   /**
-     The <code>FATAL</code> level designates very severe error
-     events that will presumably lead the application to abort.
+   * @deprecated Use {@link Level#FATAL} instead.
    */
   final static public Priority FATAL = new Level(FATAL_INT, "FATAL", 0);
 
   /**
-     The <code>ERROR</code> level designates error events that
-     might still allow the application to continue running.  */
+   * @deprecated Use {@link Level#ERROR} instead.
+   */
   final static public Priority ERROR = new Level(ERROR_INT, "ERROR", 3);
 
   /**
-     The <code>WARN</code> level designates potentially harmful situations.
-  */
+   * @deprecated Use {@link Level#WARN} instead.
+   */
   final static public Priority WARN  = new Level(WARN_INT, "WARN",  4);
 
   /**
-     The <code>INFO</code> level designates informational messages
-     that highlight the progress of the application at coarse-grained
-     level.  */
+   * @deprecated Use {@link Level#INFO} instead.
+   */
   final static public Priority INFO  = new Level(INFO_INT, "INFO",  6);
 
   /**
-     The <code>DEBUG</code> priority designates fine-grained
-     informational events that are most useful to debug an
-     application.  */
+   * @deprecated Use {@link Level#DEBUG} instead.
+   */
   final static public Priority DEBUG = new Level(DEBUG_INT, "DEBUG", 7);
 
   
@@ -141,12 +138,7 @@ public class Priority {
   }
 
   /**
-     Convert the string passed as argument to a priority. If the
-     conversion fails, then this method returns {@link #DEBUG}. 
-
-     @deprecated Please use the {@link Level#toLevel(String)} method instead.}
-   
-
+   * @deprecated Please use the {@link Level#toLevel(String)} method instead.
   */
   public
   static
@@ -155,10 +147,8 @@ public class Priority {
   }
 
   /**
-    Convert an integer passed as argument to a priority. If the
-    conversion fails, then this method returns {@link #DEBUG}.
-
-  */
+   * @deprecated Please use the {@link Level#toLevel(int)} method instead.   
+   */
   public
   static
   Priority toPriority(int val) {
@@ -166,8 +156,7 @@ public class Priority {
   }
 
   /**
-    Convert an integer passed as argument to a priority. If the
-    conversion fails, then this method returns the specified default.
+   * @deprecated Please use the {@link Level#toLevel(int, Level)} method instead.   
   */
   public
   static
@@ -176,10 +165,8 @@ public class Priority {
   }
 
   /**
-     Convert the string passed as argument to a priority. If the
-     conversion fails, then this method returns the value of
-     <code>defaultPriority</code>.  
-  */
+   * @deprecated Please use the {@link Level#toLevel(String, Level)} method instead.   
+   */
   public
   static
   Priority toPriority(String sArg, Priority defaultPriority) {                  
diff --git a/src/java/org/apache/log4j/PropertyConfigurator.java b/src/java/org/apache/log4j/PropertyConfigurator.java
index c15d438..b6b99b6 100644
--- a/src/java/org/apache/log4j/PropertyConfigurator.java
+++ b/src/java/org/apache/log4j/PropertyConfigurator.java
@@ -33,8 +33,8 @@ import java.util.StringTokenizer;
 import java.util.Hashtable;
 
 /**
-   Extends {@link BasicConfigurator} to provide configuration from an
-   external file.  See <b>{@link #doConfigure(String, LoggerRepository)}</b> for the
+   Allows the configuration of log4j from an external file.  See
+   <b>{@link #doConfigure(String, LoggerRepository)}</b> for the
    expected format.
 
    <p>It is sometimes useful to see how log4j is reading configuration
@@ -100,7 +100,7 @@ public class PropertyConfigurator implements Configurator {
   /**
     Read configuration from a file. <b>The existing configuration is
     not cleared nor reset.</b> If you require a different behavior,
-    then call {@link BasicConfigurator#resetConfiguration
+    then call {@link  LogManager#resetConfiguration
     resetConfiguration} method before calling
     <code>doConfigure</code>.
 
@@ -118,7 +118,7 @@ public class PropertyConfigurator implements Configurator {
     </pre>
 
     <p>The level value can consist of the string values OFF, FATAL,
-    ERROR, WARN, INFO, DEBUG, ALL or a <em>custom level</e> value. A
+    ERROR, WARN, INFO, DEBUG, ALL or a <em>custom level</em> value. A
     custom level value can be specified in the form
     level#classname. By default the repository-wide threshold is set
     to the lowest possible value, namely the level <code>ALL</code>.
@@ -175,7 +175,7 @@ public class PropertyConfigurator implements Configurator {
 
     <p>For non-root categories the syntax is almost the same:
     <pre>
-    log4j.logger.logger_name=[level|INHERITED], appenderName, appenderName, ...
+    log4j.logger.logger_name=[level|INHERITED|NULL], appenderName, appenderName, ...
     </pre>
 
     <p>The meaning of the optional level value is discussed above
@@ -187,9 +187,10 @@ public class PropertyConfigurator implements Configurator {
     named logger remains untouched.
 
     <p>By default categories inherit their level from the
-    hierarchy. However, if you set the level of a logger and
-    later decide that that logger should inherit its level, then
-    you should specify INHERITED as the value for the level value.
+    hierarchy. However, if you set the level of a logger and later
+    decide that that logger should inherit its level, then you should
+    specify INHERITED as the value for the level value. NULL is a
+    synonym for INHERITED.
 
     <p>Similar to the root logger syntax, each <i>appenderName</i>
     (separated by commas) will be attached to the named logger.
@@ -507,9 +508,9 @@ public class PropertyConfigurator implements Configurator {
   */
   protected
   void parseCatsAndRenderers(Properties props, LoggerRepository hierarchy) {
-    Enumeration enum = props.propertyNames();
-    while(enum.hasMoreElements()) {
-      String key = (String) enum.nextElement();
+    Enumeration enumeration = props.propertyNames();
+    while(enumeration.hasMoreElements()) {
+      String key = (String) enumeration.nextElement();
       if(key.startsWith(CATEGORY_PREFIX) || key.startsWith(LOGGER_PREFIX)) {
 	String loggerName = null;
 	if(key.startsWith(CATEGORY_PREFIX)) {
@@ -576,9 +577,13 @@ public class PropertyConfigurator implements Configurator {
       // If the level value is inherited, set category level value to
       // null. We also check that the user has not specified inherited for the
       // root category.
-      if(levelStr.equalsIgnoreCase(INHERITED) &&
-                                	 !loggerName.equals(INTERNAL_ROOT_NAME)) {
-	logger.setLevel(null);
+      if(INHERITED.equalsIgnoreCase(levelStr) || 
+ 	                                  NULL.equalsIgnoreCase(levelStr)) {
+	if(loggerName.equals(INTERNAL_ROOT_NAME)) {
+	  LogLog.warn("The root logger cannot be set to null.");
+	} else {
+	  logger.setLevel(null);
+	}
       } else {
 	logger.setLevel(OptionConverter.toLevel(levelStr, (Level) Level.DEBUG));
       }
diff --git a/src/java/org/apache/log4j/SimpleLayout.java b/src/java/org/apache/log4j/SimpleLayout.java
index 565ca54..8c58eeb 100644
--- a/src/java/org/apache/log4j/SimpleLayout.java
+++ b/src/java/org/apache/log4j/SimpleLayout.java
@@ -49,7 +49,7 @@ public class SimpleLayout extends Layout {
   String format(LoggingEvent event) {
 
     sbuf.setLength(0);
-    sbuf.append(event.level.toString());
+    sbuf.append(event.getLevel().toString());
     sbuf.append(" - ");
     sbuf.append(event.getRenderedMessage());
     sbuf.append(LINE_SEP);
diff --git a/src/java/org/apache/log4j/TTCCLayout.java b/src/java/org/apache/log4j/TTCCLayout.java
index 5ce94e6..ceb526a 100644
--- a/src/java/org/apache/log4j/TTCCLayout.java
+++ b/src/java/org/apache/log4j/TTCCLayout.java
@@ -157,9 +157,7 @@ public class TTCCLayout extends DateLayout {
    <p>Time, thread, category and diagnostic context are printed
    depending on options.
 
-    @param category
-    @param level
-    @param message
+    @param event The event to format
 
   */
   public
@@ -175,11 +173,11 @@ public class TTCCLayout extends DateLayout {
       buf.append(event.getThreadName());
       buf.append("] ");
     }
-    buf.append(event.level.toString());
+    buf.append(event.getLevel().toString());
     buf.append(' ');
 
     if(this.categoryPrefixing) {
-      buf.append(event.categoryName);
+      buf.append(event.getLoggerName());
       buf.append(' ');
     }
 
diff --git a/src/java/org/apache/log4j/WriterAppender.java b/src/java/org/apache/log4j/WriterAppender.java
index 50b33f4..456d35b 100644
--- a/src/java/org/apache/log4j/WriterAppender.java
+++ b/src/java/org/apache/log4j/WriterAppender.java
@@ -194,17 +194,18 @@ public class WriterAppender extends AppenderSkeleton {
     writeFooter();
     reset();
   }
+
   /**
-     Close the underlying {@link java.io.Writer}.
-  */
-  protected
-  void closeWriter() {
+   * Close the underlying {@link java.io.Writer}.
+   * */
+  protected void closeWriter() {
     if(qw != null) {
       try {
 	qw.close();
       } catch(IOException e) {
-	LogLog.error("Could not close " + qw, e); // do need to invoke an error handler
-	                                          // at  this late stage
+	// There is do need to invoke an error handler at this late
+	// stage.
+	LogLog.error("Could not close " + qw, e);
       }
     }
   }
@@ -234,13 +235,11 @@ public class WriterAppender extends AppenderSkeleton {
     return retval;
   }
 
-  public
-  String getEncoding() {
+  public String getEncoding() {
     return encoding;
   }
 
-  public
-  void setEncoding(String value) {
+  public void setEncoding(String value) {
     encoding = value;
   }
 
@@ -250,9 +249,7 @@ public class WriterAppender extends AppenderSkeleton {
   /**
      Set the {@link ErrorHandler} for this WriterAppender and also the
      underlying {@link QuietWriter} if any. */
-  public
-  synchronized
-  void setErrorHandler(ErrorHandler eh) {
+  public synchronized void setErrorHandler(ErrorHandler eh) {
     if(eh == null) {
       LogLog.warn("You have tried to set a null error-handler.");
     } else {
@@ -275,9 +272,7 @@ public class WriterAppender extends AppenderSkeleton {
     <p><b>WARNING:</b> Logging to an unopened Writer will fail.
     <p>
     @param writer An already opened Writer.  */
-  public
-  synchronized
-  void setWriter(Writer writer) {
+  public synchronized void setWriter(Writer writer) {
     reset();
     this.qw = new QuietWriter(writer, errorHandler);
     //this.tp = new TracerPrintWriter(qw);
diff --git a/src/java/org/apache/log4j/chainsaw/ControlPanel.java b/src/java/org/apache/log4j/chainsaw/ControlPanel.java
index 741edec..d9169e7 100644
--- a/src/java/org/apache/log4j/chainsaw/ControlPanel.java
+++ b/src/java/org/apache/log4j/chainsaw/ControlPanel.java
@@ -18,7 +18,7 @@ import javax.swing.JPanel;
 import javax.swing.JTextField;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
 import org.apache.log4j.Priority;
 
 /**
@@ -28,8 +28,8 @@ import org.apache.log4j.Priority;
  */
 class ControlPanel extends JPanel {
     /** use the log messages **/
-    private static final Category LOG = 
-                                  Category.getInstance(ControlPanel.class);
+    private static final Logger LOG = 
+                                  Logger.getLogger(ControlPanel.class);
 
     /**
      * Creates a new <code>ControlPanel</code> instance.
@@ -61,7 +61,7 @@ class ControlPanel extends JPanel {
         add(label);
 
         c.gridy++;
-        label = new JLabel("Filter Category:");
+        label = new JLabel("Filter Logger:");
         gridbag.setConstraints(label, c);
         add(label);
 
diff --git a/src/java/org/apache/log4j/chainsaw/DetailPanel.java b/src/java/org/apache/log4j/chainsaw/DetailPanel.java
index c051987..9b28748 100644
--- a/src/java/org/apache/log4j/chainsaw/DetailPanel.java
+++ b/src/java/org/apache/log4j/chainsaw/DetailPanel.java
@@ -17,7 +17,7 @@ import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
 
 /**
  * A panel for showing a stack trace.
@@ -29,8 +29,8 @@ class DetailPanel
     implements ListSelectionListener
 {
     /** used to log events **/
-    private static final Category LOG =
-        Category.getInstance(DetailPanel.class);
+    private static final Logger LOG =
+        Logger.getLogger(DetailPanel.class);
 
     /** used to format the logging event **/
     private static final MessageFormat FORMATTER = new MessageFormat(
@@ -38,7 +38,7 @@ class DetailPanel
         "&nbsp;&nbsp;<b>Priority:</b> <code>{1}</code>" +
         "&nbsp;&nbsp;<b>Thread:</b> <code>{2}</code>" +
         "&nbsp;&nbsp;<b>NDC:</b> <code>{3}</code>" +
-        "<br><b>Category:</b> <code>{4}</code>" +
+        "<br><b>Logger:</b> <code>{4}</code>" +
         "<br><b>Location:</b> <code>{5}</code>" +
         "<br><b>Message:</b>" +
         "<pre>{6}</pre>" +
diff --git a/src/java/org/apache/log4j/chainsaw/EventDetails.java b/src/java/org/apache/log4j/chainsaw/EventDetails.java
index 12ddc51..a0538e6 100644
--- a/src/java/org/apache/log4j/chainsaw/EventDetails.java
+++ b/src/java/org/apache/log4j/chainsaw/EventDetails.java
@@ -73,8 +73,8 @@ class EventDetails {
     EventDetails(LoggingEvent aEvent) {
 
         this(aEvent.timeStamp,
-             aEvent.level,
-             aEvent.categoryName,
+             aEvent.getLevel(),
+             aEvent.getLoggerName(),
              aEvent.getNDC(),
              aEvent.getThreadName(),
              aEvent.getRenderedMessage(),
diff --git a/src/java/org/apache/log4j/chainsaw/ExitAction.java b/src/java/org/apache/log4j/chainsaw/ExitAction.java
index 8fb0ce8..c8eda2a 100644
--- a/src/java/org/apache/log4j/chainsaw/ExitAction.java
+++ b/src/java/org/apache/log4j/chainsaw/ExitAction.java
@@ -8,7 +8,7 @@ package org.apache.log4j.chainsaw;
 
 import java.awt.event.ActionEvent;
 import javax.swing.AbstractAction;
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
 
 /**
  * Encapsulates the action to exit.
@@ -20,7 +20,7 @@ class ExitAction
     extends AbstractAction
 {
     /** use to log messages **/
-    private static final Category LOG = Category.getInstance(ExitAction.class);
+    private static final Logger LOG = Logger.getLogger(ExitAction.class);
     /** The instance to share **/
     public static final ExitAction INSTANCE = new ExitAction();
 
diff --git a/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java b/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java
index 9912e7d..cc91139 100644
--- a/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java
+++ b/src/java/org/apache/log4j/chainsaw/LoadXMLAction.java
@@ -16,7 +16,7 @@ import javax.swing.JFrame;
 import javax.swing.JOptionPane;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParserFactory;
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.XMLReader;
@@ -31,8 +31,7 @@ class LoadXMLAction
     extends AbstractAction
 {
     /** use to log messages **/
-    private static final Category LOG =
-        Category.getInstance(LoadXMLAction.class);
+    private static final Logger LOG = Logger.getLogger(LoadXMLAction.class);
 
     /** the parent frame **/
     private final JFrame mParent;
diff --git a/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java b/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java
index c69b3de..3cd3455 100644
--- a/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java
+++ b/src/java/org/apache/log4j/chainsaw/LoggingReceiver.java
@@ -23,7 +23,7 @@ import org.apache.log4j.spi.LoggingEvent;
  */
 class LoggingReceiver extends Thread {
     /** used to log messages **/
-    private static final Logger logger = Logger.getLogger(LoggingReceiver.class);
+    private static final Logger LOG = Logger.getLogger(LoggingReceiver.class);
 
     /**
      * Helper that actually processes a client connection. It receives events
@@ -46,7 +46,7 @@ class LoggingReceiver extends Thread {
 
         /** loops getting the events **/
         public void run() {
-            logger.debug("Starting to get data");
+            LOG.debug("Starting to get data");
             try {
                 final ObjectInputStream ois =
                     new ObjectInputStream(mClient.getInputStream());
@@ -55,19 +55,19 @@ class LoggingReceiver extends Thread {
                     mModel.addEvent(new EventDetails(event));
                 }
             } catch (EOFException e) {
-                logger.info("Reached EOF, closing connection");
+                LOG.info("Reached EOF, closing connection");
             } catch (SocketException e) {
-                logger.info("Caught SocketException, closing connection");
+                LOG.info("Caught SocketException, closing connection");
             } catch (IOException e) {
-                logger.warn("Got IOException, closing connection", e);
+                LOG.warn("Got IOException, closing connection", e);
             } catch (ClassNotFoundException e) {
-                logger.warn("Got ClassNotFoundException, closing connection", e);
+                LOG.warn("Got ClassNotFoundException, closing connection", e);
             }
 
             try {
                 mClient.close();
             } catch (IOException e) {
-                logger.warn("Error closing connection", e);
+                LOG.warn("Error closing connection", e);
             }
         }
     }
@@ -93,19 +93,19 @@ class LoggingReceiver extends Thread {
 
     /** Listens for client connections **/
     public void run() {
-        logger.info("Thread started");
+        LOG.info("Thread started");
         try {
             while (true) {
-                logger.debug("Waiting for a connection");
+                LOG.debug("Waiting for a connection");
                 final Socket client = mSvrSock.accept();
-                logger.debug("Got a connection from " +
+                LOG.debug("Got a connection from " +
                           client.getInetAddress().getHostName());
                 final Thread t = new Thread(new Slurper(client));
                 t.setDaemon(true);
                 t.start();
             }
         } catch (IOException e) {
-            logger.error("Error in accepting connections, stopping.", e);
+            LOG.error("Error in accepting connections, stopping.", e);
         }
     }
 }
diff --git a/src/java/org/apache/log4j/chainsaw/Main.java b/src/java/org/apache/log4j/chainsaw/Main.java
index b67a9ae..9dacd28 100644
--- a/src/java/org/apache/log4j/chainsaw/Main.java
+++ b/src/java/org/apache/log4j/chainsaw/Main.java
@@ -23,7 +23,7 @@ import javax.swing.JScrollPane;
 import javax.swing.JSplitPane;
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
 import org.apache.log4j.PropertyConfigurator;
 
 /**
@@ -41,7 +41,7 @@ public class Main
     public static final String PORT_PROP_NAME = "chainsaw.port";
 
     /** use to log messages **/
-    private static final Category LOG = Category.getInstance(Main.class);
+    private static final Logger LOG = Logger.getLogger(Main.class);
 
 
     /**
@@ -162,7 +162,7 @@ public class Main
     /** initialise log4j **/
     private static void initLog4J() {
         final Properties props = new Properties();
-        props.setProperty("log4j.rootCategory", "DEBUG, A1");
+        props.setProperty("log4j.rootLogger", "DEBUG, A1");
         props.setProperty("log4j.appender.A1",
                           "org.apache.log4j.ConsoleAppender");
         props.setProperty("log4j.appender.A1.layout",
diff --git a/src/java/org/apache/log4j/chainsaw/MyTableModel.java b/src/java/org/apache/log4j/chainsaw/MyTableModel.java
index d1af076..b0d8898 100644
--- a/src/java/org/apache/log4j/chainsaw/MyTableModel.java
+++ b/src/java/org/apache/log4j/chainsaw/MyTableModel.java
@@ -16,7 +16,7 @@ import java.util.SortedSet;
 import java.util.TreeSet;
 import javax.swing.table.AbstractTableModel;
 import org.apache.log4j.Priority;
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
 
 /**
  * Represents a list of <code>EventDetails</code> objects that are sorted on
@@ -29,8 +29,7 @@ class MyTableModel
 {
 
     /** used to log messages **/
-    private static final Category LOG =
-        Category.getInstance(MyTableModel.class);
+    private static final Logger LOG = Logger.getLogger(MyTableModel.class);
 
     /** use the compare logging events **/
     private static final Comparator MY_COMP = new Comparator()
diff --git a/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java b/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java
index 5ce82d0..5944da3 100644
--- a/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java
+++ b/src/java/org/apache/log4j/chainsaw/XMLFileHandler.java
@@ -7,7 +7,7 @@
 package org.apache.log4j.chainsaw;
 
 import java.util.StringTokenizer;
-import org.apache.log4j.Priority;
+import org.apache.log4j.Level;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
... 11160 lines suppressed ...