首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为不同的Spring批处理作业编写多个日志文件?

如何为不同的Spring批处理作业编写多个日志文件?
EN

Stack Overflow用户
提问于 2019-12-11 07:26:37
回答 2查看 4.6K关注 0票数 1

我开发了一个包含多个作业的Spring批处理项目。

我的目的是将这些作业的日志写入分离的文件中。例如,当启动Job#1时,所有事件都记录到job_1.log,当Job#2启动时,其事件被记录到job_2.log等等。

在我的职务配置中,我使用了:

代码语言:javascript
复制
private static final Logger logger = LoggerFactory.getLogger(Job1.class);

我还尝试按照这个logback.xml的方向配置链接。但是,我不知道如何将MDC放在Spring (MDC .put("logFileName", "Job1")中;

在使用Spring批处理时,是否有更好的方法解决我的问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-12 13:51:26

我已经使用log实现了这一点&解决方案与Spring无关,只与Spring无关。

首先,我在logback配置文件中为每个作业定义了单独的记录器,如下所示,

`

代码语言:javascript
复制
<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")

票数 5
EN

Stack Overflow用户

发布于 2019-12-13 01:36:24

这可以使用任何日志框架来实现。在你的例子中是logback。

春季引导中的第一步使用application.yml中的以下属性

代码语言:javascript
复制
logging:
  level:
    ROOT: DEBUG
  file: batch-job{job-name}.log

注意:作业名是运行时需要传递的动态变量。

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

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

代码语言:javascript
复制
MDC.put("job-name", "Job1"); 

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

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

现在的问题是,如果您正在按特定的cron计划调度作业,那么这两个作业可能同时运行。在这种情况下,我们需要确保创建一个使用Executor框架运行每个作业的新线程。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59280719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档