blob: bedcb45056cce0fc148052a3a1729165ec191033 [file] [log] [blame]
[*] Changes that are 100% compatible with existing client code.
[**] Changes that requiring little or no modification to existing
client code.
[***] Changes requiring important modifications to existing client code.
[D] Changes affect a method or property which was previously marked as
deprecated.
January 20th, 2005
- Release of version 1.3alpha-6
- Fixed involuntary omission of DOMConfigrator (deprecated) in log4j-VERSION.jar.
- Added missing files in log4-oro.jar.
- The lengthy system property "log4j.repositorySelectorClass" was renamed as
"log4j.repositorySelector".
January 19th, 2005
- Release of version 1.3alpha-5
- Universal and Generic Logging Interface (UGLI) is now part of log4j.
UGLI allows variation in the logging API implementattion in a simple and
robust way. Log4j directly supports the interfaces defined by UGLI.
For more information see http://logging.apache.org/log4j/docs/ugli.html [*]
- Log4j now ships with several jar files, one jar file per dependency. [*/**]
- Fixed Bugzilla 15198: TelnetAppender: NullPointerException if
SocketHandler not initialized. [*]
- Fixed Bugzilla 12112: CountingQuietWriter miscounts bytes. [*]
- Fixed Bugzilla 18076: setting of firstTime in OnlyOnceErrorHandler. [*]
- Added pattern conversion support for the Subject line for emails
generated by SMTPAppender. The set of patterns is the same as those
supported by PatternLayout. [*]
- Implemented Bugzilla 20985: charset support for SMTPAppender [**]
- Implemented Bugzilla 20500: separate registry clearing from doConfigure in PropertyConfigurator
to allow to easier extension. [*]
- Fixed Bugzilla 23912: unsafe access to BoundedFIFO in AsyncAppender. [*]
- Changed converter register accessors in PatternParser to take/return Map instead
of HashMap, a cleaner abstraction allowing for different implementation types. [*]
- Fixed Bugzilla 26658: modify build.xml chainsaw target with respect to crimson.jar [*]
- Fixed Bugzilla 28682: NullPointerException in SocketHubAppender#cleanup. [*]
- Fixed Bugzilla 28464: White space significant at end of line for PropertyConfigurator. [*]
- Fixed Bugzilla 26117: Output encoding for TelnetAppender. [*]
November 25, 2004
- Release of version 1.3alpha-3
- Classes are built with the javac debug setting on.
- Fixed unset activeFile bug in SlidingWindowRollingPolicy.
November 25, 2004
- Release of version 1.3alpha-2
- The deprecated DOMConfigrator was mistakenly left as the default
configrator for XML files. This has been fixed and JoranConfigrator
now is the default configrator for XML files.
November 24th, 2004
- Release of version 1.3alpha-1
- Log4j now uses itself for its own logging. For more details refer to
http://www.qos.ch//logging/internalLogging.jsp
- The Appender.requiresLayout() method is no longer needed.
This method was only used by PropertConfigrurator and not
DOMConfigurator nor JoranConfigurator. It was never strictly necessary
and case the layout is *optional* for a given appender type, it causes
unwarranted error messages.
This simplification will make it slightly easier to write appenders.
- Added new printing methods message supporiting pattern parsing. These new forms
avoid superflous parameter construction and yield a significant performance
increase in the case of disavled log statements. [*]
- Added new ListAppender & ListModelAppender classes to the org.apache.log4j.varia package.
These are rather simplistic Appender implementations that store LoggingEvents in
an internal buffer (java.util.List and a DefaultListModel respectively) which can
be useful in certain applications (such as a Swing GUI app etc). [*]
- org.apache.log4j.HTMLLayout has been replaced with org.apache.log4j.html.HTMLLayout.
The new HTMLLayout admits a conversion pattern using the same syntax as
PatternLayout. Thus, the user can customize the content of columns in the HTML table
produced by HTMLLayout. Just as importantly, many visual aspects of the table can be
customized at row or even cell level with the help of a CSS file.
The new HTMLLayout has been contributed by Steve Mactaggart.
- Log4j now ships with JoranConfigurator, a powerful replacement for
DOMConfigurator. Joran bring a plethora of new capabilities. In
particular, it can be taught new parsing rules on the fly, even from
within the config file being processed. Moreover, with the help of
implicit actions, it can configure specialized sub-components of log4j
components.
Many of the new components in version 1.3 can be configured thanks
to the new capabilitues found in JoranConfigurator.
- Fixed bug #15585 relative to location information extraction on the AS400. The fix
was contributed by Patrice Kolata. [*]
- Log4j will now automatically include stack traces for nested
exceptions. Log4j extends the automatic nested exception printing
available in JDK 1.4 to nested exceptions accessible through methods
named "getRootCause", "getNextException" and "getException", not just
"getCause" as in JDK 1.4. [*]
- The location information extraction code has been refactored to use
a faster mechanism when running on JDK 1.4 or later. The new mechanism, contributed
by Martin Schulz, is at least twice as fast.
See http://marc.theaimsgroup.com/?t=108473346700001&r=1&w=2 for more details. [*]
- Made ignoresThrowable a settable property. The user can now force a layout
to ignore the throwable in the event even if the layout knows how to handle
exceptions. Conversely, an appender can be fooled to believe that a layout
handled the exception in the logging event by setting a layout's ignoresThrowable
property to false. [*]
- The org.apache.log4j.db package replaces the old org.apache.log4j.jdbc
package. The new package supports most relational database systems
such as PostgreSQL, MySQL, Oracle, DB2 or MsSQL. It can also handle
retrieve connections using a JDBC driver class, a data source class or
JNDI. [*]
- A sequenceNumber field has been added to LoggingEvent. This fields is useful when
checking for the equality of two logging events or when ordering them. [*]
- Log4j now has its own Scheduler. It allows jobs to be executed at a certain date
or even periodically. It only requires just one extra thread. [*]
- Added the "isPristine" flag to LoggerRepository. As soon as a configurator
starts configuring a repository this flag is set to false.
- Removed support for the deprecated property "log4j.configDebug". [**/D]
- The new ContextJNDISelector allows for the possibility of managing
multiple logger hiearchies within the same application server while
only a single copy of log4j.jar is present in memory.
- Added keys() method to the MDC class as requested by Don Isenor.
- Certain operations on Loggers are now made using ReaderWriterLocks which
allows simultaneous read operations but only one write operation. This should
significantly improve logging throughput in heavily loaded server environments.
- Rolling can now be triggered based on time or size as was already the case in
log4j 1.2. However, the new architecture allows for much more variation in the
timing of the rollover and the actions taken during rollover (i.e on the fly
compression, renaming, moving). The new architecture was suggested a long time
ago by James P. Cakalic. A similar design can be found in the Avalon Logkit
package.
In order to avoid duplication, the old org.apache.log4j.RollingAppender
and org.apache.log4j.RollingAppender classes have been removed. [**]
- LoggingEvent was extended to allow properties. Properties are meant to be set
by Layout and Appender classes as they output/process logging events.
Properties are per logging event where MDC values are per thread.
- Another LoggingEvent constructor was added to allow instances to be reconstituted
when received from remote sources that do not use LoggingEvent as the transport
type (like XML for example).
- Fixed bug #23096. NullAppender getInstance method is now declared as a static.
- Fixed bug #10706. The %X pattern without a key no longer causes a NullPointer
exception,
- ADD: LIST OF CHAINSAW IMPROVEMENTS.
November 2nd, 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
- Fixed bug #8527. A closed TelnetAppender would continue waiting
for connections even if its ServerSocket was closed. This caused
the TelnetSocket to sit in a loop and complain about the closed
socket. [*]
- AsyncAppender throws NullPointerException problem. The bug was actually in
AppenderSkeleton. See bug #5444 details. [*]
- Added support for recursive variable substiuton as requested by
Eric Chastan. [*]
- SocketNode now used a BufferedInputStream as suggested by Kok Chong
in bug report #3933. [*]
- Fixed a problem with DailiyRollingAppender which would not
correctly compute the rollover period in certain timezones. See bug
report #7550. [*]
- Fixed documentation bug #2726 in FAQ.html. [*]
- In WriterAppender, fixed bug #2383 by adding a flush statement in the
writeFooter method. [*]
- In XMLLayout, Fixed bug #7550 by escaping the method attribute. The
XMLLayout also outputs each item of a stack trace in a separate
line. [*]
- Fixed bug #5932 as suggested by Heikki Linnakangas. The
LoggingEvent.getMDCCopy method now clones the MDC instead of just
referencing it. [*]
(rc1)
- The ANT build script was modified to use jar files specified in
the build.properties file instead of the CLASSPATH environment
variable. The build.properties file depends on local paths and is
supplied by the user. The build.properties.sample file is included
in the distribution. The build.sh and build.bat scripts have
been removed. This is the way many other jakarta projects build their
projects. The jar files in the dist/lib directory were also removed
since they are no longer used. [*]
- The DOMConfigurator now interprets the string after the '#'
character in the value attribute within the <level> element as
the fully qualified class name of a custom Level. This is consistent
with the way log4j handles "level" values in other places. The
class attribute is still honored. [*]
- Added Oliver Burn's chainsaw tool to the core log4j
distribution. Visualisation and dynamic filtering of log events is
bound to be a very important area of activity in the future. [*]
- Added the org.apache.log4j.jdbc.JDBCAppender which as the name
indicates sends events to a database using the JDBC API. Thanks to
Kevin Steppe for supplying the code. [*]
- Added SocketHubAppender class as contributed by Mark Womack. This
appender sends LoggingEvent objects to a set of remote a log
servers. [*]
- In the Category class, the getChainedPriority method has been
replaced with getEffectiveLevel method. [*]
(beta4)
- Replaced the custom class loading based on the thread context class
loader with a simple Class.forName() call. This solves two allied
but distinct problems encountered when using Ant with JUnit
although the bug is more general. In one instance of the
problem, log4j would throw java.lang.NoClassDefFoundError for
org/apache/log4j/AppenderSkeleton where log4j.jar and related
classes were clearly available to the Ant classloader. In another
incarnation, log4j would reject a custom appender claiming that it is
not assignable to a org.apache.log4j.Appender variable. This would
occur when log4j.jar was available to both the Ant classloader and the
system classloader.
Thanks to Dave Herman for providing detailed scenarios exposing
the issues involved. See
http://forum.java.sun.com/thread.jsp?forum=38&thread=70946
http://forum.java.sun.com/thread.jsp?forum=38&thread=70946#479697
http://marc.theaimsgroup.com/?l=ant-user&m=101139178705895&w=2
for more details. [*]
(beta3)
- Fixed the complaints the compiler issued when using the
Logger.setLevel() methd. [*]
- Incorporated the performance enhancements to ISO8601DateFormat and
AbsoluteTimeDateFormat classes submitted by Andrew Vajoczki.
(beta2)
- Source code written for log4j 1.1.3.jar will compile fine with
log4j 1.2X. However, code compiled for log4j 1.1.3 would previously
systematically throw "java.lang.NoSuchMethodError" runtime exceptions
when run with log4j 1.2 - prior to beta2. This problem has been
corrected in beta2. Pheew, that was a close one. [*]
- Log4j 1.2 is now backward compatible in serialization of
LoggingEvents. For example, a 1.1.3 SocketAppedner can write to 1.2
SocketServer. Similarly a 1.2 JMSAppender will work with 1.1.3
JMSSink. This should ease the move to log4j 1.2, especially in
large deployments. [*]
(alpha7)
- The src/java/org/apache/log4j/examples/ directory moved under the
top-level directory as examples/. [*]
- Fixed the ArrayIndexOutOfBoundsException that was thrown by
AsyncAppender if multiple threads were trying to log an event
containing an exception near simultaneously. Thanks to Thomas Tuft Muller
for reporting this bug. [*]
(alpha1-alpha6)
- Improved error reporting in DOMConfigurator. Thanks to Thomas Tuft
Muller for contributing the enhancement. [*]
- Log4j is now configurable using JMX. JMX support is not of
production quality. [*]
- Added support for different encodings in WriterAppender. Thanks to
Ben Sandee for submitting the relevant patch. [*]
- Modified SMTPAppender to allow multiple email sessions. Thanks to
Jon Skeet for supplying the relevant patch. [*]
- The CategoryFactory class has been replaced by the LoggerFactory
class. The makeNewCategoryInstance method has been renamed as
makeNewLoggerInstance. This change requires subclasses of Category
classes to be modified and recompiled. [**]
- The Level class replaced the Priority class. Priority class now
extends Level to preserve backward compatibility. [*]
- The Logger class replaced the Category class. Logger class
extends Category to preserve backward compatibility. We proudly
mark this change with a single star for 100% compatibility. [*]
- The Category.assert method has been replaced by
Category.assertLog. This change was necessary because assert is a
language reserved word in JDK 1.4. [*/**]
- Removed deprecated methods setOptions and getOptionStrings defined
in the org.apache.log4j.spi.OptionHandler interface. This interface
is implemented by most log4j appenders and layouts. In particular,
all appenders and layouts shipped with log4j contain these
deprecated methods. They have become totally redundant after we
moved to JavaBeans style configuration in log4j 1.1. [**]
- The disable(Level) methods in Hierarchy have been removed and been
replaced by threshold methods. [**]
- Added buffered IO capability to FileAppender and subclasses. [*]
- The location information (or stack information) was not correctly
transmitted by JMSAppender. [*]
- Added event reporting capability to the Hierarchy class.
- Added new system property "log4j.configuratorClass". This property
allows the user to specify the custom configurator at the default
initialization phase. This property replaces the previous
interpretation of the reference part of "log4j.configuration"
as the custom configurator class. This interpretation was sometimes
erroneous and caused headaches. [*]
- Introduced the Mapped Diagnostic Context or MDC class. This class
is similar to the NDC except that the diagnostic context is based
on a map instead of a stack. Moreover the MDC is automatically
inherited by child threads under JDK 1.2 and above. [*]
- Corrected a performance bug in the NDC class as observed by Dan
Milstein and independently by Ray Millard. [*]
- Removed deprecated methods disable(Priority), disableAll,
disableDebug, disableInfo and enableAll in BasicConfigurator. [*]
- Added supports java.io.Reader objects in the method doConfigure(),
instead of only InputStream. Thanks to Mark Womack for submitting
the relevant patch. [*]
- Corrected the restart bug in DayliRollingFileAppender. Thanks to
Jim Moore for supplying the relevant patch. [*]
June 19, 2001
- Release of version 1.1.3
- Added a missing namespace declaration in the log4j:configuration
element in log4j.dtd. The missing declaration caused the new
generation of namespace aware parsers to barf when parsing log4j
configuration files. [*]
- Reduced the size of log4j-core.jar to 78KB. [*]
- Minor documentation changes. [*]
June 7, 2001
- Release of version 1.1.2
- Corrected a problem with the static initializer of the Category
class which would use the wrong class loader to search for the
default configuration file. The associated search algorithm has
been also simplified. Nevertheless, the preferred method to specify
the automatic configuration file is by setting the
log4j.configuration system property. [*]
- Documentation improvements. Added a new section to the manual
explaining the default initialization procedure [*]
- Enhancements to the org.apache.log4j.examples.appserver package. [*]
- Corrected a bug in the way the NTEventLogAppender printed
exceptions. [*]
May 20, 2001
- Release of version 1.1.1.
- Added missing custom priority support in PropertyConfigurator. [*]
- Made a number of fields protected instead of default access in
SMTPAppender. [*]
May 19, 2001
- Release of version 1.1.
- This release has the same code as 1.1b7. It differs only in a few minor
documentation changes.
May 9, 2001
- Release of version 1.1b7
- Made BasicConfigurator disable methods static as they were in log4j
1.0.4. Thanks to Francisco Marin for reporting the bug. [*]
- Corrected a two related deadlock problems introduced while fixing
bug 1505. Thanks to joelr@viair.com for reporting the problem. [*]
- The configureAndWatch methods in Configurators did not close the
configuration file, preventing its editing. See bug 1686. [*]
- In DOMConfigurator.setParameter special character conversion now
precedes variable substitution. This change was suggested by Steven
Velez. The vast majority of users should be oblivious to it. [*]
- The TextPaneAppender is no longer maintained and has been
removed. It is still available under the contribs/
directory. This change has been discussed in the log4j mailing
lists and no one objected to the removal of the TextPaneAppender
class.
April 26, 2001
- Release of version 1.1b6
- Aaron Greenhouse from Carnegie Mellon SCS found a series of
multi-threading related bugs in Category and AsyncAppender. See bug
ids 1505 and 1507 in our bug database for exemplary bug
reports. They are worth the detour. [*]
- InvalidJarIndexException is only available in JDK 1.3. Referring
to this exception type caused log4j 1.1b5 to break on earlier JDKs.
We now avoid referring to it. [*]
- Added PriorityRangeFilter by Simon Kitching. See the Threshold
option in AppenderSkeleton for a more convenient alternative. [*]
April 22, 2001
- Release of version 1.1b5
- In HTMLLayout, the Title option sets the HTML document
title (<title>...<title>). [*]
- Corrected an important performance bug in LocationInfo. Hein Couwet
and kr@it-practice.dk have independently identified the bug. This is
yet another example of the difference made by the number of eyeballs
studying source code. [*]
- Corrected the incorrect value returned by LocationInfo.getClassName
method when running under IBM Visual Age. Thanks to Mathias
Rupprecht for supplying the relevant patch. [*]
- Corrected a bug where the build.sh file in the distribution would be in
DOS CRLF format. Thanks to ma.darche@free.fr for reporting the
problem. [*]
- Corrected InvalidJarIndexException thrown in applets while
searching for the default log4j configuration file. Thanks to
Michael Lundahl for reporting this bug. [*]
- Added missing PropertySetterException class to log4j-core.jar.
Thanks to ma.darche@free.fr for reporting this bug. [*]
April 20, 2001
- Release of version 1.1b4
- Mathias Bogaert observed that in version 1.1b3 the search algorithm
for the resource used in automatic log4j configuration was
different than in 1.0.x. Beta4 uses a more powerful mechanism which
is also compatible with 1.0.x. [*]
- Paul Glezen correctly observed that if log4j is deployed in a
client/server mode where multiple log4j clients log to a log4j
server, all hosts must be upgraded to version 1.1 in one go because
the internal LoggingEvent class used in client/server communication
changed in log4j 1.1.
April 18, 2001
- Release of version 1.1b3
- Added a RollingFileAppenderBeanInfo class that fakes the
maxFileSize JavaBeans property as a String type instead of a long.
This allows us to resuscitate setMaxFileSize(long) method that was
removed in 1.1b2 breaking 100% backward compatibility. This addition
restores 100% backward compatibility. [*]
April 18, 2001
- Release of version 1.1b2
- The directory structure has changed to better suit Jakarta
conventions as follows:
org/** --> src/java/org/**
xdocs/** --> src/xdocs/**
If you have a CVS checked out copy of log4j be sure to check out a
fresh copy. [*]
- Added a few jar files required at build time to build/lib so that
it is now possible to compile log4j out of the box. [*]
- Whenever a priority parameter is expected in a configuration file,
one can now use a custom priority class. See OptionConverter.toPriority
method for more information. Note that the <priority> element in
log4j.dtd remains unaffected by this change. [*]
- Added the setQuietMode(boolean) method to LogLog. In quiet mode
LogLog will not output anything even in case of errors. [*]
- Log4j components are now configured as JavaBeans. The setOption and
getOptionString methods have been deprecated in OptionHandler
interface which is implemented by most log4j components. [*]
- The stack trace of a throwable passed in a logging statement is not
parsed into a stack array which is serializable. This allows cascading of
log4j servers to properly propagate throwable information. [*]
- In XML configuration files, the <configuration> element has been
deprecated and was replaced by the <log4j:configuration> element. [*]
The following perl command can help to migrate:
perl -p -i.bak -e "s/configuration/log4j:configuration/;" file1.xml .. fileN.xml
- The "log4j.configDebug" system property has been replaced with the
"log4j.debug" system property although it is still available.
Similarly, the "configDebug" attribute has been deprecated and
replaced with the "debug" attribute in log4j.dtd. [*]
February 23, 2001
- Release of version 1.1b1
- Logging can now be disabled per Hierarchy. It can also be disabled
using configuration files using the "disable" directive. The
"disableOverride" directive takes precedence over the "disable"
directive. As a result of this change the disable family of
methods in BasicConfigurator has been deprecated and replaced by the same
family of methods in the Hierarchy class. [*]
- The FileAppender has been split into three parts: WriterAppender,
ConsoleAppender and FileAppender. ConsoleAppender takes over the
console logging functionality of FileAppender. As a result support
for stream and console printing has been deprecated in FileAppender. [**]
- The FileAppender now correctly outputs the header and footer of its
layout. This problem was reported by too many users to list here. [*]
- Appenders and Layouts now get to see the raw message object in
LoggingEvent not just its rendered form. The access modifiers of
some LoggingEvent fields were changed so that they can be accessed
in less error-prone ways. Thanks to Jim Cakalic and Anders Kristens
for their valuable advice. [*]
- Added getLayout(), getErrorHandler(), and getFilter() to the
Appender interface. [*]
- Added getOption(key) method to the OptionHandler interface and modified
implementations of it as appropriate. [*]
- Added the much awaited DailyRollingFileAppender. [*]
- The structure of the distribution changed somewhat. The log4j.jar
files can be found under dist/. The javadoc directory has been
moved to docs/api/. We are now totally dependent on ANT to perform
all the steps involved in creating a release, including
compilation, jar file creation, generation of the javadocs, and for
the creation of the distribution tar and zip files. [*]
- Removed org/apache/log4j/varia/ResilientFileAppender.java which was
bogus to begin with. [*]
- XMLLayout will now mark some output as <![CDATA[ .. ]]> so that it
does not get interpreted by the XML parser. This was suggested by
Mathias Bogaert like a long list of other fixes. [*]
- Corrected a bug in CyclicBuffer.resize method that would not update the
next insertion point. Thanks to Ole Bulbuk for accurately reporting
the bug. [*]
- The LoggingEvent class now supports serialization of priorities
derived from the org.apache.log4j.Priority class. [*]
- Improved the search method for finding the "log4j.properties" file in
the static initializer of Category class. Thanks to Calvin Chan for
supplying a better method. [*]
- The code handling the FCQN (formerly instanceFQN) parameter was
cleaned up. There is now a well-established and simple manner for
sub-classes of Category (or wrapper classes) to define the FCQN
variable: just define a static variable, say FCQN, consisting of
the fully qualified class name of the subclass or wrapper, supply
this variable as an argument to forcedLog method if and when
the sub-class or wrapper invokes that method. [*]
- Made the instanceFCQN an instance variable instead of a class
static in Category.java. In related move, the Category constructor
now takes an additional argument setting the instanceFCQN. This
makes life less miserable for Category subclasses. [*]
- Corrected a bug in the OptionConverter.instantiateByClassName
method that would not return the defaultValue in case of error. Thanks
to Matthieu Verbert for identifying this bug.
- Corrected the missing stack trace in e-mails generated by the
SMTPAppender when using certain Layouts. [*]
- Updated the "Adding Conversion Characters to PatternLayout"
document to reflect the latest changes to the code. Also added the
org/apache/log4j/examples/appserver directory containing the
associated example code. [*]
- Added the BufferSize option to the AsyncAppender. [*]
- Eliminated the SecurityExceptions thrown in Applets. Thanks Timur
Zambalayev for reporting this bug. [*]
- Fixed the erroneously thrown IOInterruptedException when the AsyncAppender
was closed. Thanks to Tom Palmer for accurately reporting this bug. [*]
January 12th, 2001
- Release of version 1.0.4 (the 20th major release)
- Corrected a serious bug in Hierarchy.java that would cause a
NullPointerException depending on the order of instantiation of
categories. Thanks to Wolfram Gewohn for reporting this bug. [*]
- Corrected a bug in the getOptionsStrings method of SMTPAppender
that omitted to mention the EvaluatorClass option. Thanks to Mark
Balster for reporting this bug. [*]
January 11th, 2001
- Release of version 1.0.3 (the 20th major release)
- Fixed a NullPointerException occurring in AsyncAppender after
invoking Category.shutdown. Thanks to Frank-Olaf Lohmann for
reporting this bug. [*]
- Modified the OptionConverter.selectAndConfigure method to take an
extra argument of type Hierarchy. This method is used internally
and should not affect most users. [*/**]
- Added the warn method to LogLog which is used internally by log4j
to report on itself. [*]
- Displaced a number of HTML files under the docs directory. The new
structure is compatible with the jakarta site and results in a
more consistent navigation experience. [*]
- Made a few improvements in the javadocs. [*]
January 11th, 2001
- Release of version 1.0.2 (the 20th major release)
- Added the missing build.inc file to the distribution. No code
changed.
January 10th, 2001
- Release of version 1.0.1 (the 20th major release)
- This version corrects some documentation and build script bugs;
code has not changed.
January 8th, 2001
- Release of version 1.0 (the 20th major release)
- Package hierarchy now starts at org.apache.log4j. [***]
The following perl command can help in the transition:
> perl -p -i.bak -e "s/org.log4j/org.apache.log4j/;" file1.java .. fileN.java
- Added the fatal() family of methods to the Category
class. Moreover, the EMERG priority has been removed from the
Priority class. This priority has been replaced by the FATAL
priority that is more widely accepted. This change will
require EMERG log statements to be replaced by FATAL log
statements. Assuming EMERG log statements are rare, this should
have a small but bearable impact on existing client code.
Moreover, the Unix Syslog priorities ALERT, CRIT and NOTICE are no
longer recognized. Support for these priorities was minimal and
few users should suffer from these changes. [**]
- Removed the methods setRootPriority, getRootPriority as these
methods were redundant and had been previously deprecated. [**]
- Removed the DOM Level 2 dependency in DOMConfigurator. This makes
log4j XML configurable using Sun's parser or Apache's Xerces. [*]
- The static initializer of the Category class now takes the
log4j.configuration system property to search for its configuration
file. The type of the configurator used to parse the configuration
file depends on the value of the log4j.configuration system
property. [*]
- Enhanced the PropertyConfigurator and DOMConfigurator to support
customisation of independent Hierarchy instances. The
org.apache.log4j.net.SocketServer has been enhanced to take
advantage of this functionality. The old code of SocketServer has
been moved to SimpleSocketServer. [**]
- Enhanced the PropertyConfigurator to support variable substitution
for all options *values* (but not keys!). [*]
- Categories are now aware of the Hierarchy they are linked to. This
will provide a basis for several performance enhancements planned
for the future. [*]
- Added support for object rendering. It is now possible to register
an object renderer for a given object type. When the given object
needs to be logged log4j will invoke the corresponding renderer to
transform the object into a String.
As a result of this enhancement, all the String forms of all the
printing methods such as debug(String), info(String) have been
removed as they are no longer necessary. This change should be
backward compatible but requires recompilation of old client
code. Thanks to Michael Smith for noting the recompilation
requirement. [**]
- Added support for user defined category factories in the
PropertyConfigurator. Thus, it is now possible to configure log4j
with a properties file and still use custom Category
sub-classes. The DOMConfigurator had already a finer grain
support. [*]
- Added the SMTPAppender that in case of an error or fatal event
sends an e-mail containing latest N logging events in its buffer,
where N is chosen by the user. [*]
- Added the method getInstance(Class) to the Category class. [*]
- Corrected a bug in configureAndWatch method of configurators that
would configure log4j only after an unnecessary delay. [*]
November 30, 2000
- Release of version 0.9.1 (the 19th public release)
- Corrected a typo making NTEventLogAppender.dll register the wrong
category message file. Thanks to Peter Hayes for accurately
reporting this bug. [*]
- The DOMConfigurator and PropertyConfigurator can now automatically
detect modified configuration files and re-read them. [*]
- Added AsyncAppender which buffers log requests and serves them
at a later time. AsyncAppender can increase logging performance
tremendously if logging operations are interspersed with long
and blocking non CPU-intensive operations, typically I/O or network
access. For CPU intensive applications, using the AsyncAppender
will actualy degrade logging performance by 10 to 25 percent. [*]
- The log4j.dtd has been modified to allow appenders to refer to
other appenders by IDREF. [*]
- The DOMConfigurator has been modified to take advantage of ID/IDREF
attributes when referring to appenders. This change requires a
DOM Level-2 API compliant parser. DOM Level-2 java bindings are
available at
http://www.w3.org/TR/1999/WD-DOM-Level-2-19990923/java-binding.html.
- Added the configure(String filename) method to DOMConfigurator.
This method requires the presence of a JAXP compatible parser.
At this time, the only DOM2 and JAXP compatible parser seems to be
the Apache xerces parser.
- Added the PriorityMatchFilter allowing filtering by exact priority
match. This was a common request by users. [*]
- The configuration of a category is now an atomic operation. This
ensures that log requests are not lost while configuration is in
progress. Anders Kristensen was to first to observe the potential
problems in non-atomic configurations. [*]
November 20th, 2000
- Release of version 0.9.0 (the 18th public release)
- The "log4j" element has been renamed to "configuration" in the
log4j DTD. This change requires that log4j configuration files
written in XML be modified. Since the log4j element figures only
once in the XML file, this change should take little time. [**]
- ResourceBundles are now category instance specific and no longer
class static. Moreover, like other properties resource bundles
are inherited from the category hierarchy. [**]
- The jar files log4j.jar and log4j-full.jar now contain versioning
information in their respective manifest files. [*]
- Corrected an inconsistency in the NTEventLogAppender which broke it.
- Fixed a bug where configuration files were not parsed correctely
due to trailing spaces in option values as returned by
java.util.Properties. Trailing spaces are now removed from option
values. This bug was quite disconcerting because the
trailing spaces cannot be seen without careful examination of the
configuration file. [*]
- Added the XMLLayout.
The output of the XMLLayout consists of a series of log4j:event
elements. It does not output a complete XML file. The output is designed to
be included as an external entity to form a well-formed XML file. [*]
- Added a new abstract class org.log4j.helpers.DateLayout. The TTCCLayout
now extends DateLayout. [*]
- Corrected a rather subtle performance bug in the buffer management code
in PatternLayout. Thanks to Vladislav Dutov and Constantine
A. Plotnikov for for insisting on the correction of this bug. [*]
- Created a new package called org.log4j.spi. This new package
holds classes that are hidden from the casual user but are needed
to extend log4j. [*]
- Added org.log4j.varia.ExternallyRolledFileAppender to handle
externally triggered file rollovers. [*]
- Added support for multiple hierarchy trees. [*]
- PatternLayout can now be subclassed to support new conversion
patterns. [*]
- Extended the DOMConfigurator and the log4j DTD to properly handle
sub-classing of Category and Priority classes.
There have been also minor adjustments to other classes to handle
sub-classing. These changes should be invisible to users.
All categories except the root category can be sub-classed and also
assigned priorities sub-classing org.log4j.Priority.
The root category always exists and CANNOT be subclassed.
The ProppertyConfigurator remains unchanged. Thus, it does not
handle extensions of the Category class. [*]
- Added filter support in appenders. The DOMConfigurator and the
log4j.dtd have been enhanced to support filters. [*]
- Added error handling support to appenders. The DOMConfigurator and the
log4j.dtd have been enhanced to support filters. [*]
- Added support for correct interpretation of location information in
IBM's Visual Age environment. Thanks to Wolf Siberski for supplying
the relevant patch. [*]
- Added getAdditivity method to Category. This feature was requested
by Constantin Mitran. (mitran at ecircle.de) [*]
August 27, 2000
- Release of version 0.8.5b.
- Corrected multiple bugs in default initialization code of
Category class. Thanks to Jeff Turner for identifying and supplying
corrective patches. [*]
August 24, 2000
- Release of version 0.8.5a.
- Added the %n conversion character to PatternLayout so that a line
separator can be specified in a platform independent way. [*]
- In 0.8.5 internal Priority integer values were decoupled from the
Unix Syslog values. This broke SyslogAppedder. A new function
Priority.toSyslogInt is introduced to solve this bug. [*]
Corrected a bug where the internal prtar tzvf iority integer
August 23, 2000
- Release of version 0.8.5.
- All log4j internal output is now prepended with the string
"log4j: ". This makes is easier to differentiate log4j internal
logs from messages output by other sources. [*]
- Sub-classes of Category class must now specify their fully
qualified name when constructing logging events. This allows the %C
conversion specifier in PatternLayout to work properly even with
sub-classes or wrappers of Category. [*]
- Added the method disableDebug to BasicConfigurator. This method
disables all print requests of debug priority regardless its
category. Similar methods disableInfo, disable, disableAll and
enableAll have also been added. Disable type methods can be
overriden by setting the log4j.disableOverride system property.
Calling BasicConfigurator.disableInfo is equivalent to the now
deprecated flagAsShippedCode method. [*]
- Given the above changes, the system property
log4j.shippedCodeFlagOverride is no longer honored. [**]
- It is now possible to sub-class Category. The sub-classes may
continue to adhere to the category hierarchy. This was a frequently
requested feature. [*]
- Corrected a problem with the additivity flag being ignored in
categories without appenders. This bug was discovered by Anders
Kristensen. [*]
- Added a method BasicConfigurator.resetConfiguration to reset the
log4j environment. This method should be used sparingly. [*]
- At the initialization of the Category class, the file
log4j.properties will now be searched from the search path used to
load classes. If the file can be found, then it is fed to the
PropertyConfigurator.configure(java.net.URL) method. [*]
- Failing to access system properties within the static initializer
of BasicConfigurator class is no longer reported as an error but as
a debug message. Thanks to Gilles Schlienger for reporting this
problem with applets. [*]
- Corrected a bug which caused infinite loops when using conversion
patterns with a single element, fortunately under very rare
circumstances. This bug was first reported by Igor Potraev, the
author of log4p. It was independently reported by Joe Haberl from
IBM Global Services. [*]
- Added a mechanism to lazily remove references to dead threads in
the NDC class. Indeed, in previous versions calling NDC.pop within
a thread but forgetting to call to NDC.remove before exiting (that
thread) resulted in a memory leak. [*]
- Corrected a huge memory leak in SocketAppender. This leak was due
to the ObjectOutputStream indefinitely holding a reference for each
written to the stream. Thanks to Dan MacDonald for very accurately
describing this bug. [*]
- The log and l7dlog methods in Category no longer ignore the shipped
code flag. This bug was reported by Mario Schomburg. [*]
- Added missing NDC information to LoggingEvent.writeObject
method. [*]
- Corrected handling of SocketException in SocketNode. Thanks to
Gerald Gutierez (ggutierez@emobiledata.com) for reporting this and
the previous problem. [*]
- Phased out custom shell scripts to build java documentation and jar
files in favor of Jakarta's ANT. It was becoming a nuisance to keep
the ANT build file in sync with the custom shell scripts. [*]
May 11, 2000
- Release of version 0.8.4d.
- The NT EventViewer no longer complains about missing message 4096.
- Minor corrections in documentation.
- Added missing icons GIFs into the distribution.
- SocketNode now attempts to close the socket when exiting. Thanks to
Moses Hohman (mmhohman@rainbow.uchicago.edu) for noting this.
- Removed the com.ibm.log4j from the javadoc directory. This seems to
confuse VAJ. Thanks to Steve Ashcroft for reporting this problem.
May 5, 2000
- Release of version 0.8.4c.
- As a result of the infinite loop problem (see next item), added
over 800 new test cases to stress-test the code in CategoryFactory
class where category creation occurs. [*]
- Under certain rare circumstances the Category.getInstance method
entered an infinite loop. Thanks to Mario Schomburg from IBM Global
Services / Hannover for identifying this problem and proposing a
patch. [*]
- DOMConfigurator and the log4j.dtd were out of sync on the type of
the priority directive. As a result, priority directives all
defaulted to DEBUG. Thanks to Peter (petervt@users.sourceforge.net)
for accurately reporting this bug. [*]
- Minor additions to the FAQ. [*]
- Added the NumberCruncher example showing how the NDC class can be
used to distinguish output from different clients. [*]
- Added the %x conversion specifier to the TTCC_CONVERSION_PATTERN in
the PatternLayout class. This is consistent expected output of
Trivial.java example. Thanks to Jerome (schrom@users.sourceforge.net)
for reporting this bug. [*]
May 3, 2000
- Release of version 0.8.4b.
- The value of the additivity option would not be parsed properly by
the ProperytConfigurator if the line containing the option
contained trailing spaces. [*]
- Release of version 0.8.4a.
- The localized logging methods (l7dlog) omitted priority based
evaluation and erroneously logged all requests. [*]
May 1, 2000
- Release of version 0.8.4.
- The close method was added to the Appender interface allowing
appender implementations to release any resources they may have
allocated. [*]
- The package naming scheme of changed from "com.ibm.log4j.*" to
"org.log4j.*". The new naming reflects the open source nature of
the project and is consistent with the URL http://www.log4j.org. [***]
- Added internationalization support. See the newly introduced l7dlog
methods in Category class. [*]
- In the FileAppender, the File option now admits variable
substitution. For example, if "java.home" system property is set
to /home/xyz and the File option is given the value
"%{java.home}/test.log", then File option will be interpreted as
"/home/xyz/test.log".
Thanks to Avy Sharell (sharell@online.fr) for contributing this
feature. [*]
- SocketAppender is now officially part of the package. It is capable
of sending logging events to a remote SocketNode. The SocketNode
logs events according to server (local) policy. For example, a
client can log events to a local file and also send them to a
remote server (a SocketNode). This server can log the event to any
number of files, to the console, to any number of TextPaneAppenders
and even re-transmit the event to another server, and so forth.
This paradigm is common in most logging systems, e.g. Syslog and NT
Event Log. Many thanks to Andrew Harrison for showing a way to
actually implement the paradigm. [*]
- The Category.callAppenders method now accepts a LoggingEvent
instead of creating one itself. This was necessary to accommodate
events generated at a remote client. [*]
- LoggingEvent class changed slightly to support remote logging. The
category field (a Category) has been replaced by the categoryName
field (a String). [*]
April 14, 2000
Release of version 0.8.3b
- Corrected a bug in Category.removeAppender(String) which would
never remove the desired appender. Thanks to Moses Hohman for
reporting this bug.
Release of version 0.8.3a
- Corrected a bug RollingFileAppender which would throw an uncaught
exception in case output file could not be opened for
writing. Thanks to Vinay Aggarwal for signaling this problem.
April 13, 2000
- Release of version 0.8.3.
- The log4j.override key defined in BasicConfigurator has been
renamed to log4j.shippedCodeFlagOverride. [**]
- The getCurrentCategories method in the Category class would not
return the correct value. Thanks to Timothy Potter
(tpotter@agency.com) for reporting this problem. [*]
- Appenders now admit a priority threshold as an option. All requests
with a priority lower than the appender's threshold priority are
ignored by the appender. [*]
- Integrated Christopher Taylor's DOMConfigurator parsing XML
configuration files. [*]
- The jar file log4j-net.jar has been replaced by log4j-full.jar. It
contains DOMConfigurator.class in addition to the com.ibm.log4j.net
package. [**]
- Added support for the ANT build tool. Thanks to Christopher Taylor
for supplying the build.xml file. ANT is available form
http://jakarta.apache.org. [*]
- FileAppender's File option now accepts the values "System.out" or
"System.err". If one these values is suppiled in a configuration
file then the output is directed to the corresponding stream.
Moreover, the default constructor of FileAppender no longer sets
System.out as an output target nor does it define a default
layout. [*]
- Added caller class (C), caller file name (F), caller line number
(L), caller method name (M) conversion specifiers to the
PatternLayout class.
The category conversion specifier now takes an optional precision
modifier allowing the user to control the number of right most
components in the category name that will be printed.
Corrected a bug occuring when the caller file name and line number
information were unavilable due to JIT compilation. In that case,
the PatternLayout would not properly use the rest of the available
location information. [*]
The above enhancements and bug-fixes originate from comments by
Nelson Minar (nelson@monkey.org).
March 23, 2000
- Release of version 0.8.2.
- The SimpleLayout and TTCCLayout are replaced by the PatternLayout
in the log4j.jar file to keep its size small. These two layouts are
still part of the package.
- The PatternLayout class is introduced. This new layout is
configurable using a conversion pattern which is parsed at
runtime. This allows the user to choose the output layout without
writing any code and only at a marginal performance cost compared
to the dedicated layouts such as SimpleLayout and TTCCLayout. The
PatternLayout also allows the user to determine minimum and maximum
field lengths.
The PatternLayout was written by Jim Cakalic
(jim_cakalic@na.biomerieux.com). [*]
- All internal components now use LoggingEvent instances to specifiy
logging information.
- Corrected a problem with a missing variable initialization in
SyslogAppender. This caused NullPinterException to be thrown when
logging exceptions.
Added a default constructor to SyslogAppender. The lack of this
constructor caused PropertyConfigurator to throw a
java.lang.InstantiationException when the appender type was set to
be SyslogAppender.
Thanks to Yves Bossel (ybossel@opengets.cl) for accurately
identifying these bugs.
Modified some other related option handling code in
SyslogAppender. [*]
- Made NDC.get public access instead of default access. Thanks to
Y. J. Chun (monac@softonnet.com) for reporting this problem. [*]
- PropertyConfigurator now parses the additivity option for
categories. [*]
- Corrected the value of the ADDITIVITY_PREFIX constant to match the
documented value, that is "log4j.additivity". [**]
- Corrected a really bad bug where System.out would be closed when
PropertyConfigurator.configure was called. Thanks to Christopher
Taylor (cstaylor@pacbell.net) for tracking and reporting this bug. [*]
- The PropertyConfiguator now prints debug messages if the flag
"log4j.configDebug" is defined in the configuration
file. Previously, only if the system property "log4j.configDebug"
was set would debug messages be printed. A question by Shawn
Kircher (skircher@vninet.com) induced this change. [*]
- In AbsoluteTimeDateFormat, DateTimeDateFormat and ISO8601DateFormat
the separator between the seconds and milliseconds has been changed
to comma from full stop, in order to be compliant with ISO8601's
preferred sign. Thanks to Jim Cakalic
(jim_cakalic@na.biomerieux.com) for pointing out this discrepancy
with the standard. [*]
- Corrected a bug where RollingFileAppender would not work
properly on Windows systems. Thanks to Heinz Richter
(heinz.richter@ecmwf.int) for noting this problem.
February 19, 2000
- Release of version 0.8.1.
- Core classes are now independent of the format of the options
file. Configurable core classes implement the OptionHandler
interface. OptionHandlers allows configurators to learn the
relevant option names. The configurator feeds option values to the
OptionHandler which configures itself.
As a result of these changes, the Init class has been broken down
to two separate classes: the BasicConfigurator and the
PropertiesConfigurator. [**]
An XML configurator for 0.8.0 has been already written by
Christopher Taylor (cstaylor@pacbell.net).
- Added multiple appender support per category. The appenders follow
the category hierarchy, i.e. a child category inherits the
appenders of its parents.
- Added an assert() method to the Category class. Steven Marcus
(srnm@awaretechnologies.com) requested this addition. [*]
- Atomatic stack printing is no longer supported. This was an unused
and unreliable feature which unnecessarily complicated the
code. [*]
- log4j now emits a single warning message when no appender to write to
could be found. This is typically the case when the user forgets
to configure the log4j environment. This change was suggested by
Jim Cakalic (jim_cakalic@na.biomerieux.com). [*]
- RollingFileAppender adds file roll over capability--implemented by
Heinz Richter (heinz.richter@ecmwf.int). [*]
- Corrected a bug where a java.lang.NoClassDefFoundError would be
thrown because com.ibm.log4j.helpers.SyslogTracerPrintWriter was
not included in log4j.jar. Thanks to Jim Cakalic (jim_cakalic@na.biomerieux.com)
for signaling this bug. [*]
February 9, 2000
- Release of version 0.8.0.
- There has been an important API changes. The Log, NOPLog and ILog
classes have been removed. Their functionality has been migrated to
the Category class. [***]
In this release, instead of writing
ILog.debug(CAT, "Some message.");
one will write
CAT.debug("Some message.");
Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de> observed that
one could use the Category objects directly for logging.
- It is no longer possible to instantiate Category objects directly.
Instead, one would use the factory method
Category.getInstance(String name). [***]
There category instantiation code was moved to CateogryFactory
class. This class has package visibility and remains hidden from
the user.
This stylistic improvement was suggested by Luke Blanshard
(luke@quiq.com).
- The Init class offers methods to initialize the log4j
environment. The Init.flagAsShippedCode method replaces the NOPLog
class.
- Changes in the documentation to reflect the API changes.
- The NDC.cloneStack and inherit methods now tolerate null-stacks. [*]
January 29, 2000
- Release of version 0.7.5.
- TTCCLayout now takes a java.text.DateFormat object as a
parameter. The task of formatting the date is delegated to this
object.
Added four classes extending the java.text.DateFormat class. These
are RelativeTimeDateFormat, AbsoluteTimeDateFormat,
DateTimeDateFormat and ISO8601DateFormat classes.
Thanks to Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de>
for suggesting the ISO8601 date format.
These four classes can be parametrized with a particular
TimeZone. The TTCCLayout class now accepts a new configuration file
option called "TimeZone".
These four DateFormats are less malleable than the
java.text.SimpleDateFormat but they are also much faster.
As a consequence of these changes, the setRelativeTime,
setDatePrinting methods in TTCCLayout have been removed along with
the associated configuration file options RelativeTime,
DatePrinting and TimePrinting. [**]
The current code is inspired by code contributed by
Heinz Richter (heinz.richter@ecmwf.int).
- The Log.emerg method has been deprecated. If you use statements of
EMERG priority, please use the Log.log form instead. [**]
- Added getDepth and setMaxdepth methods to the NDC class. This makes
it easier to manage the nested context depth especially when
callees push but forget to pop.
- Moved the documentation in com/ibm/log4j/package.html to
com/ibm/log4j/overview.html. Many users were failing to read the
com/ibm/log4j/package.html description due to the unfortunate
layout of the text. Hopefully more people will read the package
overview in its present location.
- Added the com.ibm.log4j.net package for doing remote logging using
TCP sockets. This is still experimental code.
- Added new debug, .., emerg methods that do not require a category
parameter. They assume the "root" category, that is the decision to
whether print or not is made by comparing the statement's priority
with the default priority. [*]
January 21, 2000
- Release of version 0.7.4.
- Added a new ILog.init method accepting an Appender and a
configuration file as parameters.
- FileAppender's setWriter and setFile methods where not instantiating
a new tracer. This caused stack traces to be lost! SyslogAppender
had a similar problem. [*]
- The FileAppender and SyslogAppender where not calling the layout's
readConfig method to set layout specific options. Thanks to Heinz
Richter (heinz.richter@ecmwf.int) for reporting this bug. [*]
- Corrected a bug in Log.log() method where the appender was always
called with Priority.DEBUG. Thanks to Oliver Boehm
(Oliver.Boehm@abaxx.de) for reporting this bug. [*]
January 14, 2000
- Release of version 0.7.3.
- Added Syslog compatibility. One can now choose (at runtime) between
remote syslog logging or file logging. [*]
Syslog logging performance, although not appalling, is significantly
slower than file logging.
- Priority class was enriched with the previously missing priorities
NOTICE, ALERT and CRIT. The internal constants were also aligned with
the syslog counterparts. [*]
- Added the Log.log method to support the new priorities. [*]
- TracerPrintWriter is now an independent class instead of being a
nested top-level class in Tracer. [*]
- A number of writers, namely the SyslogWriter, SyslogQuietWriter,
SyslogTracerPrintWriter, were added to the helper package. [*]
- Log.force method was removed. The various Appender.doAppend
implementations take over its functionality. [*]
- FileAppender and SyslogAppender now use QuietWriter. QuietWriter is
a FilterWriter which hides exceptions and instead emits a single
warning message to System.err. [*]
- The layout is now an initialization parameter to the appender
type. Previously, the layout and the appender where independent
parameters to the Log constructor. [**]
- Many small improvements and corrections in the documentation.
Syslog related documentation remains sparse.
- ILog.init() and ILog.init(String configFile) have been changed to
call ILog.init(,,,) with "com.ibm.log4j.Log.class" as the first
parameter. This makes it easier for people to get familiar with log4j. [**]
- Added missing files to the make directory. These files are useful
for those wishing to use the log4j make environment. Thanks to "Lee
Hall" <LHall@JavaFoundry.com> for reporting this omission. [*]
Until recently the make environment failed to compile RMI stubs in
a single run. This nagging problem has been corrected thanks to
help from Thomas Eirich (IBM Zurich Research Lab).
January 4, 2000
- Release of version 0.7.2.
- Some users have been rightly complaining about the verbosity
TTCCLayout's date output. The full date output is now shortened to
"dd MMM YYYY HH:mm:ss.SSS" for example, "06 Nov 1994 08:49:37.459"
In addition, users may now choose to print only time information,
as in "08:49:37.459". [*]
- The package now uses Writer instead of OutputStream as its output
target. This makes the log4j code smaller and easier to
understand at the cost of a slight performance degradation. As a
result of this change a few method names in FileAppender class were
changed. [**]
- Preliminary experiments with SyslogAppedner and SyslogLayout show
that syslog compatibility is not far away. The difficultly is
adding syslog compatibility without making radical changes to the
current log4j architecture.
- Corrected a bug in the NOPLog.createInstance method which always
created a Log singleton even if the system property "log4j.logType"
was set to NOPLog. Thanks to Robert Gottofrey
(Robert.Gottofrey@wdr.com) for reporting this bug and the
associated test case.
- Removed the inconsistent "Layout" configuration option in
Log.readConfig(). This change should be transparent to most
users. [*/**]
December 20, 1999
- Release of version 0.7.1.
- The LogCreationManager class has been removed. Its functionality
has been transfered to the createInstance and getInstance methods
in the Log and NOPLog classes. The new way of creating instances is
both simpler and less error prone although just as flexible. [**]
As a result of these changes, the init family of methods in the
ILog class have been adjusted to the new way of creating the log
singleton.
- The Appender interface has been introduced. The method of writing a
log statement into an output stream can now be varied by using a
different Appender. The new FileAppender offers the same
functionality that was previously part of the Log class. [**]
- Changed the time format used in TTCCLayout to be of the form "Day,
dd MMM YYYY HH:mm:ss.SSS GMT" for example, "Sun, 06 Nov 1994
22:49:37.459 GMT". This format is almost the same as the format
specified in RFC 1123 and also the format recommended in RFC
2616. The only difference is the additional milliseconds
information. [*]
- The layout specific options were not read from the configuration
file due to a missing instruction. Many thanks to Vikram Sridharan
(Vikram.Sridharan@alysis.com) to patiently pointing out this
omission to an unbelieving maintainer. [*]
December 16, 1999
- Release of version 0.7.0.
- Version 0.7.0 and above will be distributed under the IBM Public
License (IPL). The IPL is an approved open source license (see
http://www.opensource.org/licenses/ for a list). It grants similar
rights to the previous ALPHAWORKS license agreement, in particular,
the right to redistribute and to modify the package.
- The Log class can now be parameterized with a Layout object.
Layouts determine the format of what is printed, where as the Log
class decides when to print and to where. [**]
As a result of this modularization, the CGULog and NOPCGULog
classes no longer exists. CGULog class has been replaced with the
TTCCLayout (Time Thread Context Category). This should make it
easier to create new log output formats.
Some time in the near future, the Log class will be further broken
down to allow different strategies for writing to output streams.
- Renamed com.ibm.util.log hierarchy to to com.ibm.log4j. I wanted to
do this for some time. I feel release 0.7.0 was the last
opportunity to do so. I am sorry for the the trouble caused by this
change. [**/***]
- New NDC class. This class implements nested diagnostic contexts as
suggested by Neil Harrison in the article "Patterns for Logging
Diagnostic Messages" part of the book "Pattern Languages of Program
Design 3" edited by Martin et al. Nested diagnostic contexts is a
nifty feature that was missing up to now. [*]
The StressNDC test class seems to break JDK 1.2.2 beta on AIX. On
Linux and NT using sun's JDK 1.2.2 it seem to work OK. In any case,
tests done with StressNDC and associated perl script seem to
indicate that the NDC class is bug-free.
- Corrected a date formatting bug in CGULog class where on some
environments the wrong month was printed. Thanks to Christopher
Williams (Christopher_Williams@mail.northgrum.com) for signaling
this bug. Also changed the month format from a number to a three
letter abbreviation such as "Jan", "Feb", ..., "Dec". The new
format is unambiguous regardless of local date format. [*]
December 8, 1999
- Release of version 0.6.2.
- Clearer documentation with still much room for improvement.
- Corrected a bug in the Tracer class which always used the Unix line
separator instead of the system specific separator. Thanks to
Vikram Sridharan (Vikram.Sridharan@alysis.com) for singaling this
bug. [*]
- Corrected a runaway comment which gulped the CGULog.readConfig
method. [*]
- Added the init family of methods to the ILog class to ease the
setup of a basic logging environment. Thanks to Mark Donszelmann
(Mark.Donszelmann@cern.ch) for this enhancement. [*]
- Just an hour after releasing version 0.6.1 detected and corrected a
bug where the Tracer class would correctly print Exception stack
trace but not the type of the Exception. Replaced the
distribution on www.zurich.ibm.com without changing the version
number. I hope nobody is using the intermediary (and buggy) release
of 0.6.1. [*]
November 16, 1999
- Release of log4j version 0.6.1.
- Better documentation with still much room for improvement.
- For consistence sake, added setDefaultPriority and
getDefaultPriority methods to the Category class and deprecated
setDefaultPriority in the Log.class. [**]
- Corrected a major bug where if two categories were homonyms the
second instance would not be properly initialized.
- Increased the speed of Exception logging from about 4000
microseconds to about 1000. It seems that for some people Exception
logging is performance critical. Improved implementation is a
variant of Nocolai's (XNH@crisplant.com) implementation. [*]
November 9, 1999
- Release of log4j 0.6.0 with incomplete documentation.
- Added a stress test program to debug the new Category class. It
turns out that the test program was as hard to get right as the
Category class. Given the favorable results of the stress test I am
quite confident that the new class is now bug free. This assumption
has been proven to be wrong. See above.
- Created a new class called Category to manipulate categories
instead of plain Strings. The new class is just as easy to use.
However, the evaluation of whether to log or not to log is at least
10 times faster. The NOP class performance remain unaffected by the
change. (You can't improve on the performance of an empty function
call.)
Many thanks to Alex Blewitt "Alex.Blewitt@ioshq.com" for his
valuable comments. He was the first to observe that finding Strings
in a hash table was an expensive operation.
This change will require some recoding on your part. See the FAQ
for more details. [***]
- Modified the force in Log and CGULog method to use a byte[] buffer
instead of a StringBuffer. The old code was clearer but the new one
is at least 25% faster. [*]
- Added regression testing.
- We now enforce a policy where the OutputStream set by
setOutputStream is a user managed resource whereas the OutputStream
opened using setLogFile is the Log class' responsibility.
The setLogFile method now closes any previous OutputStream if only
if opened through setLogFile. If the previous OutputStream was
opened by the user and set through setOutputStream the previous
OutputStream is untouched.
Similarly, setOutputStream will close any previous OutputStream if
and only if it was opened using setLogFile.
- Added a new method logOutputStreamExists to the Log class allowing
the programmer to check if there is already an opened stream before
trying to set a new one. A stream can be opened as a byproduct of
reading the configuration file.
- Changed the behavior of the (private) Log.Append method in case of
failure to write to the OutputStream.
Previously, in case of failure, we reverted to System.err. Now, we
emit a warning message and discard all future log messages. The
new behavior is consistent with our current unreliable logging
semantics. The change prevents an otherwise functional program
from failing because the terminal is flooded with logging messages.
- Renamed the iLog to ILog to remain consistent with our class naming
scheme. The initial intention was to add ILog and deprecate
iLog. However, I am running CVS on a fat16 partition, causing
serious problems when files differ only in case.
- Corrected a bug where the LogFileName was not remembered. Thanks to
Jens for signaling this bug.
October 28, 1999
- Release of log4j v0.5a
- Now the programmer can choose to truncate the log file instead of
always appending to it. This functionality was first requested and
intially implemented by "Jens Uwe Pipka" jens.pipka@gmx.de. [*]
- setLogFile now opens the requested file instead of having the
Append function open it later. Cleaned up some related code in the
Append function. Although nobody has requested it, there is still
no method to close the log file. This is harder to implement
reliably than it sounds. [*]
- Simplified setLogOutputStream so that it does no longer return the
previously set OutputStream. [*]
October 27, 1999
- Released log4j v0.5
- Joe Walker (joe@eireneh.com) observed that the
LogCreationManager.getSingleton mechanism was cumbersome. There is
now a new class iLog (indirect Log) which hides the need to call
getSingleton. Performance testing on my 233Mhz Thinkpad shows that
this indirection has small performance impact on non-logged calls
in the order of 40 nanoseconds. The impact on logged calls is
negligible. [*]
- Added a jar file to the distribution. The jar file contains only
the files you would need to use log but not other classes needed
for testing nor examples.
- Corrected a bug where CGUNOPLog was not integrated to the Makefile.
- Added new public methods isDebugEnabled and isInfoEnabled to allow
programmers to check whether a debug/info statement will be logged
without incurring the cost of message parameter construction. This
addition was suggested by Luke Blanshard Luke@quiq.com. [*]
- Renamed the private method evaluate to isEnabled. Also made it
final with no apparent speed gains. In addition, made the
Log.force method public. [*]
- New syntactic sugar debug, ..., emerg, methods to log objects. [*]
- Modified the interface to deal with Throwables and not just
Exceptions. My thanks to Luke Blanshard for signaling this "bug". [*]
- Added more tests to the LogPerformance class. In particular, to
test the influence of indirect debug calls.
- Added a "make" mini-tutorial for those who want to modify the code.
- License updated to standard alphaWorks license allowing
modifications to source code. However, this license explicitly
requires that modifications be communicated back to alphaWorks.
October 15, 1999
- Initial availability on alphaWorks.
Refer to the FAQ for the lineage of the package.