gpt4 book ai didi

java - 根据父上下文记录到不同的文件

转载 作者:行者123 更新时间:2023-12-02 02:01:26 24 4
gpt4 key购买 nike

我有一个使用 Spring Boot 构建的后台 Java 应用程序,并且使用 SLF4J 进行日志记录(必需)。该应用程序包含多个定期运行的作业。

我想将每个作业期间发生的所有事情记录在一个单独的文件中。这将为每个作业提供一个日志文件,以及用于应用程序启动等的通用日志文件。

当涉及到作业的主类时,这是一项简单的任务,因为我所需要做的就是按名称检索我感兴趣的记录器:

public class SchedulerOne extends Runnable {
@Autowired
private CommonDao commonDao;

private static final Logger LOGGER = LoggerFactory.getLogger("logger_one");
...
}

但棘手的部分是让不同作业调用的公共(public)资源记录​​到正确的文件。

public class CommonDao {

private static final Logger LOGGER = LoggerFactory.getLogger(CommonDao.class);
...
}

我想要的:当SchedulerOne调用CommonDao的任何方法时,后续日志应该出现在“logger_one”中。当 SchedulerTwo 调用相同的方法时,日志应出现在“logger_two”中。

当前发生的情况:CommonDao 忽略上下文并仅写入默认日志文件。

我能找到的关于该主题的唯一资源是 logback 文档 ( https://logback.qos.ch/manual/loggingSeparation.html ),它在记录时使用 ContextJNDISelector 选择适当的上下文。这看起来像是我想要做的,但这些说明针对的是包含多个 Web 应用程序的应用程序。我只有一个没有 web.xml 的应用程序,因此这似乎不适用。

我当前的logback配置如下:

<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logger_default.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</encoder>

<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>c:/jcg.%i.log.zip</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>10</MaxIndex>
</rollingPolicy>

<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>2MB</MaxFileSize>
</triggeringPolicy>
</appender>

<appender name="SCHEDULER_ONE" class="ch.qos.logback.core.FileAppender">
<file>scheduler_one.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>

<logger name="logger_one" level="DEBUG" additivity="false">
<appender-ref ref="SCHEDULER_ONE"/>
</logger>

<root level="DEBUG">
<appender-ref ref="FILE" />
</root>

最佳答案

您需要将 MDC 与 SiftingAppender 结合起来,如所述 here ,所以类似:

<configuration>
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<defaultValue>default</defaultValue>
<key>context</key>
</discriminator>
<sift>
<appender name="FILE-${context}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logger_${context}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</encoder>

<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>c:/jcg_${context}.%i.log.zip</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>10</MaxIndex>
</rollingPolicy>

<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>2MB</MaxFileSize>
</triggeringPolicy>
</appender>
</sift>
</appender>

<logger name="logger_one" level="DEBUG" additivity="false">
<appender-ref ref="SIFT"/>
</logger>

<root level="DEBUG">
<appender-ref ref="SIFT" />
</root>
</configuration>

然后在 SchedulerOne 中执行 MDC.put("context", "one") 并在 SchedulerTwo 中执行 MDC.put("context", "two")

关于java - 根据父上下文记录到不同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51516540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com