[英]In Log4j2, using RollingFile appender, how to add an unique id to the rolled file name?
[英]RollingFile appender with file name to be determined at each logger invocation
我有一个 function 执行 HTTP 请求/响应,我想记录它们的内容。
此类代码可以在同一执行中多次调用(由“executionId”分类),并且每次可以具有不同的“activityId”。
我想得到的是:
execution1.log
、 execution2.log
、 execution3.log
等)execution1.log
已经创建并且我被要求在executionId == execution1
时再次记录一些内容,然后附加到该文件)。 考虑到这个目的,我配置了以下log4j2.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<properties>
<property name="logDir">logs/</property>
</properties>
<appenders>
<RollingFile name="HttpActivityTracingAppender" filePattern="${logDir}/http-logs/${ctx:executionId}.log" append="true">
<PatternLayout pattern="%d{ISO8601} [%t] %c [execution:%X{executionId},activity:%X{activityId}] : %p - %m%n"/>
<Policies>
<OnStartupTriggeringPolicy />
</Policies>
</RollingFile>
</appenders>
<loggers>
<logger name="HttpActivityTracing" level="trace">
<appender-ref ref="HttpActivityTracingAppender"/>
</logger>
</loggers>
</configuration>
...然后我按如下方式调用记录器:
ThreadContext.put("id", UUID.randomUUID().toString());
ThreadContext.putAll(Map.of("executionId", ..., "activityId", ...);
ThreadContext.pop();
myLogger.trace("bla bla bla");
ThreadContext.clearAll();
结果是第一次定义了executionId
(比如说execution1
),然后按预期在logs/
下创建了一个名为execution1.log
的日志文件。
但是,在使用新的executionId
值连续执行时,我在日志文件中看到了新的executionId
,但使用的文件的名称仍然是execution1.log
。
因此,例如,在execution1.log
中,我会找到如下内容:
2022-09-20T22:52:02,639 [main] HttpActivityTracing [execution:execution1,activity:activity1] : TRACE - ... (ok)
2022-09-20T22:52:02,639 [main] HttpActivityTracing [execution:execution1,activity:activity2] : TRACE - ... (ok)
2022-09-20T22:52:02,639 [main] HttpActivityTracing [execution:execution1,activity:activity3] : TRACE - ... (ok)
2022-09-20T22:52:02,639 [main] HttpActivityTracing [execution:execution2,activity:activity1] : TRACE - ... (NO, I WANT THIS INTO ANOTHER FILE "execution2.log")
2022-09-20T22:52:02,639 [main] HttpActivityTracing [execution:execution2,activity:activity2] : TRACE - ... (NO, I WANT THIS INTO ANOTHER FILE "execution2.log")
我在 web 上找到了几个例子,但我无法使这个工作,我觉得我不远,但我不能让它工作。
有人可以帮忙吗?
Ps 我尝试在RollingFile
appender 配置中使用fileName
而不是filePattern
,但它尝试在其中创建一个名为${ctx:executionId}
的文件,最终被 Windows 拒绝,因为它包含非法字符:
。
我最终使用与问题中所示完全相同的配置解决了该问题,并在ThreadContext.pop()
之后加上以下两行代码:
LoggerContext context = (LoggerContext) LogManager.getContext(false);
context.reconfigure();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.