[英]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.