簡體   English   中英

RollingFile appender,文件名在每次記錄器調用時確定

[英]RollingFile appender with file name to be determined at each logger invocation

我有一個 function 執行 HTTP 請求/響應,我想記錄它們的內容。

此類代碼可以在同一執行中多次調用(由“executionId”分類),並且每次可以具有不同的“activityId”。

我想得到的是:

  • 每次 executionId 更改時都會創建一個新的日志文件(因此具有execution1.logexecution2.logexecution3.log等)
  • 將 append 放入可能已經存在的文件中,所有日志都具有相同的執行 ID(因此,如果文件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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM