Log4j2 报错 ERROR StatusLogger Especificador de formato no reconocido

Tabla de contenido

problema

Solución

Análisis de causa


problema

Cuando se usa maven-shade-plugin o maven-assembly-plugin para marcar el proyecto en un paquete JAR ejecutable, si introduce log4j2, ocurrirán los siguientes problemas

ERROR StatusLogger Unrecognized format specifier [d]
ERROR StatusLogger Unrecognized conversion specifier [d] starting at position 16 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [thread]
ERROR StatusLogger Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [level]
ERROR StatusLogger Unrecognized conversion specifier [level] starting at position 35 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [logger]
ERROR StatusLogger Unrecognized conversion specifier [logger] starting at position 47 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [msg]
ERROR StatusLogger Unrecognized conversion specifier [msg] starting at position 54 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [n]
ERROR StatusLogger Unrecognized conversion specifier [n] starting at position 56 in conversion pattern.

Solución

Agregue la siguiente configuración a pom.

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-shade-plugin</artifactId>
   <version>2.4.3</version>
   <executions>
       <execution>
           <phase>package</phase>
           <goals>
               <goal>shade</goal>
           </goals>
           <configuration>
               <filters>
                   <filter>
                       <artifact>*:*</artifact>
                       <excludes>
                           <exclude>META-INF/*.SF</exclude>
                           <exclude>META-INF/*.DSA</exclude>
                           <exclude>META-INF/*.RSA</exclude>
                       </excludes>
                   </filter>
               </filters>
               <finalName>${artifactId}-${env}-${version}</finalName>
               <transformers>
                   <transformer
                           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                       <mainClass>xxx.yyyy.zzz.Main</mainClass>
                   </transformer>
                   <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                       <resource>META-INF/spring.handlers</resource>
                   </transformer>
                   <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                       <resource>META-INF/spring.schemas</resource>
                   </transformer>
                   <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                       <resource>META-INF/spring.tooling</resource>
                   </transformer>
                   <transformer
                           implementation="org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer"/>
                   <transformer
                           implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                   <transformer implementation="com.github.edwgiz.mavenShadePlugin.log4j2CacheTransformer.PluginsCacheFileTransformer" />
               </transformers>
           </configuration>
       </execution>
   </executions>
   <dependencies>
       <dependency>
           <groupId>com.github.edwgiz</groupId>
           <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
           <version>2.6.1</version>
       </dependency>
   </dependencies>
</plugin>

Análisis de causa

log4j2 es programación de complementos. Cuando se compila el paquete log4j2 o se compila el paquete que contiene el complemento log4j2, la información del complemento que debe cargarse se colocará en META-INF / org / apache / logging / log4j / core / config / plugins / Log4j2Plugins.dat (incluido el complemento nativo oficial logj42), y luego, cuando se inicie el proyecto, log4j2 escaneará el archivo de información del complemento en el directorio META-INF de cada paquete jar, y luego cargue el complemento.

Pero cuando el proyecto está marcado como un paquete jar, si hay archivos Log4j2Plugins.dat en dos paquetes jar diferentes, habrá un problema, uno de los archivos será sobrescrito por el otro, lo que dará como resultado un archivo cuando el proyecto se inicie. El complemento no se puede cargar normalmente, lo que genera un error.

Para resolver este problema, cuando todos los paquetes jar están etiquetados como un paquete jar, el Log4j2Plugins.dat en cada paquete jar debe fusionarse. Esto es lo que hace el paquete maven-shade-plugin.log4j2-cachefile-transformer.

Supongo que te gusta

Origin blog.csdn.net/hanhan122655904/article/details/114640528
Recomendado
Clasificación