You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-user@logging.apache.org by Alain Désilets <al...@gmail.com> on 2022/07/06 11:27:00 UTC
"ERROR StatusLogger Reconfiguration failed" when running log4j-1.2-api from uber-jar
I am trying to use log4j2 through log4j-1.2-api in the context of an
uber-jar created with the maven shade plugin and am experiencing issues.
I wrote a simple HelloWorld class that illustrates the issue.
When I run this class through intelliJ, everything works fine. But when I
run it through a terminal, I get
ERROR StatusLogger Reconfiguration failed: No configuration found for
'55f96302' at 'null' in 'null'
In both cases, I invoke the command with
-Dlog4j.configuration=/path/to/my/log4j.properties
And the log4j.properties is in the old log4j style (i.e. NOT log4j2 style).
Not sure what I am doing wrong.
One thing I notice is that the class path is different in both situations.
When running through intelliJ, it contains a great number of jars,
including:
-
.m2/repository/org/apache/logging/log4j/log4j-core/2.17.2/log4j-core-2.17.2.jar
-
.m2/repository/org/apache/logging/log4j/log4j-api/2.17.2/log4j-api-2.17.2.jar
-
.m2/repository/org/apache/logging/log4j/log4j-1.2-api/2.17.2/log4j-1.2-api-2.17.2.jar
whereas when I run it from terminal, it just contains my one uber-jar. But
based on the content of my pom, I expect that the uber jar will contain
classes from those same log4j jars.
Here are the details of this HelloWorld example.
This is the HelloWorld class
package org.examples;
import org.apache.log4j.Logger;
import java.net.URL;
import java.net.URLClassLoader;
public class HelloWorld {
public static void main(String[] args) {
printClassPath();
Logger logger = Logger.getLogger("org.examples.HelloWorld");
logger.trace("Hello from Logger");
}
private static void printClassPath() {
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
System.out.println("Class path is:");
for(URL url: urls){
System.out.println(url.getFile());
}
}
}
And here is the pom:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.examples</groupId>
<artifactId>log4j2-compatibility</artifactId>
<version>1.0.0</version>
<properties>
<log4j.version>2.17.2</log4j.version>
</properties>
<build>
<plugins>
<!-- Use shade plugin to create an uber-jar with all dependencies -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>jar-with-dependencies</shadedClassifierName>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<!-- This file may contain some log4j configuration that
is not in sync with the actual version of log4j we
use. So we exclude all versions of that file that
might be inherited from a dependency-->
<exclude>**/Log4j2Plugins.dat</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</project>
And here is the log4.properties file
# Log to stdout only
log4j.rootLogger=warn, stdout
# Configure the stdout logger
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =-- %c{2}: %m%n
# Activate some traces
log4j.logger.org.examples.HelloWorld=trace
Re: "ERROR StatusLogger Reconfiguration failed" when running log4j-1.2-api from uber-jar
Posted by Ralph Goers <ra...@dslextreme.com>.
The recommended approach is to do what Spring Boot does - build
a jar that has all its dependent jars in a directory. A jar is just a zip file
so you can either unzip it before running or have the start up program
set the classpath to the directory inside the zip. Of course, that may
mean you need a custom ClassLoader but I’d be willing to bet you can
find something that already does this. Or build it as a Spring Boot app.
Ralph
> On Jul 7, 2022, at 4:06 AM, Alain Désilets <al...@gmail.com> wrote:
>
> On Thu, Jul 7, 2022 at 6:14 AM Piotr P. Karwasz <pi...@gmail.com>
> wrote:
>
>>
>>
>> The removal of the `Log4j2Plugins.dat` files is exactly the source of
>> the problem. Log4j2 uses these files to load the list of available
>> plugins (like the Log4j 1.2 configuration factories), if it does not
>> find them it falls back to scanning the
>> `org.apache.logging.log4j.core` package. The plugins from
>> `log4j-1.2-api` are not in this package. Instead of deleting these
>> files you should merge them using the Maven shade plugin proposed by
>> Ralph.
>>
>
> Thx Piotr,
>
> This is interesting. The reason why I added this filter is that I was
> getting a
>
> log4j2 ERROR StatusLogger Unrecognized conversion specifier
>
> Reading about this, I found several posts that said the solution was to
> filter the Log4j2Plugins.dat files.
>
> So I should merge the files instead?
>
> Question: Would I get the same issue if instead of creating an Uber jar, I
> created a jar with just my project's classes, and then ran it with
>
> -cp log4j2-compatibility-1.0.0.jar:/path/to/the/depencies/*.jar
---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-user-help@logging.apache.org
Re: "ERROR StatusLogger Reconfiguration failed" when running log4j-1.2-api from uber-jar
Posted by Alain Désilets <al...@gmail.com>.
On Thu, Jul 7, 2022 at 6:14 AM Piotr P. Karwasz <pi...@gmail.com>
wrote:
>
>
> The removal of the `Log4j2Plugins.dat` files is exactly the source of
> the problem. Log4j2 uses these files to load the list of available
> plugins (like the Log4j 1.2 configuration factories), if it does not
> find them it falls back to scanning the
> `org.apache.logging.log4j.core` package. The plugins from
> `log4j-1.2-api` are not in this package. Instead of deleting these
> files you should merge them using the Maven shade plugin proposed by
> Ralph.
>
Thx Piotr,
This is interesting. The reason why I added this filter is that I was
getting a
log4j2 ERROR StatusLogger Unrecognized conversion specifier
Reading about this, I found several posts that said the solution was to
filter the Log4j2Plugins.dat files.
So I should merge the files instead?
Question: Would I get the same issue if instead of creating an Uber jar, I
created a jar with just my project's classes, and then ran it with
-cp log4j2-compatibility-1.0.0.jar:/path/to/the/depencies/*.jar
Re: "ERROR StatusLogger Reconfiguration failed" when running log4j-1.2-api from uber-jar
Posted by "Piotr P. Karwasz" <pi...@gmail.com>.
Hi Alain,
On Thu, 7 Jul 2022 at 11:35, Alain Désilets <al...@gmail.com> wrote:
> If you look at my pom, you can see that there is a filter in the
> configuration of the shade plugin that remove the Log4j2Plugins.dat files.
> This seems to work because
>
> jar -tf iutools-core-1.0.2-jar-with-dependencies.jar | grep Log4j2Plugins
>
>
> produces an empty list.
>
> So I think the problem lies elsewhere.
The removal of the `Log4j2Plugins.dat` files is exactly the source of
the problem. Log4j2 uses these files to load the list of available
plugins (like the Log4j 1.2 configuration factories), if it does not
find them it falls back to scanning the
`org.apache.logging.log4j.core` package. The plugins from
`log4j-1.2-api` are not in this package. Instead of deleting these
files you should merge them using the Maven shade plugin proposed by
Ralph.
As an alternative you can replace the `maven-shade-plugin` with the
`spring-boot-maven-plugin` that creates single JAR file applications
without squashing all jars into one:
https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/#goals-repackage
Piotr
---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-user-help@logging.apache.org
Re: "ERROR StatusLogger Reconfiguration failed" when running log4j-1.2-api from uber-jar
Posted by Alain Désilets <al...@gmail.com>.
Le jeu. 7 juill. 2022, 2 h 54 a.m., Ralph Goers <ra...@dslextreme.com>
a écrit :
> When you run as an uber jar you are most likely breaking things.
>
> Log4j uses a file named Log4j2Plugins.dat to define its plugins. Every jar
> that has Log4j plugins will have one. When you create an uber jar most
> likely only one is left and it probably doesn’t contain the core Log4j
> stuff.
>
> To solve this you need to use
> https://github.com/edwgiz/maven-shaded-log4j-transformer.
>
> Ralph
>
Thx for the reply Ralph.
If you look at my pom, you can see that there is a filter in the
configuration of the shade plugin that remove the Log4j2Plugins.dat files.
This seems to work because
jar -tf iutools-core-1.0.2-jar-with-dependencies.jar | grep Log4j2Plugins
produces an empty list.
So I think the problem lies elsewhere.
Alain
Re: "ERROR StatusLogger Reconfiguration failed" when running log4j-1.2-api from uber-jar
Posted by Ralph Goers <ra...@dslextreme.com>.
When you run as an uber jar you are most likely breaking things.
Log4j uses a file named Log4j2Plugins.dat to define its plugins. Every jar that has Log4j plugins will have one. When you create an uber jar most likely only one is left and it probably doesn’t contain the core Log4j stuff.
To solve this you need to use https://github.com/edwgiz/maven-shaded-log4j-transformer.
Ralph
> On Jul 6, 2022, at 5:07 AM, Alain Désilets <al...@gmail.com> wrote:
>
> Here is another interesting thing.
>
> If I remove the log4j-1.2-api dependency from the pom, then the when I try
> to build the project from Terminal, I get the following failure:
>
> [*ERROR*] */Users/desilets/Documents/GitRepositories/SpikeLog4j2Compatibility/src/main/java/org/examples/HelloWorld.java:[3,24]
> package org.apache.log4j does not exist*
>
>
> Which is what I would expect.
>
> But the project builds and runs without problem in intelliJ. This is true
> even if I do "Invalidate caches and Restart".
>
> Very strange.
>
> On Wed, Jul 6, 2022 at 7:27 AM Alain Désilets <al...@gmail.com>
> wrote:
>
>> I am trying to use log4j2 through log4j-1.2-api in the context of an
>> uber-jar created with the maven shade plugin and am experiencing issues.
>>
>> I wrote a simple HelloWorld class that illustrates the issue.
>>
>> When I run this class through intelliJ, everything works fine. But when I
>> run it through a terminal, I get
>>
>> ERROR StatusLogger Reconfiguration failed: No configuration found for
>> '55f96302' at 'null' in 'null'
>>
>>
>> In both cases, I invoke the command with
>>
>> -Dlog4j.configuration=/path/to/my/log4j.properties
>>
>>
>> And the log4j.properties is in the old log4j style (i.e. NOT log4j2 style).
>>
>> Not sure what I am doing wrong.
>>
>> One thing I notice is that the class path is different in both situations.
>> When running through intelliJ, it contains a great number of jars,
>> including:
>>
>>
>> -
>> .m2/repository/org/apache/logging/log4j/log4j-core/2.17.2/log4j-core-2.17.2.jar
>> -
>> .m2/repository/org/apache/logging/log4j/log4j-api/2.17.2/log4j-api-2.17.2.jar
>> -
>> .m2/repository/org/apache/logging/log4j/log4j-1.2-api/2.17.2/log4j-1.2-api-2.17.2.jar
>>
>> whereas when I run it from terminal, it just contains my one uber-jar. But
>> based on the content of my pom, I expect that the uber jar will contain
>> classes from those same log4j jars.
>>
>> Here are the details of this HelloWorld example.
>>
>>
>> This is the HelloWorld class
>>
>> package org.examples;
>>
>> import org.apache.log4j.Logger;
>>
>> import java.net.URL;
>> import java.net.URLClassLoader;
>>
>> public class HelloWorld {
>>
>> public static void main(String[] args) {
>> printClassPath();
>> Logger logger = Logger.getLogger("org.examples.HelloWorld");
>> logger.trace("Hello from Logger");
>> }
>>
>> private static void printClassPath() {
>> ClassLoader cl = ClassLoader.getSystemClassLoader();
>> URL[] urls = ((URLClassLoader)cl).getURLs();
>>
>> System.out.println("Class path is:");
>> for(URL url: urls){
>> System.out.println(url.getFile());
>> }
>> }
>> }
>>
>>
>> And here is the pom:
>>
>> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
>>
>> <modelVersion>4.0.0</modelVersion>
>> <groupId>org.examples</groupId>
>> <artifactId>log4j2-compatibility</artifactId>
>> <version>1.0.0</version>
>>
>> <properties>
>> <log4j.version>2.17.2</log4j.version>
>> </properties>
>>
>> <build>
>> <plugins>
>> <!-- Use shade plugin to create an uber-jar with all dependencies -->
>> <plugin>
>> <groupId>org.apache.maven.plugins</groupId>
>> <artifactId>maven-shade-plugin</artifactId>
>> <version>3.1.0</version>
>> <configuration>
>> <shadedArtifactAttached>true</shadedArtifactAttached>
>> <shadedClassifierName>jar-with-dependencies</shadedClassifierName>
>> <filters>
>> <filter>
>> <artifact>*:*</artifact>
>> <excludes>
>> <!-- This file may contain some log4j configuration that
>> is not in sync with the actual version of log4j we
>> use. So we exclude all versions of that file that
>> might be inherited from a dependency-->
>> <exclude>**/Log4j2Plugins.dat</exclude>
>> </excludes>
>> </filter>
>> </filters>
>> </configuration>
>> <executions>
>> <execution>
>> <phase>package</phase>
>> <goals>
>> <goal>shade</goal>
>> </goals>
>> </execution>
>> </executions>
>> </plugin>
>> </plugins>
>> </build>
>>
>> <dependencies>
>>
>> <dependency>
>> <groupId>org.apache.logging.log4j</groupId>
>> <artifactId>log4j-core</artifactId>
>> <version>${log4j.version}</version>
>> </dependency>
>>
>> <dependency>
>> <groupId>org.apache.logging.log4j</groupId>
>> <artifactId>log4j-1.2-api</artifactId>
>> <version>${log4j.version}</version>
>> </dependency>
>>
>> </dependencies>
>> </project>
>>
>>
>> And here is the log4.properties file
>>
>> # Log to stdout only
>> log4j.rootLogger=warn, stdout
>>
>> # Configure the stdout logger
>> log4j.appender.stdout=org.apache.log4j.ConsoleAppender
>> log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
>> log4j.appender.stdout.layout.ConversionPattern =-- %c{2}: %m%n
>>
>> # Activate some traces
>> log4j.logger.org.examples.HelloWorld=trace
>>
>>
---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-user-help@logging.apache.org
Re: "ERROR StatusLogger Reconfiguration failed" when running log4j-1.2-api from uber-jar
Posted by Alain Désilets <al...@gmail.com>.
Here is another interesting thing.
If I remove the log4j-1.2-api dependency from the pom, then the when I try
to build the project from Terminal, I get the following failure:
[*ERROR*] */Users/desilets/Documents/GitRepositories/SpikeLog4j2Compatibility/src/main/java/org/examples/HelloWorld.java:[3,24]
package org.apache.log4j does not exist*
Which is what I would expect.
But the project builds and runs without problem in intelliJ. This is true
even if I do "Invalidate caches and Restart".
Very strange.
On Wed, Jul 6, 2022 at 7:27 AM Alain Désilets <al...@gmail.com>
wrote:
> I am trying to use log4j2 through log4j-1.2-api in the context of an
> uber-jar created with the maven shade plugin and am experiencing issues.
>
> I wrote a simple HelloWorld class that illustrates the issue.
>
> When I run this class through intelliJ, everything works fine. But when I
> run it through a terminal, I get
>
> ERROR StatusLogger Reconfiguration failed: No configuration found for
> '55f96302' at 'null' in 'null'
>
>
> In both cases, I invoke the command with
>
> -Dlog4j.configuration=/path/to/my/log4j.properties
>
>
> And the log4j.properties is in the old log4j style (i.e. NOT log4j2 style).
>
> Not sure what I am doing wrong.
>
> One thing I notice is that the class path is different in both situations.
> When running through intelliJ, it contains a great number of jars,
> including:
>
>
> -
> .m2/repository/org/apache/logging/log4j/log4j-core/2.17.2/log4j-core-2.17.2.jar
> -
> .m2/repository/org/apache/logging/log4j/log4j-api/2.17.2/log4j-api-2.17.2.jar
> -
> .m2/repository/org/apache/logging/log4j/log4j-1.2-api/2.17.2/log4j-1.2-api-2.17.2.jar
>
> whereas when I run it from terminal, it just contains my one uber-jar. But
> based on the content of my pom, I expect that the uber jar will contain
> classes from those same log4j jars.
>
> Here are the details of this HelloWorld example.
>
>
> This is the HelloWorld class
>
> package org.examples;
>
> import org.apache.log4j.Logger;
>
> import java.net.URL;
> import java.net.URLClassLoader;
>
> public class HelloWorld {
>
> public static void main(String[] args) {
> printClassPath();
> Logger logger = Logger.getLogger("org.examples.HelloWorld");
> logger.trace("Hello from Logger");
> }
>
> private static void printClassPath() {
> ClassLoader cl = ClassLoader.getSystemClassLoader();
> URL[] urls = ((URLClassLoader)cl).getURLs();
>
> System.out.println("Class path is:");
> for(URL url: urls){
> System.out.println(url.getFile());
> }
> }
> }
>
>
> And here is the pom:
>
> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
>
> <modelVersion>4.0.0</modelVersion>
> <groupId>org.examples</groupId>
> <artifactId>log4j2-compatibility</artifactId>
> <version>1.0.0</version>
>
> <properties>
> <log4j.version>2.17.2</log4j.version>
> </properties>
>
> <build>
> <plugins>
> <!-- Use shade plugin to create an uber-jar with all dependencies -->
> <plugin>
> <groupId>org.apache.maven.plugins</groupId>
> <artifactId>maven-shade-plugin</artifactId>
> <version>3.1.0</version>
> <configuration>
> <shadedArtifactAttached>true</shadedArtifactAttached>
> <shadedClassifierName>jar-with-dependencies</shadedClassifierName>
> <filters>
> <filter>
> <artifact>*:*</artifact>
> <excludes>
> <!-- This file may contain some log4j configuration that
> is not in sync with the actual version of log4j we
> use. So we exclude all versions of that file that
> might be inherited from a dependency-->
> <exclude>**/Log4j2Plugins.dat</exclude>
> </excludes>
> </filter>
> </filters>
> </configuration>
> <executions>
> <execution>
> <phase>package</phase>
> <goals>
> <goal>shade</goal>
> </goals>
> </execution>
> </executions>
> </plugin>
> </plugins>
> </build>
>
> <dependencies>
>
> <dependency>
> <groupId>org.apache.logging.log4j</groupId>
> <artifactId>log4j-core</artifactId>
> <version>${log4j.version}</version>
> </dependency>
>
> <dependency>
> <groupId>org.apache.logging.log4j</groupId>
> <artifactId>log4j-1.2-api</artifactId>
> <version>${log4j.version}</version>
> </dependency>
>
> </dependencies>
> </project>
>
>
> And here is the log4.properties file
>
> # Log to stdout only
> log4j.rootLogger=warn, stdout
>
> # Configure the stdout logger
> log4j.appender.stdout=org.apache.log4j.ConsoleAppender
> log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
> log4j.appender.stdout.layout.ConversionPattern =-- %c{2}: %m%n
>
> # Activate some traces
> log4j.logger.org.examples.HelloWorld=trace
>
>