From e0100ea3f189e0ff56b5780d07e1dac159f57245 Mon Sep 17 00:00:00 2001 From: Matt Sicker Date: Sat, 31 Dec 2016 02:00:50 -0600 Subject: [PATCH 1/2] Update logging documentation to include Log4j 2 This also updates the version numbers provided in the sample pom.xml snippets for configuring logging for SLF4J and Log4j 1.x. A sample log4j2.xml file is also given with the same configuration as demonstrated in the log4j.properties example. The link to the Log4j 1.x site has been fixed to point to the 1.2 URL (do note that Log4j 1.2 is end of life and is not compatible with JDK 9+). See gh-1279 --- src/asciidoc/overview.adoc | 84 +++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 11 deletions(-) diff --git a/src/asciidoc/overview.adoc b/src/asciidoc/overview.adoc index 9edca1040de..96962372dd0 100644 --- a/src/asciidoc/overview.adoc +++ b/src/asciidoc/overview.adoc @@ -736,22 +736,22 @@ implementation itself. In Maven you would do that like this org.slf4j jcl-over-slf4j - 1.5.8 + 1.7.22 org.slf4j slf4j-api - 1.5.8 + 1.7.22 org.slf4j slf4j-log4j12 - 1.5.8 + 1.7.22 log4j log4j - 1.2.14 + 1.2.17 ---- @@ -770,18 +770,80 @@ also need to exclude the slf4j-api dependency from other external dependencies ( Spring), because you only want one version of that API on the classpath. -[[overview-logging-log4j]] -===== Using Log4J +[[overview-logging-log4j2]] +===== Using Log4j 2.x Many people use http://logging.apache.org/log4j[Log4j] as a logging framework for configuration and management purposes. It's efficient and well-established, and in fact it's what we use at runtime when we build and test Spring. Spring also provides some utilities for configuring and initializing Log4j, so it has an optional compile-time dependency on Log4j in some modules. -To make Log4j work with the default JCL dependency ( `commons-logging`) all you need to -do is put Log4j on the classpath, and provide it with a configuration file ( -`log4j.properties` or `log4j.xml` in the root of the classpath). So for Maven users this -is your dependency declaration: +To use Log4j 2 with JCL, all you need to do is put Log4j 2 on the classpath and provide +it with a configuration file (`log4j2.xml`, `log4j2.properties`, or other +http://logging.apache.org/log4j/2.x/manual/configuration.html[supported configuration +formats]). For Maven users, the minimal dependencies needed are: + + +[source,xml,indent=0] +[subs="verbatim,quotes,attributes"] +---- + + + org.apache.logging.log4j + log4j-core + 2.7 + + + org.apache.logging.log4j + log4j-jcl + 2.7 + + +---- + +If you also wish to use SLF4J, the following dependencies are also needed: + +[source,xml,indent=0] +[subs="verbatim,quotes,attributes"] +---- + + + org.apache.logging.log4j + log4j-slf4j-impl + 2.7 + + +---- + +Here is an example log4j2.xml for logging to the console: + +[source,xml,indent=0] +[subs="verbatim,quotes,attributes"] +---- + + + + + + + + + + + + + + +---- + + +[[overview-logging-log4j]] +===== Using Log4J 1.x +To make http://logging.apache.org/log4j/1.2/[Log4j 1.x] work with the default JCL +dependency (`commons-logging`) all you need to do is put Log4j on the classpath, and +provide it with a configuration file (`log4j.properties` or `log4j.xml` in the root of +the classpath). So for Maven users this is your dependency declaration: + [source,xml,indent=0] [subs="verbatim,quotes,attributes"] @@ -795,7 +857,7 @@ is your dependency declaration: log4j log4j - 1.2.14 + 1.2.17 ---- From 3e155736287cc8fffaeb7590a2a0e9e484b5d10c Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 20 Jan 2017 17:12:34 +0100 Subject: [PATCH 2/2] Polish contribution Since Log4J 1.x is EOL there is no need to have a dedicated section for it. Closes gh-1279 Issue: SPR-15170 --- src/asciidoc/overview.adoc | 145 ++++++++++++++----------------------- 1 file changed, 54 insertions(+), 91 deletions(-) diff --git a/src/asciidoc/overview.adoc b/src/asciidoc/overview.adoc index 96962372dd0..4ec4548139c 100644 --- a/src/asciidoc/overview.adoc +++ b/src/asciidoc/overview.adoc @@ -714,9 +714,9 @@ into logging calls to the SLF4J API, so if other libraries in your application u API, then you have a single place to configure and manage logging. A common choice might be to bridge Spring to SLF4J, and then provide explicit binding -from SLF4J to Log4J. You need to supply 4 dependencies (and exclude the existing -`commons-logging`): the bridge, the SLF4J API, the binding to Log4J, and the Log4J -implementation itself. In Maven you would do that like this +from SLF4J to Log4j. You need to supply several dependencies (and exclude the existing +`commons-logging`): the bridge, the SLF4J implementation for Log4j, and the Log4j +implementation itself. In Maven you would do that like this: [source,xml,indent=0] [subs="verbatim,quotes,attributes"] @@ -739,19 +739,19 @@ implementation itself. In Maven you would do that like this 1.7.22 - org.slf4j - slf4j-api - 1.7.22 + org.apache.logging.log4j + log4j-slf4j-impl + 2.7 - org.slf4j - slf4j-log4j12 - 1.7.22 + org.apache.logging.log4j + log4j-api + 2.7 - log4j - log4j - 1.2.17 + org.apache.logging.log4j + log4j-core + 2.7 ---- @@ -770,15 +770,18 @@ also need to exclude the slf4j-api dependency from other external dependencies ( Spring), because you only want one version of that API on the classpath. -[[overview-logging-log4j2]] -===== Using Log4j 2.x +[[overview-logging-log4j]] +===== Using Log4j + +NOTE: Log4j 1.x is EOL and the following applies to Log4j 2 + Many people use http://logging.apache.org/log4j[Log4j] as a logging framework for configuration and management purposes. It's efficient and well-established, and in fact it's what we use at runtime when we build and test Spring. Spring also provides some utilities for configuring and initializing Log4j, so it has an optional compile-time dependency on Log4j in some modules. -To use Log4j 2 with JCL, all you need to do is put Log4j 2 on the classpath and provide +To use Log4j with JCL, all you need to do is put Log4j on the classpath and provide it with a configuration file (`log4j2.xml`, `log4j2.properties`, or other http://logging.apache.org/log4j/2.x/manual/configuration.html[supported configuration formats]). For Maven users, the minimal dependencies needed are: @@ -787,93 +790,53 @@ formats]). For Maven users, the minimal dependencies needed are: [source,xml,indent=0] [subs="verbatim,quotes,attributes"] ---- - - - org.apache.logging.log4j - log4j-core - 2.7 - - - org.apache.logging.log4j - log4j-jcl - 2.7 - - + + + org.apache.logging.log4j + log4j-core + 2.7 + + + org.apache.logging.log4j + log4j-jcl + 2.7 + + ---- If you also wish to use SLF4J, the following dependencies are also needed: -[source,xml,indent=0] -[subs="verbatim,quotes,attributes"] ----- - - - org.apache.logging.log4j - log4j-slf4j-impl - 2.7 - - ----- - -Here is an example log4j2.xml for logging to the console: - -[source,xml,indent=0] -[subs="verbatim,quotes,attributes"] ----- - - - - - - - - - - - - - - ----- - - -[[overview-logging-log4j]] -===== Using Log4J 1.x -To make http://logging.apache.org/log4j/1.2/[Log4j 1.x] work with the default JCL -dependency (`commons-logging`) all you need to do is put Log4j on the classpath, and -provide it with a configuration file (`log4j.properties` or `log4j.xml` in the root of -the classpath). So for Maven users this is your dependency declaration: - - [source,xml,indent=0] [subs="verbatim,quotes,attributes"] ---- - - org.springframework - spring-core - {spring-version} - - - log4j - log4j - 1.2.17 - + + org.apache.logging.log4j + log4j-slf4j-impl + 2.7 + ---- -And here's a sample log4j.properties for logging to the console: +Here is an example `log4j2.xml` for logging to the console: -[literal] -[subs="verbatim,quotes"] +[source,xml,indent=0] +[subs="verbatim,quotes,attributes"] ---- -log4j.rootCategory=INFO, stdout - -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n - -log4j.category.org.springframework.beans.factory=DEBUG + + + + + + + + + + + + + + ---- [[overview-native-jcl]] @@ -885,11 +848,11 @@ excluding `commons-logging` from your application is not enough in most situatio To be clear about this: the problems reported are usually not with JCL per se, or even with `commons-logging`: rather they are to do with binding `commons-logging` to another -framework (often Log4J). This can fail because `commons-logging` changed the way they do +framework (often Log4j). This can fail because `commons-logging` changed the way they do the runtime discovery in between the older versions (1.0) found in some containers and the modern versions that most people use now (1.1). Spring does not use any unusual parts of the JCL API, so nothing breaks there, but as soon as Spring or your application -tries to do any logging you can find that the bindings to Log4J are not working. +tries to do any logging you can find that the bindings to Log4j are not working. In such cases with WAS the easiest thing to do is to invert the class loader hierarchy (IBM calls it "parent last") so that the application controls the JCL dependency, not