场景: 一个 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 写入任务名称:
javapackage 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 许可协议。转载请注明出处!