2.6

Release date

2016-05-25

This is the tenth GA release. It contains several bugfixes and new features. The new features include the ability to be garbage-free (avoid allocating temporary objects) while logging if certain conditions are met, a new YAML Layout, the ability to merge configuration files, and documenting Log4j’s performance against other logging frameworks and in various logging configurations. More details on the features and bugfixes are itemized below.

Note that subsequent to the 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);

Log4j 2.6 maintains binary compatibility with previous releases.

Log4j 2.6 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

  • Document dependencies for layouts. (LOG4J2-1011)

  • Added option to discard events below a certain log level if the async logger ring buffer or async appender queue is full. (LOG4J2-1080)

  • Add JNDI lookup documentation. (LOG4J2-1133)

  • PatternLayout: Possible variable substitution in equals substitution parameter. (LOG4J2-1169)

  • Documented benchmark results comparing Log4j 2 performance to other logging libraries. (LOG4J2-1179)

  • Dynamic Subject for SMTP Appender. (LOG4J2-1192)

  • PatternLayout option to limit length of text. (LOG4J2-1217)

  • Added async logger Timeout wait strategy and made this the default wait strategy for async loggers. This prevents a rare deadlock that may occur on Solaris. (LOG4J2-1221)

  • Make PatternLayout header and footer accept a pattern. (LOG4J2-1237)

  • Make header and footer values customizable in JSONLayout. (LOG4J2-1244)

  • Make CSV Layout header and footers accept patterns. (LOG4J2-1245)

  • Add shutdown methods to LogManager. (LOG4J2-124)

  • JeroMqAppender should support layouts. (LOG4J2-1252)

  • (GC) Added support for garbage-free logging in steady state. This includes Async Loggers and logging synchronously to the console and to a file, but does not include the AsyncAppender. This release makes the GelfLayout and the main patterns in the PatternLayout garbage-free. (LOG4J2-1270)

  • (GC) Add MessageFactory that avoid allocation by reusing a cached ParameterizedMessage instance. (LOG4J2-1271)

  • (GC) Add encode(LogEvent, ByteBufferDestination) method to Layout API to enable converting LogEvents to bytes without creating temporary objects. (LOG4J2-1274)

  • FormattedMessage, MessageFormatMessage and StringFormattedMessage should support passing in a Locale to ensure appropriate formatting. (LOG4J2-1277)

  • (GC) Added unrolled varargs methods to Logger API, added Unbox utility to avoid auto-boxing when logging primitive values. (LOG4J2-1278)

  • (GC) Add interface StringBuilderFormattable to enable converting Messages and parameters to text without allocating temporary objects. ParameterizedMessage, ObjectMessage, SimpleMessage and ThreadDumpMessage now implement StringBuilderFormattable. (LOG4J2-1293)

  • (GC) Added manual page on garbage-free logging. (LOG4J2-1297)

  • Add pattern converter for thread id and priority in PatternLayout. (LOG4J2-1299)

  • Add documentation links to runtime dependencies in each component intro page. (LOG4J2-1303)

  • (GC) Added methods to the Logger interface for logging CharSequence messages. (LOG4J2-1326)

  • (GC) FileAppender, RollingFileAppender and MemoryMappedFileAppender are now also garbage-free by default. (LOG4J2-1344)

  • Add an AutoCloseable ThreadContext class: CloseableThreadContext. (LOG4J2-1348)

  • Option to not log stack traces for logged Throwables in GelfLayout. (LOG4J2-1357)

  • Added a YAML layout. (LOG4J2-1362)

  • (GC) Update Logger wrapper Generator tool to generate methods for the new Logger methods. (LOG4J2-1373)

  • Support merging configurations to for a composite configuration. (LOG4J2-494)

  • Pattern to drop first N package parts. (LOG4J2-621)

Changed

  • org.apache.logging.log4j.core.LoggerContext#updateLoggers should call firePropertyChangeEvent. (LOG4J2-1206)

  • Update SLF4J from 1.7.12 to 1.7.13. (LOG4J2-1219)

  • Misleading Value In Properties Example. (LOG4J2-1233)

  • Update Jackson from 2.6.3 to 2.6.4. (LOG4J2-1239)

  • Update Liquibase from 3.3.5 to 3.4.2. (LOG4J2-1240)

  • Update Jackson from 2.6.4 to 2.7.0. (LOG4J2-1249)

  • Update LMAX Disruptor from 3.3.2 to 3.3.4. (LOG4J2-1253)

  • Add enhanced entry and exit methods. (LOG4J2-1255)

  • (GC) ParameterizedMessage optimizations to avoid or at least postpone allocating temporary objects. (LOG4J2-1271)

  • (GC) Improve LoggerConfig’s data structure for AppenderControl objects to avoid allocating temporary objects during traversal for each log event. (LOG4J2-1272)

  • (GC) Provide ThreadLocal-based gc-free caching mechanism in DatePatternConverter for non-webapps. (LOG4J2-1283)

  • (GC) Update PatternLayout to utilize gc-free mechanism for LogEvent processing. (LOG4J2-1291)

  • (GC) Update RandomAccessFileAppender and RollingRandomAccessFileAppender to utilize gc-free Layout.encode() method. (LOG4J2-1292)

  • Update Kafka client from 0.9.0.0 to 0.9.0.1. (LOG4J2-1294)

  • Remove serializability from classes that don’t need it. (LOG4J2-1300)

  • Update Jackson from 2.7.0 to 2.7.2. (LOG4J2-1304)

  • JeroMqAppender should use ShutdownCallbackRegistry instead of runtime hooks. (LOG4J2-1306)

  • Remove need to pre-specify appender et al. identifiers in property file config format. (LOG4J2-1308)

  • (GC) Avoid allocating unnecessary temporary objects in LoggerContext’s getLogger methods. (LOG4J2-1318)

  • (GC) Avoid allocating unnecessary temporary objects in PatternLayout’s NamePatternConverter and ClassNamePatternConverter. (LOG4J2-1321)

  • Update Log4j 1.x migration guide to include information about system property lookup syntax changes. (LOG4J2-1322)

  • (GC) Avoid allocating unnecessary temporary objects in MarkerManager’s getMarker methods. (LOG4J2-1333)

  • (GC) ConsoleAppender is now garbage-free by default. This logic is reusable for all AbstractOutputStreamAppender subclasses. (LOG4J2-1343)

  • (Doc) Clarify documentation for properties that control Log4j behaviour. (LOG4J2-1345)

  • Update Jackson from 2.7.2 to 2.7.3. (LOG4J2-1351)

  • Update javax.mail from 1.5.4 to 1.5.5. (LOG4J2-1352)

  • (GC) GelfLayout does now support garbage-free logging (with compressionType=OFF). (LOG4J2-1356)

  • Update Apache Commons Compress from 1.10 to 1.11. (LOG4J2-1358)

  • (Log4j-internal) Provide message text as CharSequence for some message types to optimize some layouts. (LOG4J2-1365)

  • Migrate tests from Logback 1.1.3 to 1.1.7. (LOG4J2-1374)

  • Update SLF4J from 1.7.13 to 1.7.21. (LOG4J2-1375)

  • Update Jackson from 2.7.3 to 2.7.4. (LOG4J2-1380)

  • Update Apache Commons CSV from 1.2 to 1.3. (LOG4J2-1384)

  • Update Google java-allocation-instrumenter from 3.0 to 3.0.1. (LOG4J2-1388)

Fixed

  • Add a Log4jLookup class to help write log files relative to log4j2.xml. (LOG4J2-1050)

  • Fix documentation to specify the correct default wait strategy used by async loggers. (LOG4J2-1212)

  • Documentation/XSD inconsistencies. (LOG4J2-1215)

  • Creation of a LoggerContext will fail if shutdown is in progress. LogManager will default to SimpleLogger instead. (LOG4J2-1222)

  • NullPointerException in MapLookup.lookup if the event is null. (LOG4J2-1227)

  • Don’t concatenate SYSLOG Messages. (LOG4J2-1230)

  • Incorrect log rotation in last week of year. (LOG4J2-1232)

  • org.apache.logging.log4j.core.net.TcpSocketManager and other classes does not report internal exceptions to the status logger. (LOG4J2-1238)

  • Fixed broken nanotime in pattern layout. (LOG4J2-1248)

  • Fix JUL bridge issue where LogRecord.getParameters() is used when null. (LOG4J2-1251)

  • Fix typo in Flow Tracing documentation. (LOG4J2-1254)

  • Async DynamicThresholdFilter does not use the log event’s context map. (LOG4J2-1258)

  • TlsSyslogFrame calculates message length incorrectly. (LOG4J2-1260)

  • Stop throwing unnecessary exception in Log4jServletContextListener.contextDestroyed(). (LOG4J2-1262)

  • The ConfigurationSource was not saved for BuiltConfigurations so monitor interval had no effect. (LOG4J2-1263)

  • FixedDateFormat was incorrect for formats having MMM with the French locale. (LOG4J2-1268)

  • (GC) AsyncLogger should use thread-local translator by default. (LOG4J2-1269)

  • Fix RollingAppenderNoUnconditionalDeleteTest repeat test runs from failing. (LOG4J2-1275)

  • LoggerMessageSupplierTest and LoggerSupplierTest are Locale sensitive. (LOG4J2-1276)

  • Deprecate org.apache.logging.log4j.util.MessageSupplier. (LOG4J2-1280)

  • Logger methods taking Supplier parameters now correctly handle cases where the supplied value is a Message. (LOG4J2-1280)

  • (GC) LoggerConfig.getProperties() should not allocate on each call. (LOG4J2-1281)

  • Made default MessageFactory configurable. (LOG4J2-1284)

  • Change flow logging text from "entry' to "Enter" and "exit" to "Exit". (LOG4J2-1289)

  • Configuration file error does not show cause exception. (LOG4J2-1309)

  • JndiLookup mindlessly casts to String and should use String.valueOf(). (LOG4J2-1310)

  • Improve error handling in the Async Logger background thread: the new default exception handler no longer rethrows the error. (LOG4J2-1324)

  • Fix NoClassDefFoundError in ReflectionUtil on Google App Engine. (LOG4J2-1330)

  • LoggerFactory in 1.2 API module is not compatible with 1.2. (LOG4J2-1336)

  • (Perf) AsyncLogger performance optimization: avoid calling instanceof TimestampMessage in hot path. (LOG4J2-1339)

  • Exception from Log4jServletContextListener prevents jetty-maven-plugin run-forked. (LOG4J2-1346)

  • No configuration reload is triggered under Windows when replacing the configuration file with one that has older last modified date. (LOG4J2-1354)

  • Properties Configuration did not support includeLocation attribute on Loggers. (LOG4J2-1363)

  • (Log4j-internal) StatusLogger dropped exceptions when logging parameterized messages. (LOG4J2-1368)

  • "xz" compression results in plaintext, uncompressed files. (LOG4J2-1369)

  • XMLLayout indents, but not the first child tag (Event). (LOG4J2-1372)

  • Copying a MutableLogEvent using Log4jLogEvent.Builder should not unnecessarily obtain caller location information. (LOG4J2-1382)

  • Fixed memory leak related to shutdown hook. (LOG4J2-1387)

  • Log4jWebInitializerImpl: Use Thread instead of Class for fallback classloader. (LOG4J2-248)

  • Generate MDC properties as a JSON map in JSONLayout, with option to output as list of map entries. (LOG4J2-623)

  • JSONLayout doesn’t add a comma between log events. (LOG4J2-908)

  • ClassNotFoundException for BundleContextSelector when initialising in an OSGi environment. (LOG4J2-920)