我试图设置日志模式打印类方法和日志文件行。下面是我的配置。它与控制台工作正常,但不与异步工作
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_PATTERN" value="%d [%thread] [%-5level] [%class{36}.%M %L] [Content-Id:%X{contentId}] [Request-Id:%X{requestId}] [%c{1.}] - %msg%n" />
<Property name="LOG_DIR" value="logs" />
<Property name="SYSTEM_FILE" value="application.log" />
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</Console>
<Async name="Async">
<AppenderRef ref="FileAppender" />
</Async>
<RollingFile name="FileAppender"
fileName="${LOG_DIR}/${SYSTEM_FILE}"
filePattern="${LOG_DIR}/${SYSTEM_FILE}-%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<DefaultRolloverStrategy max="100" />
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.myproject" level="debug" additivity="false">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="Async" />
</Logger>
<Root level="info">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="Async" />
</Root>
</Loggers>
我正在使用此**[%class{36}.%M %L]**模式来记录类方法和行。
感谢您的支持。
1条答案
按热度按时间bqucvtff1#
在Java中,检索调用者位置是一项开销很大的操作。它总是需要某种堆栈遍历。
如果一切都是同步的,Log4j会在需要时延迟检索位置。但如果appender或logger是异步的,则必须在跳转线程之前检索位置。对于异步元素,这会使日志记录速度降低5到20倍。这就是为什么在这些情况下,默认情况下位置是禁用的。
您可以使用
includeLocation
属性启用位置:另一种解决方案(如果您使用Maven)是使用最近发布的
log4j-transform-maven-plugin
,它在编译时计算位置,因此不再需要运行时查找,位置始终可用。只需将其添加到您的POM文件(参见documentation):免责声明:我是
log4j-maven-transform-plugin
的主要作者。