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

Reply via email to