编辑
2026-01-18
笔记
00
请注意,本文编写于 54 天前,最后修改于 54 天前,其中某些信息可能已经过时。

场景: 一个 Spring Boot + Quartz 的工程,做电水气能的计算定时任务。希望电水气的计算任务执行日志,分成不同文件输出。

实现 logback-spring.xml 如下:

xml
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds"> <!-- 上下文名称 --> <contextName>etl-demo</contextName> <!-- 自定义转换词 下面三行是从 spring-boot-2.7.18.jar 中 org/springframework/boot/logging/logback/defaults.xml 文件中拷贝的 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- 定义日志打印格式 --> <property name="SOUT_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5level) %clr(${PID:- }){magenta} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx"/> <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5level ${PID:- } [%15.15t] %-40.40logger{39} : %m%n%wEx"/> <property name="SOUT_LOG_CHARSET" value="UTF-8"/> <property name="FILE_LOG_CHARSET" value="UTF-8"/> <appender name="SOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${SOUT_LOG_PATTERN}</pattern> <charset>${SOUT_LOG_CHARSET}</charset> </encoder> </appender> <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> <!-- discriminator 鉴别器,根据 taskName 这个 key 对应的 value 鉴别日志事件,然后委托给具体 appender 写日志--> <discriminator> <key>taskName</key> <defaultValue>default</defaultValue> </discriminator> <sift> <!-- 具体的写日志 appender,每一个 taskName 创建一个文件--> <appender name="FILE-${taskName}" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> <charset>${FILE_LOG_CHARSET}</charset> </encoder> <file>D:\gitsrd\gsta-ems\ems-etl-plus\etl-demo\logs\etl-demo-${taskName}.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>etl-demo-${taskName}-%d{yyyy-MM-dd}-%i.gz</fileNamePattern> <cleanHistoryOnStart>false</cleanHistoryOnStart> <maxFileSize>10MB</maxFileSize> <totalSizeCap>0</totalSizeCap> <maxHistory>7</maxHistory> </rollingPolicy> </appender> </sift> </appender> <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/> <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/> <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/> <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/> <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/> <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/> <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/> <logger name="org.springframework.boot.actuate.endpoint.jmx" level="WARN"/> <root level="INFO"> <appender-ref ref="SOUT"/> <appender-ref ref="SIFT"/> </root> </configuration>

在代码中使用 MDC 写入任务名称:

java
package com.gsta.ems.etl.plus.demo.job; import com.gsta.ems.etl.plus.core.calc.ECalcService; import com.gsta.ems.etl.plus.core.clean.ECleanService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.MDC; import org.springframework.scheduling.quartz.QuartzJobBean; import org.springframework.stereotype.Component; @Slf4j @Component @RequiredArgsConstructor @DisallowConcurrentExecution public class ECalcJob extends QuartzJobBean { public static final String NAME = "ECalcJob"; public static final String DESCRIPTION = "负责计算电能数据(15min、hour、day、month、year)"; private final ECleanService eCleanService; private final ECalcService eCalcService; @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { MDC.put("taskName","ecalc"); log.info("------------------------------ 模拟 清洗电表数据 ------------------------------"); log.info("------------------------------ 模拟 电能数据 ------------------------------"); MDC.remove("taskName"); } }

参考:

本文作者:菜宝熊

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!