【问题标题】:How to write multiple log files for different Spring Batch Job?如何为不同的 Spring Batch Job 编写多个日志文件?
【发布时间】:2019-12-11 07:26:37
【问题描述】:

我开发了一个包含多个作业的 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 时有没有更好的方法来解决我的问题?

【问题讨论】:

  • 您是否将所有作业打包在同一个 jar 中?你如何运行每项工作?
  • 我所有的工作都在同一个罐子里。我使用 JobLauncher 通过添加特定的作业和作业参数来运行它们。 Sabir Khan 的解决方案可能有效,但我认为这不是最好的,因为如果我有 10 个工作,我的 logback 中必须有 10 个记录器和 10 个附加程序。有没有动态的解决方案? @Mahmoud Ben Hassine

标签: spring-batch spring-logback


【解决方案1】:

我已经使用 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")

【讨论】:

  • 效果很好。但是, 中的 LOG_DIR 是什么?如何在这里设置动态路径?例如:文件夹 1 中的作业 1 和文件夹 2 中的作业 2。或者对于特定作业,我必须再添加 1 个属性?
  • 对不起,忘了说。 LOG_DIR 是基本日志目录,是一个操作系统环境变量。您还可以使用 -&lt;property name="LOG_PATH" value="" /&gt; 之类的东西在 xml 本身中设置 LOG_PATH
  • 所以,如果我想要 5 个作业的 5 个不同路径,我必须为 LOG_PATH 设置 5 个属性?
  • 我会说,试试看,看看有什么效果。我不确定,但我认为定义LOG_PATH 是强制性的。如果您没有用于所有不同日志的公共基本目录,我认为定义五个基本目录不是一个好主意...只需尝试在appender tags 中指定完整路径。如果有,定义基本目录是有意义的路径的一部分,否则不常见。
  • 那会很好用,但我有一个问题,如果我们有两个作业使用的多个类,并且它们有自己的记录器,但从逻辑上讲,它们的日志必须与谁在同一个文件中用过这个类,不知道我的想法是否清楚,@SabirKhan 你觉得你有什么建议我会很感激
【解决方案2】:

这可以使用任何日志框架来实现。在您的情况下,它是 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 框架创建一个新线程来运行每个作业。

【讨论】:

    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多