2.11.1 (2018-07-22)

This release contains new features, bugfixes and minor enhancements.

Due to a break in compatibility in the SLF4J binding, Log4j now ships with two versions of the SLF4J to Log4j adapters. log4j-slf4j-impl should be used with SLF4J 1.7.x and earlier and log4j-slf4j18-impl should be used with SLF4J 1.8.x and later.

As of Log4j 2.9.0, the Log4j API was modified to use java.util.ServiceLoader to locate Log4j implementations, although the former binding mechanism is still supported. The Log4j API JAR is now a multi-release JAR to provide implementations of Java 9 specific classes. Multi-release JARs are not supported by the OSGi specification so OSGi modules will not be able to take advantage of these implementations but will not lose functionality as they will fall back to the implementations used in Java 7 and 8. More details on the new features and fixes are itemized below. Note that some tools are not compatible with multi-release JARs and may fail trying to process class files in the META-INF/versions/9 folder. Those errors should be reported to the tool vendor.

Note that subsequent to the 2.9.0 release, for security reasons, SerializedLayout is deprecated and no longer used as default in the Socket and JMS appenders. SerializedLayout can still be used as before, but has to be specified explicitly. To retain old behaviour, you have to change configuration like:

<Appenders>
  <Socket name="socket" host="localhost" port="9500"/>
</Appenders>

into:

<Appenders>
  <Socket name="socket" host="localhost" port="9500">
    <SerializedLayout/>
  </Socket>
</Appenders>

We do, however, discourage the use of SerializedLayout and recommend JsonLayout as a replacement:

<Appenders>
  <Socket name="socket" host="localhost" port="9500">
    <JsonLayout properties="true"/>
  </Socket>
</Appenders>

Note that subsequent to the 2.9.0 release, for security reasons, Log4j does not process DTD in XML files. If you used DTD for including snippets, you have to use XInclude or Composite Configuration instead.

The Log4j 2.11.1 API, as well as many core components, maintains binary compatibility with previous releases.

Log4j 2.11.1 requires a minimum of Java 7 to build and run. Log4j 2.3 was the last release that supported Java 6.

Basic compatibility with Log4j 1.x is provided through the log4j-1.2-api component, however it does not implement some of the very implementation specific classes and methods. The package names and Maven groupId have been changed to org.apache.logging.log4j to avoid any conflicts with Log4j 1.x.

For complete information on Apache Log4j 2, including instructions on how to submit bug reports, patches, or suggestions for improvement, see the Apache Log4j 2 website.

Changes

Changed

  • Allow composite configuration for context parameter. (for LOG4J2-1721 by Ralph Goers, Phokham Nonava)

  • Status logger should show the Log4j name and version when initializing itself. (for LOG4J2-2302 by Gary Gregory)

  • Log4j2 2.8.2 JMX unregister NullPointerException. (for LOG4J2-2304 by Gary Gregory, wumengsheng)

  • Update Jackson from 2.9.4 to 2.9.5. (for LOG4J2-2311 by Gary Gregory)

  • Update LMAX Disruptor from 3.3.7 to 3.4.2. (for LOG4J2-2313 by Gary Gregory)

  • Update JAnsi from 1.17 to 1.17.1. (for LOG4J2-2328 by Gary Gregory)

  • Added AbstractLogEvent.getMutableInstant to allow the MutableInstant instance to be modified by classes extending AbstractLogEvent. (for LOG4J2-2351 by Carter Kozak)

  • Update Jackson from 2.9.5 to 2.9.6. (for LOG4J2-2357 by Gary Gregory)

  • Update Kafka client from 1.0.0 to 1.1.0. (for LOG4J2-2358 by Gary Gregory)

  • Update Kafka client from 1.1.0 to 1.1.1. (for LOG4J2-2384 by Gary Gregory)

  • Update Groovy from 2.4.13 to 2.5.1. (for LOG4J2-2385 by Gary Gregory)

  • Update optional Apache Commons DBCP from 2.2.0 to 2.4.0. (for LOG4J2-2386 by Gary Gregory)

  • Log4j 2.0 ERROR "Could not search jar" with JBoss EAP 6.2. (for LOG4J2-548 by Gary Gregory, Shehata, Paresh Varke, Eric Victorson, Martin Laforet)

Fixed

  • Curly braces in parameters are not treated as placeholders. (for LOG4J2-2032 by Carter Kozak, Kostiantyn Shchepanovskyi)

  • Improve plugin error message when elements are missing. (for LOG4J2-2268 by Ralph Goers, Tilman Hausherr)

  • MutableLogEvent references to other objects are cleared after each use. Fix a memory leak causing references to parameters to be held after synchronous logging with thread locals enabled. (for LOG4J2-2269 by Carter Kozak)

  • ParserConfigurationException when using Log4j with oracle.xml.jaxp.JXDocumentBuilderFactory. (for LOG4J2-2283 by Gary Gregory, Vishnu Priya Matha)

  • PoolingDriverConnectionSource does not take into account properties, user name, and password. (for LOG4J2-2300 by Gary Gregory)

  • Mixed async loggers no longer forget parameter values, providing some appenders with an array of nulls. (for LOG4J2-2301 by Carter Kozak)

  • Make java.util.ServiceLoader properly work in OSGi by using the Service Loader Mediator Specification. (for LOG4J2-2305 by Ralph Goers, Björn Kautler)

  • Split the SLF4J binding into 2 implementations - one for SLF4J 1.7.x and one for SLF4J 1.8+. (for LOG4J2-2305 by Ralph Goers)

  • MutableLogEvent and RingBufferLogEvent message mementos retain the original format string. (for LOG4J2-2307 by Carter Kozak)

  • Jackson layouts used with AsyncLoggerContextSelector output the expected format rather than only a JSON string of the message text. (for LOG4J2-2312 by Carter Kozak)

  • If root LoggerConfig does not have a Level return ERROR. (for LOG4J2-2316 by Ralph Goers)

  • MutableLogEvent.getNonNullImmutableMessage and Log4jLogEvent.makeMessageImmutable retain format and parameters. (for LOG4J2-2317 by Carter Kozak)

  • Messages are no longer mutated when the asynchronous queue is full. A warning is logged to the status logger instead. (for LOG4J2-2318 by Carter Kozak)

  • Fix NPE in AbstractLogger when another exception is thrown, masking the root cause. (for LOG4J2-2320 by Carter Kozak)

  • AsyncLogger uses the correct level when unspecified. This provides parity between AsyncLogger and Logger. (for LOG4J2-2321 by Carter Kozak)

  • Custom ContextSelector implementations which select an AsyncLoggerContext disable LoggerConfig.includeLocation by default for parity with AsyncLoggerContextSelector. (for LOG4J2-2322 by Carter Kozak)

  • RollingFileManager debug logging avoids string concatenation and errant braces in favor of parameterized logging. (for LOG4J2-2331 by Carter Kozak, Mike Baranski)

  • Handle errors thrown in default disruptor ExceptionHandler implementations to avoid killing background threads. (for LOG4J2-2333 by Carter Kozak)

  • Add API org.apache.logging.log4j.core.appender.AsyncAppender.getQueueSize(). (for LOG4J2-2334 by Gary Gregory)

  • Remove duplicate hyphen from the AsyncLoggerConfig background thread name. (for LOG4J2-2336 by Carter Kozak)

  • The OSGi Activator specified an incorrect version. (for LOG4J2-2343 by Ralph Goers, Raymond Augé)

  • Update Apache Commons Compress from 1.16.1 to 1.17. (for LOG4J2-2347 by Gary Gregory)

  • RingBufferLogEvent memento messages provide the expected format string, and no longer attempt to substitute parameters into curly braces in parameter toString values. Both RingBufferLogEvent and MutableLogEvent memento implementations memoize results to avoid rebuilding formatted string values. (for LOG4J2-2352 by Carter Kozak)

  • PropertiesUtil ignores non-string system properties. Fixes a NoClassDefFoundError initializing StatusLogger caused by an NPE while initializing the static PropertiesUtil field. (for LOG4J2-2355 by Carter Kozak, Henrik Brautaset Aronsen)

  • Fixed a memory leak in which ReusableObjectMessage would hold a reference to the most recently logged object. (for LOG4J2-2362 by Carter Kozak)

  • Fixed a memory leak in which ReusableParameterizedMessage would hold a reference to the most recently logged throwable and provided varargs array. (for LOG4J2-2364 by Carter Kozak)

  • Nested logging doesn’t clobber AbstractStringLayout cached StringBuilders (for LOG4J2-2368 by Carter Kozak)

  • StringBuilders.escapeJson implementation runs in linear time. Escaping large JSON strings in EncodingPatternConverter and MapMessage will perform significantly better. (for LOG4J2-2373 by Carter Kozak, Kevin Meurer)

  • StringBuilders.escapeXml implementation runs in linear time. Escaping large XML strings in EncodingPatternConverter and MapMessage will perform significantly better. (for LOG4J2-2376 by Carter Kozak, Kevin Meurer)

  • NullPointerException in org.apache.logging.log4j.util.LoaderUtil.getClassLoaders() when using Bootstrap class loader. (for LOG4J2-2377 by Gary Gregory, Mirko Rzehak)

  • Update Mongodb 3 driver from 3.6.3 to 3.8.0. (for LOG4J2-2382 by Gary Gregory)

  • Thread indefinitely blocked when logging a message in an interrupted thread. (for LOG4J2-2388 by Gary Gregory, Failled)

  • ThrowableProxy was saving and retrieving cache entries using different keys. (for LOG4J2-2389 by Ralph Goers, Liu Wen)

  • Fix broken links in log4j web documentation. (for LOG4J2-2390 by Ralph Goers, anton-balaniuc)