目前工程中对于输出日志的需求:
1、不同日志级别输出到不同文件及控制台。
2、日志按时间和特定格式输出到不同文件.超过一段时间后自动清除。
3、不同包路径下的程序可以设置不同的日志级别。
现在我们使用的logback正好可以解决以上问题,分享出来,希望对看到的人有帮助。
logback配置如下(以下是一个普遍Java工程的配置):
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="true" scan="true"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <Target>System.out</Target> <encoder> <Pattern> %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger [%file:%line] [%X{logid}]- %msg%n </Pattern> </encoder> </appender> <appender name="ERR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/logback_test.err.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern> logs/logback_test.err.log.%d{yyyy-MM-dd} </fileNamePattern> <maxHistory>7</maxHistory> </rollingPolicy> <!-- 临界值过滤器:过滤掉低于指定临界值的日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter> <encoder> <Pattern> %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger [%file:%line] [%X{logid}]- %msg%n </Pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/logback_test.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern> logs/logback_test.log.%d{yyyy-MM-dd} </fileNamePattern> <maxHistory>7</maxHistory> </rollingPolicy> <encoder> <Pattern> %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger [%file:%line] [%X{logid}]- %msg%n </Pattern> </encoder> </appender> <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/access.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern> logs/access.log.%d{yyyy-MM-dd} </fileNamePattern> <maxHistory>120</maxHistory> </rollingPolicy> <encoder> <Pattern> [%X{logid}]- %msg%n </Pattern> </encoder> </appender> <appender name="QUERY" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/query.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern> logs/query.log.%d{yyyy-MM-dd} </fileNamePattern> <maxHistory>120</maxHistory> </rollingPolicy> <encoder> <Pattern> [%X{logid}]- %d{yyyy-MM-dd HH:mm:ss}\t%msg%n </Pattern> </encoder> </appender> <appender name="UPDATE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/update.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern> logs/update.log.%d{yyyy-MM-dd} </fileNamePattern> <maxHistory>120</maxHistory> </rollingPolicy> <encoder> <Pattern> [%X{logid}]- %d{yyyy-MM-dd HH:mm:ss}\t%msg%n </Pattern> </encoder> </appender> <logger name="com.mylogback"> <level value="ERROR"/> <appender-ref ref="FILE"/> </logger> <root> <level value="WARN"/> <!-- <appender-ref ref="FILE"/> --> <appender-ref ref="ERR"/> <appender-ref ref="STDOUT"/> </root> </configuration>很容易理解:
root包以下的代码都用WARN级别输出,分别输出到控制台和ERR文件。
com.mylogback包下面的代码使用ERROR级别输出,只输出到名为FILE的Appender。
其中,日志会按照时间每天建立一个文件,maxHistory是日志保存的最大天数。
扩展知识:
关于MDC(映射诊断环境):
为每个客户端添加一个唯一戳,用户将环境信息放进MDC。
String logid = StringUtils.stripToNull(form.getFirstValue("logid", true)); if (null == logid) { logid = "-" + Math.abs(RANDOM_GENERATOR.nextLong()); } MDC.put("logid", logid);
每个客户端连接时,分配一个随机数,放入MDC。
然后在logback.xml中配置:
<encoder> <Pattern> %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger [%file:%line] [%X{logid}]- %msg%n </Pattern> </encoder>
其中%X{logid}代表输出MDC中的logid。
关于过滤器[见参考资料]:
LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。有以下子节点:
<level>:设置过滤级别
<onMatch>:用于配置符合过滤条件的操作
<onMismatch>:用于配置不符合过滤条件的操作
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
<!-- 过滤掉 TRACE 和 DEBUG 级别的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
EvaluatorFilter: 求值过滤器,评估、鉴别日志是否符合指定条件。
<evaluator>:
鉴别器,常用的鉴别器是JaninoEventEvaluato,也是默认的鉴别器,它以任意的java布尔值表达式作为求值条件,求值条件在配置文件解释过成功被动态编译,布尔值表达式返回true就表示符合过滤条件。evaluator有个子标签<expression>,用于配置求值条件。
关于Logback初始化:
可以参考我的另一篇blog:http://shensy.iteye.com/blog/1622612 日志初始化工具
参考资料:
http://blog.csdn.net/haidage/article/details/6794540 logback.xml常用配置详解(系列文章)
http://hanhongke123.blog.163.com/blog/static/62223494201241741237345/ logback配置