Spring log4j配置 不同package、日志级别生成不同日志文件

一、简单了解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即可!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值