Is log4j2 compatible with Java 11?
If someone is using Maven and is having the same issue while assembling a flat jar, here is what I did to fix the same issue:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>foo.bar.Generate</mainClass> <manifestEntries> <Multi-Release>true</Multi-Release> </manifestEntries> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions></plugin>
The important part is <Multi-Release>true</Multi-Release>
.
Note that the Java code I'm using now to change loggers level is:
Configurator.setAllLevels("foo.bar", Level.DEBUG);
Log4J2 is of course compatible it uses the JDK Multi-Release feature or in more detail.
BUT...
1) First, when you are using - like me - the slf4j interface, you need to use a different Maven artefact, see http://logging.apache.org/log4j/2.x/log4j-slf4j-impl/index.html
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j18-impl</artifactId><version>2.12.1</version></dependency>
which adds all dependencies as 'mvn dependency:tree' reveals:
\- org.apache.logging.log4j:log4j-slf4j18-impl:jar:2.12.1:compile[INFO] +- org.slf4j:slf4j-api:jar:1.8.0-alpha2:compile[INFO] +- org.apache.logging.log4j:log4j-api:jar:2.12.1:compile[INFO] \- org.apache.logging.log4j:log4j-core:jar:2.12.1:runtime
2) And second, when you are creating - like me - one single JAR, which includes all dependencies, you need to add the Multi-Release manifest entry as well, see https://issues.apache.org/jira/browse/LOG4J2-2537or in my project's pom.xml and search for
<Multi-Release>true</Multi-Release>
If you are getting this message then your application is not setup to use multi-release jars. Log4j supports Java 9+ by using Stackwalker in a version of StackLocator that is located in META-INF/versions/9. Depending on how your application works, you may need to have Multi-Release set to true in the jar manifest. This is true for Spring Boot jars. Without multi-release support you will use the pre-Java 9 version of StackLocator which tries to use Reflection.getCallerClass(). That class was removed in Java 9. Log4j will fall back to a slower way to calculate stack locations but it will still work. Hence the warning.