              Apache Commons Logging
                  Version 1.3.0
                  RELEASE NOTES

The Apache Commons Logging team is pleased to announce the release of Apache Commons Logging 1.3.0.

Apache Commons Logging is a thin adapter allowing configurable bridging to other,
well-known logging systems.

This is a feature and maintenance release. Java 8 or later is required.

Changes in this version include:

New features:
o               Add support for Log4j API and SLF4J #177. Thanks to Piotr P. Karwasz.
o               Deprecate org.apache.commons.logging.impl.WeakHashtable without replacement. Thanks to Piotr P. Karwasz.
o LOGGING-188:  Deprecate and disable `Jdk13LumberjackLogger` and `Log4JLogger`. Thanks to Piotr P. Karwasz.
o LOGGING-173:  Deprecate and disable `AvalonLogger` and `LogKitLogger`. Thanks to SingingBush.
o LOGGING-165:  Add Automatic-Module-Name Manifest Header for Java 9 compatibility.

Fixed Bugs:
o LOGGING-163:  BufferedReader is not closed properly. Thanks to Kaloyan Spiridonov.
o LOGGING-177:  Remove redundant initializer #46 Thanks to Arturo Bernal.
o               Use a weak reference for the cached class loader #71. Thanks to Jakob van Kruijssen, Bruno P. Kinoshita, Gary Gregory.
o               Add more entries to .gitignore file #25. Thanks to xiaozhiliaoo.
o               Minor Improvements #34. Thanks to Arturo Bernal.
o               [StepSecurity] ci: Harden GitHub Actions #145. Thanks to step-security-bot, Gary Gregory.
o LOGGING-185:  Replace custom code with `ServiceLoader` call. Thanks to Piotr P. Karwasz.
o               Fix possible NPEs in LogFactoryImpl. Thanks to Gary Gregory.
o LOGGING-185:  Fix failing tests #180. Thanks to Piotr P. Karwasz.
o               Deprecate LogConfigurationException.cause in favor of getCause(). Thanks to Gary Gregory.
o               Fix SpotBugs [ERROR] High: Found reliance on default encoding in org.apache.commons.logging.LogFactory.initDiagnostics(): new java.io.PrintStream(OutputStream) [org.apache.commons.logging.LogFactory] At LogFactory.java:[line 1205] DM_DEFAULT_ENCODING. Thanks to Gary Gregory.
o               Fix SpotBugs [ERROR] Medium: Class org.apache.commons.logging.impl.WeakHashtable defines non-transient non-serializable instance field queue [org.apache.commons.logging.impl.WeakHashtable] In WeakHashtable.java SE_BAD_FIELD. Thanks to Gary Gregory.
o               Set java.logging as optional module #183. Thanks to Piotr P. Karwasz.
o               Fix SpotBugs [ERROR] Medium: Switch statement found in org.apache.commons.logging.impl.SimpleLog.log(int, Object, Throwable) where default case is missing [org.apache.commons.logging.impl.SimpleLog] At SimpleLog.java:[lines 505-522] SF_SWITCH_NO_DEFAULT. Thanks to Gary Gregory.
o               Deprecate org.apache.commons.logging.impl.Jdk13LumberjackLogger.dummyLevel without replacement. Thanks to Gary Gregory.

Changes:
o               Bump Java from 6 to 8. Thanks to Gary Gregory.
o               Bump actions/cache from 2 to 3.0.10 #50, #77, #95, #98, #107, #110. Thanks to Dependabot, Gary Gregory.
o               Bump actions/checkout from 2.3.1 to 3.1.0, #24, #63, #75, #109. Thanks to Dependabot, Gary Gregory.
o               Bump actions/setup-java from 1.4.0 to 3.5.1 #21. Thanks to Dependabot, Gary Gregory.
o               Bump junit from 3.8.1 to 5.9.1 Vintage #23, #38. Thanks to Dependabot, Gary Gregory.
o               Bump clirr-maven-plugin from 2.2.2 to 2.8 #14. Thanks to Dependabot.
o               Bump findbugs-maven-plugin from 2.5.2 to 3.0.5 #8. Thanks to Dependabot.
o               Bump maven-failsafe-plugin from 2.12 to 3.0.0-M7 #31, #91. Thanks to Dependabot, Gary Gregory.
o               Bump spotbugs-surefire-plugin from 2.22.2 to 3.0.0-M5. Thanks to Gary Gregory.
o               Bump maven-dependency-plugin from 2.4 to 3.5.0 #29, #79, #117, #131. Thanks to Dependabot.
o               Bump maven-pmd-plugin from 3.3 to 3.19.0 #28, #90, #100, #103. Thanks to Dependabot.
o               Bump maven-assembly-plugin from 2.5 to 3.4.2 #30, #94, #96. Thanks to Dependabot.
o               Bump servlet-api from 2.3 to 2.5 #27. Thanks to Dependabot.
o               Bump maven-checkstyle-plugin from 2.7 to 3.2.1 #35, #101, #130. Thanks to Gary Gregory, Dependabot.
o               Bump spotbugs-maven-plugin from 4.1.4 to 4.7.2.1 #33, #70, #78, #93, #97, #102, #112. Thanks to Dependabot.
o               Bump spotbugs from 4.5.3 to 4.7.3 #81, #87, #92, #104, #115. Thanks to Dependabot.
o               Bump commons-parent from 52 to 65 #82, #106, #122, #126, #143. Thanks to Dependabot, Gary Gregory.
o               Bump github/codeql-action from 1 to 2 #86. Thanks to Dependabot.


Historical list of changes: https://commons.apache.org/proper/commons-logging/changes-report.html

Download it from https://commons.apache.org/proper/commons-logging/download_logging.cgi

For complete information on Apache Commons Logging, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons Logging website:

https://commons.apache.org/proper/commons-logging/

=============================================================================

Apache Commons Logging
Version 1.2
RELEASE NOTES

The Apache Commons Logging team is pleased to announce
the release of Apache Commons Logging 1.2

Apache Commons Logging is a thin adapter allowing configurable
bridging to other, well-known logging systems.

This is a maintenance release containing bug fixes.
Java 1.2 or later is required.

Changes in this version include:

Fixed Bugs:
o LOGGING-37:   Improve performance of LogFactory#getFactory() by calling
                Thread#currentThread()#getContextClassLoader() directly instead
                of using reflection. As a consequence support for JDK 1.1 has
                been dropped. Thanks to Matthias Ernst, Archie Cobbs.
o LOGGING-156:  Fix SecurityAllowedTestCase when executed with OpenJDK 1.7 due
                to an additional required RuntimePermission. Thanks to Mikolaj Izdebski.
o LOGGING-157:  Fix javadoc to comply with javadoc tool from jdk 1.8. Thanks to Ville Skyttä.


Historical list of changes: http://commons.apache.org/proper/commons-logging/changes-report.html

For complete information on Apache Commons Logging, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons Logging website:

http://commons.apache.org/proper/commons-logging/
