擅用logback记录生产日志

了解logback的 SiftingAppender

ch.qos.logback.classic.sift.SiftingAppender 可以动态的根据业务生成独立的日志文件。生产环境上很多业务流程很长,日志文件都打进一个log里查询定位很不方便。因而就希望按不同的业务,每个业务生成一个独立的业务文件。 比如在Web系统中,如果想跟踪某些用户的业务操作轨迹,就可以按该用户的UserId生成不同的日志文件; 在TCP通信系统中,可以按每个连接生成独立的日志文件。

官方示例

SiftingAppender 使用SiftingAppender需要导入 ` logback-access `包。

按loggerName切分文件

业务代码规划好logName之后,就可以按不同的日志名称切分日志文件。使用起来真方便。

  1. 自定义一个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;
	    }
}
  1. 配置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>
blog comments powered by Disqus