标签:string http sys 可扩展 配置信息 uri 技术 测试 mail
了解log4j的源代码来源于项目中一次需求,我们想将系统所有的warn日志统一收集到common-warn.log的日志中去,以便于系统对其进行监控处理。于是模拟自动生成的error配置完成了warn的配置,但是测试发现common-warn.log中竟然有error日志,而且业务的正常日志中竟然也存在error和warn日志。这样相当于日志重复打了好多地方,无疑增加了日志量,同时增加了磁盘消耗。
原始配置:
<appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${log_root}/${sys_host_name}/app-service.log"/>
<param name="append" value="true"/>
<param name="encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d [%X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n"/>
</layout>
</appender>
<!-- [公共Appender] 汇总错误 -->
<appender name="ERROR-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${log_root}/${sys_host_name}/common-error.log"/>
<param name="append" value="true"/>
<param name="encoding" value="UTF-8"/>
<param name="threshold" value="error"/>`
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d [%X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n"/>
</layout>
</appender>
<!-- [公共Appender] 汇总警告 -->
<appender name="WARN-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${log_root}/${sys_host_name}/common-warn.log"/>
<param name="append" value="true"/>
<param name="encoding" value="UTF-8"/>
<param name="threshold" value="WARN"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d [%X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n"/>
</layout>
</appender>
<!-- [应用Logger] - 默认 -->
<logger name="APP-LOG" additivity="false">
<level value="${log_level}"/>
<appender-ref ref="DEFAULT-APPENDER"/>
<appender-ref ref="WARN-APPENDER"/>
<appender-ref ref="ERROR-APPENDER"/>
</logger>
所以我的核心诉求就是:将小于等于info的日志打印到app-service.log,将error打印到common-error.log, 将warn打印到common-warn.log。
核心抽象:
整个日志打印的过程可以理解为Loger拿着LoggingEvent去找Appender, 让Appender按照Layout的形式将日志打印到指定的位置。 而Level起的啥作用呢? Logger和Appender都是有原则的不能说你让我打印我就打印,必须满足我的规则我才给你打印,这里的规则就是指Level(出来混都是要讲原则的)。
核对类图:

核心逻辑在LogManager的静态代码块,根据配置信息解析初始化Logger,Appender和Layout等核心组件;

核心的日志打印流程, 中间还有很多控制的细节,具体可以看源代码:

回到我们的出发点,如何实现:
将小于等于info的日志打印到app-service.log,将error打印到common-error.log, 将warn打印到common-warn.log。
目前项目中使用的方案为2, 同时app-service.log的Appender不配置Filter默认接受error和warn的日志, 但是warn和error通过Fileter进行区分不会相互影响,这样可以满足业务监控warn和error日志的需求,不需要修改任何代码,同时满足不会丢失日志的问题。但是存在error和warn日志重复打印的问题。
最终的解决方案配置:
<appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${log_root}/${sys_host_name}/app-default.log"/>
<param name="append" value="true"/>
<param name="encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d [%X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n"/>
</layout>
</appender>
<!-- [公共Appender] 汇总错误 -->
<appender name="ERROR-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${log_root}/${sys_host_name}/common-error.log"/>
<param name="append" value="true"/>
<param name="encoding" value="UTF-8"/>
<param name="threshold" value="error"/>`
<!-- 仅打印error级别的日志 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="ERROR" />
<param name="levelMax" value="ERROR"/>
<param name="acceptOnMatch" value="true"/>
</filter>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d [%X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n"/>
</layout>
</appender>
<!-- [公共Appender] 汇总警告 -->
<appender name="WARN-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${log_root}/${sys_host_name}/common-warn.log"/>
<param name="append" value="true"/>
<param name="encoding" value="UTF-8"/>
<param name="threshold" value="WARN"/>
<!-- 仅打印warn级别的日志 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="WARN" />
<param name="levelMax" value="WARN"/>
<param name="acceptOnMatch" value="true"/>
</filter>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d [%X{loginUserEmail}/%X{loginUserID}/%X{remoteAddr}/%X{clientId} - %X{requestURIWithQueryString}] %-5p %c{2} - %m%n"/>
</layout>
</appender>
<!-- [应用Logger] - 默认 -->
<logger name="APP-LOG" additivity="false">
<level value="${log_level}"/>
<appender-ref ref="DEFAULT-APPENDER"/>
<appender-ref ref="WARN-APPENDER"/>
<appender-ref ref="ERROR-APPENDER"/>
</logger>
标签:string http sys 可扩展 配置信息 uri 技术 测试 mail
原文地址:http://www.cnblogs.com/E-star/p/6082804.html