2.12.0 (2019-06-23)

This release contains 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.

New features include support for reconfiguration of Log4j configuraton files accessed via HTTP(s) and Spring Cloud Config specifically, a new Docker Lookup for obtaining information about the current Docker container, new reconfiguration methods added to the Configurator class, the ability to pad integers with leading zeros in filenames generated by the rolling file appenders, and allowing the TCP SocketAppender to connect to multiple IP addresses when they are returned from DNS.

More details on the new features and fixes are itemized below.

Note that the XML, JSON and YAML formats changed in the 2.11.0 release: they no longer have the timeMillis attribute and instead have an Instant element with epochSecond and nanoOfSecond attributes.

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

Log4j 2.12.0 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.



  • Allow custom end-of-line with JsonLayout. (for LOG4J2-2337 by Gary Gregory, Arvind Sahare, Patrice Ferrot)

  • Allow zero padding the counter of a RollingFileAppender. (for LOG4J2-2403 by Ralph Goers, hupfdule)

  • Add reconfiguration methods to Configurator. (for LOG4J2-2406 by Ralph Goers)

  • Add filter that will match events when no marker is present. (for LOG4J2-2427 by Ralph Goers, Rimaljit Kaur)

  • TCP Appender should support a host name resolving to multiple IP addresses. (for LOG4J2-2586 by Ralph Goers)

  • GZIP compression on rollover supports configurable compression levels. (for LOG4J2-2598 by Carter Kozak, Carter Kozak)

  • AsyncQueueFullPolicy configuration short values "Default" and "Discard" are case-insensitive to avoid confusion. (for LOG4J2-2611 by Carter Kozak)

  • Add and use method org.apache.logging.log4j.message.MapMessage.toKey(String) for simpler subclasses. (for LOG4J2-2634 by Gary Gregory)

  • Add support for reconfiguration via HTTP(S), Docker, and Spring Cloud Configuration. (for LOG4J2-913 by Ralph Goers)


  • Update Jackson from 2.9.7 to 2.9.8. (for LOG4J2-2570 by Gary Gregory, Gary Gregory)

  • Update MongoDB 3 module driver from 3.9.0 to 3.10.1. (for LOG4J2-2574 by Gary Gregory, Gary Gregory)

  • Update Jackson from 2.9.8 to 2.9.9. (for LOG4J2-2619 by Gary Gregory)

  • Refactor several AsyncLogger methods below the 35 byte threshold for inlining. (for LOG4J2-2634 by Carter Kozak)

  • Update tests from H2 1.4.197 to 1.4.199. (for by Gary Gregory)


  • FailoverAppender was failing with ERROR appender Failover has no parameter that matches element Failovers. (for LOG4J2-1103 by Ralph Goers, Seán Dunne)

  • Lookups were not found if the plugin key was not lower case. (for LOG4J2-1143 by Ralph Goers, Pascal Heinrich)

  • Locate plugins within a Jar using a URL Connection. (for LOG4J2-1852 by Ralph Goers, Tanner Altares)

  • RollingRandomAccessFileAppender error message referenced incorrect class name. (for LOG4J2-2547 by Ralph Goers)

  • NullPointerException in JdbcAppender.createAppender(). (for LOG4J2-2559 by Gary Gregory, Li Lei)

  • JEP223 version detection fix for JDK 9 and up. (for LOG4J2-2561 by Ralph Goers, Ulrich Enslin)

  • MapPatternConverter is properly created from the '%K', '%map', and '%MAP' patterns. PatternConverter instanceOf methods with unknown parameter types no longer elide those with known parameters. (for LOG4J2-2564 by Carter Kozak)

  • StackOverflowException when server not reachable with SocketAppender. (for LOG4J2-2592 by Gary Gregory, Dávid Kaya)

  • Throw better exception message when both log4j-slf4j-impl and log4j-to-slf4j are present. (for LOG4J2-2597 by Ralph Goers)

  • java.lang.StackOverflowError at org.apache.logging.log4j.junit.AbstractExternalFileCleaner.println(AbstractExternalFileCleaner.java:169). (for LOG4J2-2598 by Gary Gregory, Gary Gregory)

  • Update file time when size based triggering policy is used without a time-based triggering policy. (for LOG4J2-2602 by Ralph Goers)

  • Asynchronous logging when the queue is full no longer results in heavy CPU utilization and low throughput. (for LOG4J2-2606 by Carter Kozak)

  • Explicitly set file creation time. (for LOG4J2-2610 by Ralph Goers)

  • NullPointerException at org.apache.logging.log4j.core.appender.db.jdbc.JdbcDatabaseManager.writeInternal(JdbcDatabaseManager.java:803). (for LOG4J2-2612 by Gary Gregory)

  • Restore constructor to ThrowablePatternConverter that was removed in 2.8.2. (for LOG4J2-2616 by Ralph Goers)

  • Possible ClassCastException in org.apache.logging.log4j.core.script.ScriptManager.ScriptManager(Configuration, WatchManager) (for LOG4J2-2618 by Gary Gregory)

  • StructuredDataId was ignoring maxLength attribute. (for LOG4J2-2622 by Ralph Goers)

  • Fix a race allowing events not to be recorded when a RoutingAppender purge policy attempts to delete an idle appender at exactly the same time as a new event is recorded. (for LOG4J2-2629 by Carter Kozak)

  • RoutingAppender PurgePolicy implementations no longer stop appenders referenced from the logger configuration, only those that have been created by the RoutingAppender. Note that RoutingAppender.getAppenders no longer includes entries for referenced appenders, only those which it has created. (for LOG4J2-2631 by Carter Kozak)

  • RFC5424Layout was not properly setting default Structured Element id for the MDC (for LOG4J2-2636 by Ralph Goers)