擅用logback记录生产日志
了解logback的 SiftingAppender
ch.qos.logback.classic.sift.SiftingAppender
可以动态的根据业务生成独立的日志文件。生产环境上很多业务流程很长,日志文件都打进一个log里查询定位很不方便。因而就希望按不同的业务,每个业务生成一个独立的业务文件。
比如在Web系统中,如果想跟踪某些用户的业务操作轨迹,就可以按该用户的UserId生成不同的日志文件; 在TCP通信系统中,可以按每个连接生成独立的日志文件。
官方示例
SiftingAppender 使用SiftingAppender需要导入 ` logback-access `包。
按loggerName切分文件
业务代码规划好logName之后,就可以按不同的日志名称切分日志文件。使用起来真方便。
- 自定义一个Discriminator
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.sift.AbstractDiscriminator;
public class LoggerNameBasedDiscriminator extends AbstractDiscriminator<ILoggingEvent> {
private static final String KEY = "loggerName";
private String defaultValue;
public String getDefaultValue() {
return defaultValue;
}
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
public String getKey() {
return KEY;
}
public void setKey() {
throw new UnsupportedOperationException("Key not settable. Using " + KEY);
}
public String getDiscriminatingValue(ILoggingEvent e) {
String loggerName = e.getLoggerName();
if (loggerName == null)
return defaultValue;
return loggerName;
}
}
- 配置logback.xml
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator class="com.test.logback.LoggerNameBasedDiscriminator">
<defaultValue>general</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${loggerName}"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${baseLogPath}/logs/${loggerName}.%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
</sift>
</appender>