现在遇到这样一个场景:
输出日志,按照不同的模块,和级别 输出到不同的文件中。
现在有 org.zq.core 和 org.zq.web 包下需要将 info 和 error 分别输出到文件中,也就是说,需要输出到4个文件中。
以下为配置文件;
`实现思路:`
分包:应该叫 log4j 的过滤功能,先过滤 log4j.logger.org.zq.core = xxx ,
分级:然后使用 自定义的 appender 来改变log4j的层级范围判定
自定义appender
package org.zq.core.common.util.log;
import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Priority;
/**
* Created by zhuqiang on 2015/5/12.
*/
public class MyDailyRollingFileAppender extends DailyRollingFileAppender {
@Override
public boolean isAsSevereAsThreshold(Priority priority) {
//只判断相同的范围(层级)
return this.getThreshold().equals(priority);
}
}
log4j.properties
### set log levels ###
log4j.rootLogger = info,stdout
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
#配置org.zq.core该包下的appender:日志级别为:info,error,并且引用两个 appender#
log4j.logger.org.zq.core = info,error,coreInfo,coreError
## core info 日志:info 的日志输出到指定的一个目录##
log4j.appender.coreInfo = org.zq.core.common.util.log.MyDailyRollingFileAppender #使用自定义的appender,改变Threshold的比较规则,只返回相同的。覆写原生的级别层级范围#
log4j.appender.coreInfo.File = d:/zq/logs/core/info/info.log #输出文件地址#
log4j.appender.coreInfo.layout = org.apache.log4j.PatternLayout #布局样式#
log4j.appender.coreInfo.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n #布局模版#
log4j.appender.coreInfo.Threshold = INFO #这里一定要添加该属性,否则自定义appender中抛出空指针#
log4j.additivity.coreInfo=false
## core error 日志:只拦截error错误信息,并且输出到指定的文件中##
log4j.appender.coreError = org.zq.core.common.util.log.MyDailyRollingFileAppender
log4j.appender.coreError.File = d:/zq/logs/core/error/error.log
log4j.appender.coreError.layout = org.apache.log4j.PatternLayout
log4j.appender.coreError.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.coreError.Threshold = ERROR
log4j.additivity.coreError=false
#########################################################################################################
#配置org.zq.web该包下的appender:日志级别为:info,error,并且引用两个 appender#
log4j.logger.org.zq.web = info,error,webInfo,webError
## web info 日志##
log4j.logger.webInfo = info,webInfo
log4j.appender.webInfo = org.zq.core.common.util.log.MyDailyRollingFileAppender
log4j.appender.webInfo.File = d:/zq/logs/web/info/info.log
log4j.appender.webInfo.layout = org.apache.log4j.PatternLayout
log4j.appender.webInfo.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.webInfo.Threshold = INFO
log4j.additivity.webInfo=false
## web error 日志##
log4j.logger.webError = error,webError
log4j.appender.webError = org.zq.core.common.util.log.MyDailyRollingFileAppender
log4j.appender.webError.File = d:/zq/logs/web/error/error.log
log4j.appender.webError.layout = org.apache.log4j.PatternLayout
log4j.appender.webError.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.webError.Threshold = ERROR
log4j.additivity.webError=false
测试代码
//this 在web模块下
Logger l = Logger.getLogger(this.getClass());
l.info("webInfo-------------------- 信息");
l.error("webError-------------- 信息");
//用core模块中的类来获取log对象
Logger core = Logger.getLogger(new org.zq.core.Test().getClass());
core.info("coreInfo -----------------------------------------------------------------信息");
core.error("coreError -----------------------------------------------------------------信息");
大功告成: