一、前言
前期接触到日志的基本配置,能够实现的是大概就是按日志级别输出,日志文件按天、
大小等生成,但有的时候如果把所有日志都放在一个文件里,可能在查看日志时非常不方便,就好比如我想将每个用户的相关操作都保存在对应的日志文件中,这种我们就需要SiftingAppender。
二、SiftingAppender
顾名思义,SiftingAppender能够在运行中指定的变量,对日志事件进行筛选,由不同的appender去写日志。在logback.xml中的基本格式:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="true">
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<!--discriminator鉴别器,根据logTag这个key对应的value鉴别日志事件,然后委托给具体appender写日志-->
<discriminator>
<key>logTag</key>
<defaultValue>default</defaultValue>
</discriminator>
<sift>
<!--具体的写日志appender,每一个taskId创建一个文件-->
<appender name="${logTag}" class="ch.qos.logback.core.FileAppender">
<file>/log/info-${logTag}.log</file>
<!--其他省略-->
...
</appender>
</sift>
</appender>
<logger name="test.log" level="INFO">
<appender-ref ref="SIFT"/>
</logger>
</configuration>
鉴别器discriminator没指定class时,默认为MDCBasedDiscriminator,使用过程中通过MDC指定中的logTag的值,然后中appender就可以引用其值,实现一个动态指定日志输出,也就能达到文件分离的目的,倘若没有指定则会使用中的默认值。
三、示例
1、logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<property name="log.path" value="log/posonline/" />
<!-- 日志输出格式 -->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} - [%25.25(%thread)] - [%-5level] - %-30.30(%logger{30}) : %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!--api接口日志-->
<appender name="api_appender" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>user_code</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="${user_code}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/biz-info-${user_code}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/biz-info-${user_code}.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
</sift>
</appender>
<logger name="com.test.log" additivity="false" level="info">
<appender-ref ref="api_appender"/>
<appender-ref ref="console" />
</logger>
</configuration>
2、代码
package com.test.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
public class Main {
static Logger log = LoggerFactory.getLogger("com.test.log");
public static void main(String[] args) {
MDC.put("user_code","0001");
log.info("0001用户");
MDC.clear();
MDC.put("user_code","0002");
log.info("0002用户");
MDC.clear();
}
}
3、输出
控制台:
本地日志文件: