如何为不同的Spring Batch Job写多个日志文件?

时间:2019-12-11 07:26:37

标签: spring-batch spring-logback

我已经开发了一个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时是否有更好的方法解决我的问题?

2 个答案:

答案 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")