繁体   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