我开发了一个包含多个作业的Spring批处理项目。
我的目的是将这些作业的日志写入分离的文件中。例如,当启动Job#1时,所有事件都记录到job_1.log,当Job#2启动时,其事件被记录到job_2.log等等。
在我的职务配置中,我使用了:
private static final Logger logger = LoggerFactory.getLogger(Job1.class);我还尝试按照这个logback.xml的方向配置链接。但是,我不知道如何将MDC放在Spring (MDC .put("logFileName", "Job1")中;
在使用Spring批处理时,是否有更好的方法解决我的问题?
发布于 2019-12-12 13:51:26
我已经使用log实现了这一点&解决方案与Spring无关,只与Spring无关。
首先,我在logback配置文件中为每个作业定义了单独的记录器,如下所示,
`
<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-13 01:36:24
这可以使用任何日志框架来实现。在你的例子中是logback。
春季引导中的第一步使用application.yml中的以下属性
logging:
level:
ROOT: DEBUG
file: batch-job{job-name}.log注意:作业名是运行时需要传递的动态变量。
我们可以使用任何日志框架的MDC类来实现它。
只需在作业开始时清除MDC并设置新值即可。
MDC.put("job-name", "Job1"); 有关详细代码,请参见下面的帖子。
https://www.baeldung.com/mdc-in-log4j-2-logback
现在的问题是,如果您正在按特定的cron计划调度作业,那么这两个作业可能同时运行。在这种情况下,我们需要确保创建一个使用Executor框架运行每个作业的新线程。
https://stackoverflow.com/questions/59280719
复制相似问题