我已经开发了一个Spring Batch项目,其中包含多个作业。
我的目的是将这些作业的日志写入单独的文件中。例如,启动 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时是否有更好的方法解决我的问题?
答案 0 :(得分:2)
这可以使用任何日志框架来实现。就您而言,这是登录。
首先在Spring Boot中使用application.yml中的以下属性
docker-compose build [my_service]
请注意,这里的job-name是一个动态变量,需要在运行时传递。
我们可以使用任何日志框架的MDC类来实现它。
只需在作业开始时清除MDC并设置新值即可。
logging:
level:
ROOT: DEBUG
file: batch-job{job-name}.log
有关详细代码,请参见以下帖子。
https://www.baeldung.com/mdc-in-log4j-2-logback
现在要注意的是,如果您要按特定的cron计划来计划作业,那么这两个作业可能同时运行。在这种情况下,我们需要确保创建一个新线程来使用Executor框架运行每个作业。
答案 1 :(得分:1)
我已经通过使用登录实现了此目的,解决方案与Spring Batch无关,但与Spring Boot无关。
首先,我在如下所示的logback配置文件中为每个作业定义了单独的Logger,
`
<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(Job1.class);
private static final Logger logger = LoggerFactory.getLogger("Job1Logger")