log4j2错误无法识别的格式说明符[t]

pus*_*pop 9 java logging log4j log4j2 tomcat8

我有一个log4j2配置文件,用于在Tomcat 8上运行的Web应用程序,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30" status="trace" strict="true">
        <Properties>
                <Property name="logdir">/path/to/log/dir</Property>
                <Property name="filename">somelogfile.log</Property>
        </Properties>
        <Loggers>
                <Logger name="some.package.name" level="debug" additivity="false">
                        <AppenderRef ref="RollingFile"/>
                </Logger>
        </Loggers>
        <Appenders>
                <RollingFile name="RollingFile" fileName="${logdir}/${filename}" filePattern="${logdir}/${filename}.%d{yyyyMMdd}.gz">
                        <PatternLayout>
                                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
                        </PatternLayout>
                        <Policies>
                                <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
                        </Policies>
                </RollingFile>
        </Appenders>
</Configuration>
Run Code Online (Sandbox Code Playgroud)

我看到我的网络应用程序写入日志文件,但我有线程名称的%t模式似乎没有解决,所以我得到像这样的日志语句

2017-06-10 20:34:51,696 DEBUG s.p.n.SomeServlet [%t] some log message
Run Code Online (Sandbox Code Playgroud)

注意我得到%t而不是线程名称

因此,为了解决这个问题,我使用该选项启动了Tomcat

-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE
Run Code Online (Sandbox Code Playgroud)

当webapp正在部署并且log4j2正在初始化时,我看到以下消息在catalina.out中打印.

ERROR StatusLogger Unrecognized format specifier [thread]
ERROR StatusLogger Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern
2017-06-10 19:51:14,277 localhost-startStop-1 DEBUG PluginManager 'Converter' found 41 plugins
2017-06-10 19:51:14,609 localhost-startStop-1 ERROR Unrecognized format specifier [t]
2017-06-10 19:51:14,614 localhost-startStop-1 ERROR Unrecognized conversion specifier [t] starting at position 6 in conversion pattern.
Run Code Online (Sandbox Code Playgroud)

我的网络应用程序包含以下jar文件

WEB-INF/lib/log4j-api-2.8.2.jar
WEB-INF/lib/log4j-core-2.8.2.jar
WEB-INF/lib/log4j-web-2.8.2.jar
Run Code Online (Sandbox Code Playgroud)

不确定是什么导致%t打印而不是实际的线程名称.

.

Rem*_*pma 5

我见过类似的东西的唯一一次是当classpath包含多个版本的Log4j2时.我没有调查找到根本原因.


Mar*_*ies 5

如果您使用的是ShadowJarGradle,并且您没有\xc2\xb4t 有多个 Log4J 版本(如其他答案中假设的那样),请尝试解决此问题(需要 Shadow Plugin > 4.0.0,否则请参阅 此 Plugin):

\n\n

构建.gradle

\n\n
import com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer\n\nshadowJar{\n    transform(Log4j2PluginsCacheFileTransformer)\n}\n
Run Code Online (Sandbox Code Playgroud)\n