如何为不同的 Spring 批处理作业写入多个日志文件?

How to write multiple log files for different Spring Batch Job?

我开发了一个包含多个作业的 Spring 批处理项目。
我的目的是将这些作业的日志写入单独的文件中。例如,当 Job#1 启动时,所有事件都记录到 job_1.log,当 Job#2 启动,其事件记录到 job_2.log 等等。

在我的工作配置中,我使用了:

private static final Logger logger = LoggerFactory.getLogger(Job1.class);

我也尝试按照 link 的指示配置 logback.xml 。 但是,我不知道如何将 MDC 放入 Spring Batch (MDC .put("logFileName", "Job1");

使用 Spring Batch 时,是否有更好的方法解决我的问题?

我已经使用 log back 实现了这个,解决方案与 Spring Batch 无关,但 Spring Boot.

首先,我在 logback 配置文件中为每个作业定义了单独的记录器,如下所示,

`

<include resource="org/springframework/boot/logging/logback/base.xml" />

<property name="LOG_PATH" value="${LOG_DIR}" />

<timestamp key="timestamp-by-second" datePattern="yyyyMMdd'T'HHmmss" />

<appender name="Console-Appender" class="ch.qos.logback.core.ConsoleAppender">
    <layout>
        <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n
        </pattern>
    </layout>
</appender>

<appender name="Job1"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH}/Job1.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>${LOG_PATH}/Job1.%i.log
        </fileNamePattern>
        <minIndex>1</minIndex>
        <maxIndex>600</maxIndex>
    </rollingPolicy>

    <triggeringPolicy
        class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
        <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n
        </pattern>
        <outputPatternAsHeader>true</outputPatternAsHeader>
    </encoder>
</appender>

<appender name="Job2"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH}/Job2.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>${LOG_PATH}/Job2.%i.log
        </fileNamePattern>
        <minIndex>1</minIndex>
        <maxIndex>600</maxIndex>
    </rollingPolicy>
    <triggeringPolicy
        class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
        <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n
        </pattern>
    </encoder>
</appender>

<logger name="Job1Logger" level="info" additivity="false">
    <appender-ref ref="Job1" />
</logger>

<logger name="Job2erLogger" level="info" additivity="false">
    <appender-ref ref="Job2" />
</logger>

<root>
    <appender-ref ref="Console-Appender" />
</root>

`

然后您需要做 private static final Logger logger = LoggerFactory.getLogger("Job1Logger")

而不是 - private static final Logger logger = LoggerFactory.getLogger(Job1.class);

这可以使用任何日志框架来实现。在您的情况下,它是 logback。

首先在 spring 引导中使用 application.yml

中的以下属性
logging:
  level:
    ROOT: DEBUG
  file: batch-job{job-name}.log

这里注意job-name是一个动态变量,需要在运行时传递。

我们可以使用任何日志框架的MDCclass来实现。

只需在作业开始时清除 MDC 并设置新值。

MDC.put("job-name", "Job1"); 

详细代码见下方post。

https://www.baeldung.com/mdc-in-log4j-2-logback

现在要注意的是,如果您按特定的 cron 时间表安排作业,那么两个作业可能 运行 同时进行。在这种情况下,我们需要确保使用 Executor 框架为 运行 每个作业创建一个新线程。