一、简单了解commons-logging和log4j的区别和联系
commons-logging可以简单理解为通用的log封装,可以使用自己的简单实现SimpleLog,也可以使用log4j或其他log组件实现,通常我们在项目中使用commons-logging进行日志记录,便于日志解耦,如下所示:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
private static final Log log = LogFactory.getLog(A.class);
...
log.debug(debuginfo);
log.error(errmsg);
从代码中可以看出,我们应用的是commons-logging,那么它如何查找合适的日志组件呢?
1) 首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
2) 如果找不到commons-logging.properties文件,则再查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;
3) 否则,查看classpath中是否有Log4j的包,如果发现,则使用Log4j作为日志实现类;
4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;
由于项目中有log4j.jar,所以commons-logging选择log4j为其实现类。
二、Spring log4j配置
Spring 对 log4j 提供了很好的支持,并提供了 Log4jConfigListener 用于 log4j 配置文件的初始化。如果设置了log4jRefreshInterval,spring容器会定时扫描log4j.properties,并刷新配置。
1、 web.xml 文件添加下述配置
<!— 设置 web 应用的 key ,通常为应用名称,在同一应用服务器下若部署了多个应用,那么此配置必须唯一 -->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>web-app</param-value>
</context-param>
<!— 设置 log4j.properties 的路径 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param >
<!— 设置刷新时间间隔 -->
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>10000</param-value>
</context-param>
2、 log4j.properties 配置
log4j.rootLogger=debug,stdout
log4j.logger.org=info,orgLog
#log4j.appender.stdout config
log4j.appender.stdout= org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout= org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d %p [%c] - %m%n
#tomcatLogFile config
log4j.appender.orgLog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.orgLog.File= ${web-app} /logs/org_
log4j.appender.orgLog.DatePattern= yyyy-MM-dd'.log'
log4j.appender.orgLog.layout= org.apache.log4j.PatternLayout
log4j.appender.orgLog.layout.ConversionPattern= %d{yyyy-MM-dd HH : mm:ss} %p [%c] - %m%n
debug及以上级别log都会在stdout输出,包名是org开头的java类的info及以上级别都会输出到org_年月日.log文件,org_年月日.log是每天轮询产生的日志文件。orgLog文件目录为${web-app} /logs/,其中${web-app}为环境变量。
3、${web-app}环境变量处理
可以配置一个Listener,在Spring-Mvc的ContextLoaderListener前设置${web-app}即可,如下:
System.setProperty("web-app", "d:/appcache");
三、不同package、日志级别输出到不同文件配置
1、应用场景描述,项目需要每天产生3个日志文件,分别是:
1)通用日志,记录用户的所有操作,info级别;
2)性能监控日志,记录执行时间超过1秒种的所有service方法,warn级别;
3)错误日志,记录系统所有错误,error级别;
2、项目结构
1)项目所有类都在cc.marcus.*包下;
2)用户通用操作日志log.info(),性能监控日志log.warn(),错误日志log.error()
3、log4j配置如下:
log4j.rootLogger=debug,stdout
log4j.logger.cc.marcus=info,infoLog,warnLog,errorLog
#log4j.appender.stdout config
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
#infoLog config
log4j.appender.infoLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.infoLog.Threshold=INFO
log4j.appender.infoLog.File=${web-app}/logs/info_
log4j.appender.infoLog.DatePattern=yyyy-MM-dd'.log'
log4j.appender.infoLog.layout=org.apache.log4j.PatternLayout
log4j.appender.infoLog.layout.ConversionPattern=%d{yyyy-MM-dd HH : mm:ss} %p [%c] - %m%n
#warnLog log config
log4j.appender.warnLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warnLog.Threshold=WARN
log4j.appender.warnLog.File=${web-app}/logs/process_
log4j.appender.warnLog.DatePattern=yyyy-MM-dd'.log'
log4j.appender.warnLog.layout=org.apache.log4j.PatternLayout
log4j.appender.warnLog.layout.ConversionPattern=%d{yyyy-MM-dd HH : mm:ss} %p [%c] - %m%n
#error log config
log4j.appender.errorLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorLog.Threshold=ERROR
log4j.appender.errorLog.File=${web-app}/logs/error_
log4j.appender.errorLog.DatePattern=yyyy-MM-dd'.log'
log4j.appender.errorLog.layout=org.apache.log4j.PatternLayout
log4j.appender.errorLog.layout.ConversionPattern=%d{yyyy-MM-dd HH : mm:ss} %p [%c] - %m%n
由于DailyRollingFileAppender会输出大于等于指定级别,所以infoLog会包含info,warn,error log,warnLog会包含warn、error Log,只要重写DailyRollingFileAppender即可,代码如下:
package com.marcus.log;
import org.apache.log4j.Priority;
import org.apache.log4j.DailyRollingFileAppender;
public class MyRollingFileAppender extends DailyRollingFileAppender {
@Override
public boolean isAsSevereAsThreshold(Priority priority) {
return this.getThreshold().equals(priority);
}
}
将上述配置文件中的org.apache.log4j.DailyRollingFileAppender替换成com.marcus.log.MyRollingFileAppender即可!