【问题标题】:log4j2 ERROR StatusLogger Unrecognized conversion specifierlog4j2 ERROR StatusLogger 无法识别的转换说明符
【发布时间】:2018-06-10 13:19:07
【问题描述】:

当我在 intellij Idea 中运行 main 方法时,我的项目中有 log4j2,打印日志是正确的。

当我使用 maven-shade-plugin 打包项目到 jar 文件,并将 jar 作为独立应用程序运行时,它显示错误:

java -cp package.jar com.xxx.TestMain

控制台输出

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

pom.xml 配置。 log4j2.version = 2.10.0,spring boot 版本为1.5.9.RELEASE

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${log4j2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${log4j2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${log4j2.version}</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <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>
                        </transformers>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    <sourceDirectory>src/main/java</sourceDirectory>
</build>

log4j2.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" monitorInterval="30" shutdownHook="disable">
    <properties>
        <property name="LOG_HOME">/data1/logs</property>
        <property name="JOB_NAME">noname</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss} [%t] %level [%logger{36}][%file:%line] %msg%n%throwable"/>
        </Console>

        <RollingRandomAccessFile name="DetailFile"
                                 fileName="${sys:LOG_HOME}/${sys:JOB_NAME}/detail.log" bufferedIO="false"
                                 filePattern="${sys:LOG_HOME}/${sys:JOB_NAME}/detail.%d{yyyy-MM-dd}-%i.log">

            <PatternLayout
                    pattern="%date{yyyy-MM-dd HH:mm:ss} [%t] %level [%file:%line] %msg%n%throwable"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="500 MB"/>
            </Policies>
        </RollingRandomAccessFile>
        <RollingRandomAccessFile name="error"
                                 fileName="${sys:LOG_HOME}/${sys:JOB_NAME}/error.log" bufferedIO="true"
                                 filePattern="${sys:LOG_HOME}/${sys:JOB_NAME}/error.%d{yyyy-MM-dd}.log">

            <PatternLayout
                    pattern="%date{yyyy-MM-dd HH:mm:ss} [%t] %level [%logger{36}:%line] %msg%n%throwable"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="DetailFile"/>
            <AppenderRef level="error" ref="error"/>
        </Root>
    </Loggers>
</Configuration>

【问题讨论】:

  • 您想在这里提问。我看到一个错误,但毫无疑问。
  • 我想知道如何解决这个错误
  • 在 Java 11 中,由于语言环境,我们遇到了类似的问题 - 请参阅 issues.apache.org/jira/browse/LOG4J2-2435

标签: java log4j2 maven-shade-plugin


【解决方案1】:

如果依赖项包含 log4j2 插件,则 jar 中会包含一个 Log4j2Plugins.dat 缓存文件。当使用 Maven shade 插件将多个 jar 与 Log4j2Plugins.dat 文件合并时,只有一个会存活。如果没有插件定义,启动时会显示错误。 Log4j2 issue

对此的一种解决方案是从阴影 jar 中排除 Log4j2Plugins.dat 缓存文件,以便 Log4j 在启动时扫描插件。为此,在您的 pom 中的 maven-shade-plugin 配置中添加一个过滤器:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
            <createDependencyReducedPom>false</createDependencyReducedPom>
            <filters>
                <filter>
                    <artifact>*:*</artifact>
                    <excludes>
                        <exclude>**/Log4j2Plugins.dat</exclude>
                    </excludes>
                </filter>
            </filters>
        </configuration>
        ...
    </plugin>

另一种解决方案是使用特定于 log4j 版本的 transformation plugin 合并缓存文件。

【讨论】:

  • 将此配置添加到 pom.xml 中的 maven-shade-plugin 条目为我解决了这个问题
  • 对于 Gradle 看下面的评论
【解决方案2】:

如果您使用的是 Gradle 和 ShadowJar 4+:

shadowJar{
  transform(com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer)
}

Gradle Kotlin DSL:

shadowJar {
    transform(com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer::class.java)
}

【讨论】:

  • 这对我有用!谢谢!
【解决方案3】:

不幸的是,我无法回复 Shashank Kapoor 的回答,因为他正确指出排除 Log4j2Plugins.dat 文件可以解决问题。这在使用 gradle 时对我有用:

shadowJar {
    exclude "**/Log4j2Plugins.dat"
}

【讨论】:

    【解决方案4】:

    当人们在类路径上有多个版本的 Log4j2 时,我曾经看到过这个错误。

    【讨论】:

    • 我查看了maven包日志,只有Log4j2版本。
    • 请通过从您的应用程序中打印系统属性java.classpath 的值来确保。它可能是临时依赖或其他配置。
    【解决方案5】:

    对于我们这些从类路径中删除旧版 Logj42 以修复 Log4Shell (CVE-2021-44228) 漏洞的人,您可能会在升级后使用 uber jar 时发现此问题。

    如果您是从 Maven 或 Gradle 构建您的 uber jar,请分别使用以下插件之一:

    如果您通过其他方式构建它们,请参阅此答案:https://stackoverflow.com/a/70497498/1174024。但基本上你必须像这个类一样正确处理 Log4j2 插件缓存文件:

    https://github.com/edwgiz/maven-shaded-log4j-transformer/blob/master/src/main/java/io/github/edwgiz/log4j/maven/plugins/shade/transformer/Log4j2PluginCacheFileTransformer.java

    在构建新的 uber jar 时正确处理 Log4j2Plugins.dat 文件。

    【讨论】:

      猜你喜欢
      • 2021-07-11
      • 1970-01-01
      • 2017-11-12
      • 2018-11-13
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      相关资源
      最近更新 更多