2.7

Release date

2016-10-02

This release contains several bugfixes and new features. The new features include new logging API modules for Scala 2.10 and 2.11, and support for various non-blocking queue implementations in AsyncAppender. Furthermore the ThreadContext map can now be configured to be garbage-free, and users can now inject context data from other sources than ThreadContext. Context data values can be any Object, not just Strings. More details on the fixes are itemized below.

Note that subsequent to the 2.6 release a minor source incompatibility was found due to the addition of new methods to the Logger interface. If you have code that does:

logger.error(null, “This is the log message”, throwable);

or similar with any log level you will get a compiler error saying the reference is ambiguous. To correct this either do:

logger.error(“This is the log message”, throwable);

or

logger.error((Marker) null, “This is the log message”, throwable);

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

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

Added

  • Users can now inject context data from other sources than ThreadContext. Values can be any Object, not just Strings. (LOG4J2-1010)

  • Added Logging API for Scala 2.10 and 2.11. (LOG4J2-1181)

  • (GC) Added support for garbage-free ThreadContext map. Disabled by default, users need to enable this explicitly. (LOG4J2-1349)

  • Added optional support for Conversant DisruptorBlockingQueue in AsyncAppender. (LOG4J2-1430)

  • Added optional support for JCTools MPSC bounded lock-free queue in AsyncAppender. (LOG4J2-1439)

  • (GC) Changed LogEvent’s internal data structure for context data to be garbage-free. Added method LogEvent#getContextData(), deprecated method #getContextMap(). (LOG4J2-1447)

  • [PatternLayout] Add an ANSI option to %message. (LOG4J2-1458)

  • [PatternLayout] Add an ANSI option to %xThrowable. (LOG4J2-1471)

  • org.apache.logging.log4j.core.LoggerContext now implements Closeable. (LOG4J2-1472)

  • FileAppender is now able to create files on-demand. (LOG4J2-1501)

  • RollingFileAppender is now able to create files on-demand. (LOG4J2-1504)

  • Create a Builder for the FileAppender plugin to facilitate adding attributes in the future. (LOG4J2-1505)

  • Allow Builders to be completely generic. (LOG4J2-1507)

  • Allow a Builder to subclass another Builder. (LOG4J2-1508)

  • Added options to exclude stack trace from JSON, XML and YAML layouts. (LOG4J2-1512)

  • Add ThreadContextMap2 interface supporting method putAll(Map<String, String>). (LOG4J2-1516)

  • Add ThreadContext.putAll(Map<String, String>). (LOG4J2-1519)

  • Add JUnit Rule implementations to manage the thread context. (LOG4J2-1520)

  • Added ability to generate Log4j 2-style XML configuration file from ConfigurationBuilder. (LOG4J2-1528)

  • Added Core API Configurator.shutdown(LoggerContext, long, TimeUnit). (LOG4J2-1539)

  • The Core AbstractManager now tracks its LoggerContext. (LOG4J2-1540)

  • The Core AbstractConfiguration now tracks its LoggerContext and add Configuration.getLoggerContext(). (LOG4J2-1547)

  • AbstractManager now implements AutoCloseable. (LOG4J2-1553)

  • Add a Builder for the SocketAppender (deprecates factory method). (LOG4J2-1557)

  • SocketAppender now supports IO buffering. (LOG4J2-1558)

  • Added support for java.util.concurrent.LinkedTransferQueue to AsyncAppender. (LOG4J2-1568)

  • Add a Builder to the RoutingAppender and deprecate factory method. (LOG4J2-1577)

  • RoutingAppender can be configured with scripts. Add Script in a Routes element. (LOG4J2-1578)

  • Add a ScriptAppenderSelector to create an Appender specified by a Script. (LOG4J2-1597)

  • Add a Builder to ServletAppender and deprecate factory method. (LOG4J2-1609)

Changed

  • Updated Jackson from 2.7.5 to 2.8.0. (LOG4J2-1458)

  • Updated JMS test from ActiveMQ 5.13.3 to 5.13.4. (LOG4J2-1487)

  • Updated Jackson from 2.8.0 to 2.8.1. (LOG4J2-1494)

  • Updated LMAX Disruptor from 3.3.4 to 3.3.5. (LOG4J2-1495)

  • Updated Kafka client from 0.9.1.0 to 0.10.0.0. (LOG4J2-1496)

  • Updated Kafka client from 0.10.0.0 to 0.10.0.1. (LOG4J2-1533)

  • Removed deprecated Core API org.apache.logging.log4j.core.util.Constants.UTF_8. (LOG4J2-1543)

  • Removed deprecated Core API org.apache.logging.log4j.core.util.Assert.requireNonNull(T, String). (LOG4J2-1544)

  • Removed deprecated Web API org.apache.logging.log4j.web.WebLookup.getServletContext(). (LOG4J2-1545)

  • Updated JMS test from ActiveMQ 5.13.4 to 5.14.0. (LOG4J2-1551)

  • Custom Log4j threads now extend Log4jThread. (LOG4J2-1556)

  • Updated Jackson from 2.8.1 to 2.8.2. (LOG4J2-1569)

  • Allow the RollingFileAppender to use default pattern layout. (LOG4J2-1574)

  • Updated Jackson from 2.8.2 to 2.8.3. (LOG4J2-1598)

  • Log4j2 TcpSocketServer in background. (LOG4J2-1604)

  • Improve error messages for TcpSocketServer and UdpSocketServer. (LOG4J2-1605)

  • Update Apache Commons Compress from 1.12 to 1.13. (LOG4J2-1757)

Fixed

  • When starting on Google App Engine, Interpolator now suppresses the NoClassDefFoundError stack trace for the jvmrunargs lookup. (LOG4J2-1051)

  • Documented that JVM Input Arguments Lookup (JMX) is not available on Google App Engine. (LOG4J2-1199)

  • org.apache.logging.log4j.core.appender.routing.IdlePurgePolicy was not working correctly. (LOG4J2-1235)

  • Log4j threads are no longer leaking on Tomcat shutdown. (LOG4J2-1259)

  • Prevent NullPointerException in FastDateParser$TimeZoneStrategy. (LOG4J2-1279)

  • Properties declared in configuration can now have their value either in the element body or in an attribute named "value". (LOG4J2-1313)

  • Support Property values to be specified in configuration as a value attribute as well as an element. (LOG4J2-1313)

  • Support loading custom plugins from jar files and directories whose classpath entries use the "vfs" URL protocol. (LOG4J2-1320)

  • (GC) HighlightConverter and StyleConverter are now GC-free. (LOG4J2-1341)

  • (GC) Added method getParameter() to ObjectMessage (and ReusableObjectMessage). (LOG4J2-1438)

  • Allow comma separated agents, host list to be passed to FlumeAppender. (LOG4J2-1448)

  • Fixed class loader deadlock when using async logging and extended stack trace pattern. (LOG4J2-1457)

  • [OSGi] Fixed missing import package. (LOG4J2-1467)

  • Fixed improper header in CsvParameterLayout. (LOG4J2-1482)

  • (GC) Fixed ISO8601 %date conversion pattern with a period '.' separator for milliseconds is now garbage free. (LOG4J2-1488)

  • (GC) Fixed %date conversion patterns with a timezone parameter are now garbage free. (LOG4J2-1489)

  • Log4j2 should postpone creating log file until the appender actually receives an event. (LOG4J2-1490)

  • Merging configurations failed with an NPE when comparing Nodes with different attributes. (LOG4J2-1500)

  • Fixed issue where CsvParameterLayout and CsvLogEventLayout inserted NUL characters if data starts with {, (, [ or " (LOG4J2-1502)

  • Log4j should not unregister JMX MBeans when log4j2.disable.jmx property is true. (LOG4J2-1506)

  • DynamicThresholdFilter filtered incorrectly when params were passed as individual arguments instead of varargs. (LOG4J2-1511)

  • Prevent deadlock in Async Loggers when queue is full and logged Object’s toString() logs another message. (LOG4J2-1518)

  • Added support for setting StatusLogger destination in ConfigurationBuilder. (LOG4J2-1526)

  • Prevent NPE in RingBufferLogEvent.getFormattedMessage() when used in web applications. (LOG4J2-1527)

  • Attributes were not merged properly in composite configurations. (LOG4J2-1529)

  • Fixed issue where LogEvent.getContextStack() returned null. (LOG4J2-1530)

  • Attributes were not merged properly in composite configurations. (LOG4J2-1532)

  • Prevent NPE when dynamically removing filters. (LOG4J2-1538)

  • Fix file handle resource leak in XmlConfiguration.XmlConfiguration(ConfigurationSource). (LOG4J2-1541)

  • Prevent ArrayIndexOutOfBoundsException in ParameterizedMessage.formatTo for single-char or empty messages. (LOG4J2-1542)

  • [CronTriggeringPolicy] ConfigurationScheduler scheduled the task infinitely after first fire. (LOG4J2-1548)

  • Fixed issue where AsyncLoggerContextSelector+PropertiesConfigurationBuilder defaulted to includeLocation=true. (LOG4J2-1549)

  • Prevent NPE in Level.isInRange. (LOG4J2-1559)

  • Prevent SocketAppender memory usage from growing unbounded if it cannot connect to a server. (LOG4J2-1562)

  • Fix to prevent Log4j 2.6.2 and higher from losing exceptions when a security manager is present. (LOG4J2-1563)

  • Layout is no longer optional. (LOG4J2-1573)

  • (GC) LoggerConfig now stores configuration properties in a List, not a Map to prevent creating temporary Iterator objects. Added method LoggerConfig#getPropertyList(), deprecated method #getProperties(). (LOG4J2-1575)

  • Unregistering JMX components no longer prints a stack trace when the MBean has already been unregistered. (LOG4J2-1581)

  • When initializing on platforms where JMX is not available, Interpolator component no longer prints stack trace for warning messages. (LOG4J2-1582)

  • Fixed scrambled log messages triggered by nested logging from toString() method of a logging parameter object. (LOG4J2-1583)

  • Fixed issue with filters extending AbstractFilter that did not override methods with unrolled varargs. (LOG4J2-1590)

  • Introduced new interface LifeCycle2 with stop(long,TimeUnit) method to avoid breaking backwards compatibility with new Configurator.shutdown(LoggerContext, long, TimeUnit) API. (LOG4J2-1591)

  • Prevent potential NPE in org.apache.logging.log4j.message.ParameterFormatter.formatMessage3(StringBuilder, char[], int, Object[], int, int[]). (LOG4J2-1599)

  • Prevent potential NPE due to org.apache.logging.log4j.core.layout.MarkerPatternSelector.createSelector(PatternMatch[], String, boolean, boolean, Configuration). (LOG4J2-1600)

  • Prevent potential NPE due to org.apache.logging.log4j.core.layout.ScriptPatternSelector.createSelector(AbstractScript, PatternMatch[], String, boolean, boolean, Configuration). (LOG4J2-1601)

  • Prevent potential NPE in org.apache.logging.log4j.core.util.datetime.FormatCache.MultipartKey.equals(Object) when object is null. (LOG4J2-1602)

  • Redo hashCode() and equals() methods in org.apache.logging.log4j.core.net.ssl classes. (LOG4J2-1603)

  • ServletAppender does not provide throwable object to ServletContext. (LOG4J2-1608)

  • Add targetNamespace to log4j-config.xsd. GitHub #43. (LOG4J2-1610)

  • Improved performance of context data injector for web applications to be on par with standalone applications. (LOG4J2-1611)

  • Fixed ClassCastException when using JUL logging during shutdown. (LOG4J2-1618)

  • new Log4jLogEvent().toString() throws an NPE. (LOG4J2-1619)

  • 2.7-rc1: RollingFileAppender immediateFlush default value should be true, not false. (LOG4J2-1620)

  • [OSGi] Fixed wrong Fragment-Host in manifest files. (LOG4J2-351)

  • Added ability to disable (date) lookup completely for compatibility with other libraries like Camel. (LOG4J2-905)