0

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

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

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

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

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

4

2 回答 2

4

我使用 log back 实现了这一点,解决方案与 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")

于 2019-12-12T13:51:26.887 回答
3

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

首先在 spring boot 中使用 application.yml 中的以下属性

logging:
  level:
    ROOT: DEBUG
  file: batch-job{job-name}.log

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

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

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

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

有关详细代码,请参阅下面的帖子。

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

现在要注意的是,如果您在某个 cron 计划中安排作业,那么两个作业可能会同时运行。在这种情况下,我们需要确保使用 Executor 框架创建一个新线程来运行每个作业。

于 2019-12-13T01:36:24.287 回答