近期开发的项目中使用slf4j打印日志,要求按天打印,并且要打印用户ID和sessionID,另由于项目框架集成了spring作为service层的实现框架,又要求实现打印所有service层方法执行的开始和结束信息到另外的文件中。前者实现较为普通,网上各种现成的,后者需要借助于slf4j的表达式进行过滤,约定命名规则后开始定义配置文件。
<!DOCTYPE logback>
<configuration>
<property name="LOG_HOME" value="D:\logs" /> // 设定日志文件输出文件夹路径
// 控制台输出
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> // 开发期间用于控制台输出,%X表示要从MDC中获取指定参数
<target>System.out</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} %5p [userId=%X{userId}] [sessionId=%X{sessionId}] %c{n} %m \(%F@%L\)%n</Pattern>
</encoder>
</appender>
// 业务层监察日志输出
<appender name="audit" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Encoding>UTF-8</Encoding>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>throwable == null &&logger.contains("ServiceImpl")</expression> // 只接受无异常并且包含ServiceImpl关键字的信息
</evaluator>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}\audit_%d{yyyyMMdd}.log</FileNamePattern> // 打印到专用的文件
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} %5p [userId=%X{userId}] [sessionId=%X{sessionId}] %c{n} %m \(%F@%L\)%n</pattern>
</layout>
</appender>
// 数据库操作层日志输出
<appender name="web" class="ch.qos.logback.core.rolling.RollingFileAppender"> // 主要打印执行的SQL
<Encoding>UTF-8</Encoding>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>logger.contains("ServiceImpl")</expression> // 屏蔽业务层日志信息
</evaluator>
<OnMatch>DENY</OnMatch>
<OnMismatch>ACCEPT</OnMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}\web_%d{yyyyMMdd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} %5p [userId=%X{userId}] [sessionId=%X{sessionId}] %c{n} %m \(%F@%L\)%n</pattern>
</layout>
</appender>
// 对象包及日志级别
<logger name="com.slf4j" level="info">
</logger>
// root定义
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="audit" />
<appender-ref ref="web" />
</root>
</configuration>
业务层AOP类方法:
public void start(JoinPoint point) { // 方法开始时打印start
Logger logger = LoggerFactory.getLogger(point.getTarget().getClass().getName() + StringConstant.POINT + point.getSignature().getName());
logger.info(" ==> Start");
}
public void end(JoinPoint point) { // 方法结束时打印end
Logger logger = LoggerFactory.getLogger(point.getTarget().getClass().getName() + StringConstant.POINT + point.getSignature().getName());
logger.info(" ==> End");
}
日志头格式:
2014/05/14 16:18:17.224 INFO [userId=A00010] [sessionId=230E98674350A5750EC8FD6EF2204E1B] com.slf4j.......................