## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##  http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied.  See the License for the
## specific language governing permissions and limitations
## under the License.
#set($h1='#')
#set($h2='##')
#set($h3='###')
#set($relVersion=$announceParameters.releaseVersion)
#set($relCount=$announceParameters.releaseCount)
#macro(formatAction $item)
## Use replaceAll to fix up LF-only line ends on Windows.
## Also replace < and > with entity versions to avoid HTML being misinterpreted.
#set($action=$item.action.replaceAll("\n","
").replaceAll("<", "&lt;").replaceAll(">", "&gt;"))
#if($item.issue)
#set($issue = $item.issue)
#set($url = "https://issues.apache.org/jira/browse/$issue")
#else
#set($issue = "")
#end
* #if($issue)[$issue]($url):#end

${action}#if($item.dueTo) Thanks to ${item.dueTo}.#end

#end
## -----------------------------------------
$h1 Apache Log4j ${relVersion} Release Notes

The ${developmentTeam} is pleased to announce the Log4j ${relVersion} release!

Apache Log4j is a well known framework for logging application behavior. Log4j 2 is an upgrade
to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides
many other modern features such as support for Markers, lambda expressions for lazy logging,
property substitution using Lookups, multiple patterns on a PatternLayout and asynchronous
Loggers. Another notable Log4j 2 feature is the ability to be "garbage-free" (avoid allocating
temporary objects) while logging. In addition, Log4j 2 will not lose events while reconfiguring.

This release contains new features, bugfixes and minor enhancements. The Log4j Core jar is now
a multi-release jar and adds limited support for precise (micro and nanosecond) timestamps when
running on Java 9.

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

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 ${relVersion} API, as well as many core components, maintains binary compatibility with previous releases.

## Hack to improve layout: replace all pairs of spaces with a single new-line
$h2 $release.description.replaceAll("  ", "
")

#if ($release.actions.size() == 0)
No changes defined in this version.
#else
Changes in this version include:

#if ($release.getActions('add').size() !=0)
$h3 New Features
#foreach($actionItem in $release.getActions('add'))
#formatAction($actionItem)
#end
#end

#if ($release.getActions('fix').size() !=0)
$h3 Fixed Bugs
#foreach($actionItem in $release.getActions('fix'))
#formatAction($actionItem)
#end
#end

#if ($release.getActions('update').size() !=0)
$h3 Changes
#foreach($actionItem in $release.getActions('update'))
#formatAction($actionItem)
#end
#end

#if ($release.getActions('remove').size() !=0)
$h3 Removed
#foreach($actionItem in $release.getActions('remove'))
#formatAction($actionItem)
#end
#end
## End of main loop
#end
---

Apache Log4j ${relVersion} 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 ${project.name}, including instructions on how to submit bug
reports, patches, or suggestions for improvement, see the Apache ${project.name} website:

${project.url}