工程管理之五:基于Logback管理应用日志

目前工程中对于输出日志的需求:

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配置

猜你喜欢

转载自shensy.iteye.com/blog/1851009
今日推荐