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

         https://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.
////

= 3.0.0-alpha1 (2023-06-17)

As the Java ecosystem has evolved, requests have been received from users, and the need for improved security has
become more apparent, changes were necessariy in Log4j's design:

* With the introduction of the Java Platform Module System (JPMS) changes were needed to how the various log4j modules
are packaged. While not every log4j module is now a fully compliant JPMS module with its own module-info.java file,
all the modules likely to be used in a JPMS environment are.
* Many optional components, such as Scripting, JNDI, JPA and JMS, have been moved to their own modules. This makes
Log4j-core slightly smaller in 3.x and aids in security by not having jars with unwanted behaviors present, making
disabling them via system properties unnecessary.
* All plugins constructed using Log4j 3.x are now located using Java's ServiceLoader. This avoids many of the problems
users had packaging plugins in "shaded" jars as that technology directly supports ServiceLoader. Plugins constructed
using Log4j 2.x will still function in Log4j 3.x.
* Log4j's annotation processor has been individually packaged separate from Log4j-core and the plugin system it enables.
For applications using the module path this makes it easier to provide the annotation processor since it must be
explicitly declared in those cases.
* Log4j 3.x now uses an internal dependency injection framework to allow plugins to be injected with instances of
classes they are dependent on.
* Many system properties used by Log4j can now be set to apply to a single LoggerContext making configuration
in application frameworks that support multiple applications more flexible.
* Some deprecated classes have been removed. However, every attempt has been made to ensure that user code compiled
for Log4j 2.x will continue to operate with the Log4j 3.x libraries present instead.


[#release-notes-3-0-0-alpha1-added]
=== Added

* Allow plugins to be created through more flexible dependency injection patterns. (https://issues.apache.org/jira/browse/LOG4J2-1188[LOG4J2-1188])
* Allow to force LOG4J2 to use TCCL only. (https://issues.apache.org/jira/browse/LOG4J2-2171[LOG4J2-2171])
* Allow web lookup to access more information. (https://issues.apache.org/jira/browse/LOG4J2-2523[LOG4J2-2523])
* Allow web lookup of session attributes. (https://issues.apache.org/jira/browse/LOG4J2-2688[LOG4J2-2688])
* Add support for injecting plugin configuration via builder methods. (https://issues.apache.org/jira/browse/LOG4J2-2700[LOG4J2-2700])
* Add scopes API for customizing plugin instance lifecycle. (https://issues.apache.org/jira/browse/LOG4J2-2852[LOG4J2-2852])
* Add qualifier annotations for distinguishing instances of the same type. (https://issues.apache.org/jira/browse/LOG4J2-2853[LOG4J2-2853])
* Create standardized dependency injection API. This is supported in several plugin categories and other configurable instances previously defined via system properties. (https://issues.apache.org/jira/browse/LOG4J2-2854[LOG4J2-2854])
* Add conditional annotations to support more declarative binding factory bundle classes. (https://issues.apache.org/jira/browse/LOG4J2-3300[LOG4J2-3300])
* Add built-in JSON configuration parser for a useful structured configuration file format which only requires the `java.base` module. (https://issues.apache.org/jira/browse/LOG4J2-3415[LOG4J2-3415])
* Add `@Ordered` annotation to support plugin ordering when two or more plugins within the same category have the same case-insensitive name. (https://issues.apache.org/jira/browse/LOG4J2-857[LOG4J2-857])

[#release-notes-3-0-0-alpha1-changed]
=== Changed

* Simplify Maven `site` phase and align it with the one in `2.x` branch. (https://github.com/apache/logging-log4j2/pull/1220[1220])
* Update build to use Java 11 bytecode. (https://github.com/apache/logging-log4j2/pull/480[480])
* Convert documentation into AsciiDoc format. (https://issues.apache.org/jira/browse/LOG4J2-1802[LOG4J2-1802])
* Rename package `core.util.datetime` to `core.time.internal.format` to clarify these classes are to be considered private. (https://issues.apache.org/jira/browse/LOG4J2-2224[LOG4J2-2224])
* Move time-related classes from `core.util` to `core.time`. Classes considered private moved to `core.time.internal`. (https://issues.apache.org/jira/browse/LOG4J2-2225[LOG4J2-2225])
* Split off Kafka support into a new module `log4j-kafka`. (https://issues.apache.org/jira/browse/LOG4J2-2227[LOG4J2-2227])
* Split off ZeroMq/JeroMq support into a new module `log4j-jeromq`. (https://issues.apache.org/jira/browse/LOG4J2-2228[LOG4J2-2228])
* Split off SMTP support into a new module `log4j-smtp`. (https://issues.apache.org/jira/browse/LOG4J2-2230[LOG4J2-2230])
* Split off CSV layout into a new module `log4j-csv`. (https://issues.apache.org/jira/browse/LOG4J2-2231[LOG4J2-2231])
* Split off JMS support into a new module `log4j-jms`. (https://issues.apache.org/jira/browse/LOG4J2-2232[LOG4J2-2232])
* Split off JDBC support into a new module `log4j-jdbc`. (https://issues.apache.org/jira/browse/LOG4J2-2233[LOG4J2-2233])
* Split off Jackson-based layouts into their own modules: `log4j-layout-jackson-json`, `log4j-layout-jackson-xml` and `log4j-layout-jackson-yaml`. (https://issues.apache.org/jira/browse/LOG4J2-2237[LOG4J2-2237])
* Update builder methods from the "with" prefix to the "set" prefix. (https://issues.apache.org/jira/browse/LOG4J2-2492[LOG4J2-2492])
* Remove deprecated code. (https://issues.apache.org/jira/browse/LOG4J2-2493[LOG4J2-2493])
* Fix typo in method `MergeStrategy.mergeConfigurations`. (https://issues.apache.org/jira/browse/LOG4J2-2617[LOG4J2-2617])
* Separate plugin support to its own module. Plugin annotation processor will now generate a Java source file compatible with java.util.ServiceLoader instead of a binary file. (https://issues.apache.org/jira/browse/LOG4J2-2621[LOG4J2-2621])
* Rename `PluginVisitor` and related classes to `ConfigurationInjectionBuilder`. (https://issues.apache.org/jira/browse/LOG4J2-2683[LOG4J2-2683])
* Locate plugins in modules. (https://issues.apache.org/jira/browse/LOG4J2-2690[LOG4J2-2690])
* Split off JNDI support into a new module `log4j-jndi`. (https://issues.apache.org/jira/browse/LOG4J2-3242[LOG4J2-3242])
* Split off scripting support into a new module `log4j-script`. (https://issues.apache.org/jira/browse/LOG4J2-3307[LOG4J2-3307])
* Defer loading of `StrLookup` plugin classes until first usage. (https://issues.apache.org/jira/browse/LOG4J2-3441[LOG4J2-3441])
* Flatten the `ThreadContextMap` interfaces with default methods. (https://issues.apache.org/jira/browse/LOG4J2-3626[LOG4J2-3626])
* Allow Log4j properties to be provided in JSON files. (https://issues.apache.org/jira/browse/LOG4J2-3658[LOG4J2-3658])
* Unify plugin builders and plugin factories. (https://issues.apache.org/jira/browse/LOG4J2-860[LOG4J2-860])
* Update Conversant Disruptor from 1.12.15 to 1.12.21. The new version requires Java 11. (https://issues.apache.org/jira/browse/LOG4J2-2079[LOG4J2-2079])

[#release-notes-3-0-0-alpha1-fixed]
=== Fixed

* `EnvironmentLookup` may throw NPE. (https://issues.apache.org/jira/browse/LOG4J2-2244[LOG4J2-2244])
* Move `ProcessIdUtil` from `log4j-api` to `log4j-core`. (https://issues.apache.org/jira/browse/LOG4J2-2279[LOG4J2-2279])
* `FixedDateFormat` parses timezone offsets, -8:00 is interpreted as GMT-8:00. (https://issues.apache.org/jira/browse/LOG4J2-2306[LOG4J2-2306])
* `RoutingAppender.Builder#setPurgePolicy` fluently returns the builder instance. (https://issues.apache.org/jira/browse/LOG4J2-2545[LOG4J2-2545])
* Reduce Log4j 2 initialization time by deferring loading Plugin classes. (https://issues.apache.org/jira/browse/LOG4J2-2795[LOG4J2-2795])
* Fixes incorrect constructor call in `LocalizedMessageFactory`. (https://issues.apache.org/jira/browse/LOG4J2-2850[LOG4J2-2850])
* Fix file descriptor leak on Tomcat. (https://issues.apache.org/jira/browse/LOG4J2-3663[LOG4J2-3663])

[#release-notes-3-0-0-alpha1-removed]
=== Removed

* Remove support for `java.io.Serializable` in several classes including `Message`, `Layout`, `LogEvent`, `Logger`, and `ReadOnlyStringMap`. (https://issues.apache.org/jira/browse/LOG4J2-3228[LOG4J2-3228])
