如何为不同的 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 框架为 运行 每个作业创建一个新线程。
我开发了一个包含多个作业的 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 框架为 运行 每个作业创建一个新线程。