当前位置: 首页 > 知识库问答 >
问题:

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

艾敏学
2023-03-14

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

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

我看到我的 Web 应用写入日志文件,但我对线程名称的 %t 模式似乎无法解析,因此我收到这样的日志语句

2017-06-10 20:34:51,696 DEBUG s.p.n.SomeServlet [%t] some log message

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

所以为了解决这个问题,我使用选项启动了Tomcat

-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE

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

我的web应用程序包含以下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

不确定导致 %t 打印而不是实际线程名称的原因。

共有3个答案

夏晋
2023-03-14

当我运行多个版本的log4j2时,我也经历过这种情况。检查是否有任何依赖项拉入重复的 jar。祝你好运!对于类加载器来说,这可能是一场噩梦!

咸育
2023-03-14

如果您使用的是暗影Jar和Gradle,并且您没有像其他假设的答案那样有多个Log4J版本,请尝试使用此方法来解决问题(需要影子插件

build.gradle

import com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer

shadowJar{
    transform(Log4j2PluginsCacheFileTransformer)
}
刁文光
2023-03-14

我唯一一次看到类似的情况是当类路径包含多个版本的Log4j2时。但我并没有调查以找到根本原因。

 类似资料:
  • Spring 4.3.30 hibernate 5应用程序。pom.xml具有所有log4j2依赖项。 甚至增加了log4j2.xml 我得到的错误是: 我还错过了什么,因为即使我的模式不包含默认布局,我也一直在出错?我在迁移到log4j之前使用log4jlog4j2.Din计划迁移到log4j2,但由于我必须升级Spring和hibernate,我开始找到ERROR StatusLogger N

  • xml配置。log4j2.version=2.10.0,Spring Boot版本为1.5.9 log4j2.xml配置

  • 我有一个用Java编写的AWS Lambda函数。我想用一个自定义的GraalVM运行时来运行Lambda函数,例如在这篇博客文章中所做的 每当应用程序启动时,我都会收到以下错误: 这是我的log4j2.xml文件的样子 这里的其他类似问题表明,这是由于fatjar中存在冲突的log4j包。基于这个答案中的建议,我现在使用shadowJar和一个转换来构建fatjar,GraalVM应用程序就是从

  • 说我想打印: 这是正确的。这: 或者这个: ? 事情是在其他地方,所以我遇到了这样的讨论: -即使ch变为无符号字符,代码的行为也不是由C标准定义的。这是因为无符号字符被提升为int(在普通的C实现中),所以int被传递给printf的说明符%u。但是,%u需要一个无符号int,所以类型不匹配,并且C标准没有定义该行为 -你的评论不正确。C11标准规定转换说明符必须与函数参数本身的类型相同,而不是

  • 我使用Java8的ZonedDateTime和DateTimeFormatter。当我试图解析自己的模式时,它无法识别并抛出异常。

  • 本文向大家介绍Fortran 分配格式说明符,包括了Fortran 分配格式说明符的使用技巧和注意事项,需要的朋友参考一下 示例 在Fortran 95之前,可以将分配的格式用于输入或输出。考虑 该assign语句将语句标签分配给整数变量。以后将此整数变量用作print语句中的格式说明符。 在Fortran 95中删除了这种格式说明符分配。相反,更现代的代码可以使用其他形式的执行流控制 或字符变量