Java >> Java tutorial >  >> Tag >> Log4j

Er log4j2 kompatibel med Java 11?

Hvis nogen bruger Maven og har det samme problem, mens de samler en flad krukke, er her, hvad jeg gjorde for at løse det samme problem:

<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>

Den vigtige del er <Multi-Release>true</Multi-Release> .

Bemærk, at den Java-kode, jeg bruger nu til at ændre loggerniveau, er:

Configurator.setAllLevels("foo.bar", Level.DEBUG);

Hvis du får denne meddelelse, er din applikation ikke sat op til at bruge multi-release krukker. Log4j understøtter Java 9+ ved at bruge Stackwalker i en version af StackLocator, der er placeret i META-INF/versioner/9. Afhængigt af hvordan din applikation fungerer, skal du muligvis have Multi-Release indstillet til sand i jar-manifestet. Dette gælder for Spring Boot krukker. Uden multi-release support vil du bruge pre-Java 9 versionen af ​​StackLocator, som forsøger at bruge Reflection.getCallerClass(). Den klasse blev fjernet i Java 9. Log4j vil falde tilbage til en langsommere måde at beregne stakplaceringer på, men det vil stadig fungere. Derfor advarslen.


Log4J2 er selvfølgelig kompatibel, den bruger JDK Multi-Release-funktionen eller mere detaljeret.

MEN...

1) For det første, når du - ligesom jeg - bruger slf4j-grænsefladen, skal du bruge en anden Maven-artefakt, se 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>

som tilføjer alle afhængigheder som 'mvn dependency:tree' afslører:

\- 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) Og for det andet, når du - ligesom jeg - opretter en enkelt JAR, som inkluderer alle afhængigheder, skal du også tilføje Multi-Release-manifestindgangen, se https://issues.apache.org/jira/browse/ LOG4J2-2537eller i mit projekts pom.xml og søg efter

<Multi-Release>true</Multi-Release>

No
Java tag