log4j日志分级输出到不同文件的配置

基础:log4j的配置项说明:

log4j总共有6中级别,从高到低分别为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。

其中:

DEBUG Level 指出细粒度信息事件对调试应用程序是非常有帮助的。

INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程。

WARN level表明会出现潜在错误的情形。

ERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行。

FATAL level指出每个严重的错误事件将会导致应用程序的退出。

ALL Level是最低等级的,用于打开所有日志记录。

OFF Level是最高等级的,用于关闭所有日志记录。

# log4j.rootLogger中配置的ERROR,表示一下配置的所有配置的级别的起点为:ERROR。即只能显示、存储ERROR以及ERROR以上级别的日志
# 若在此配置了ERROR,下边配置了INFO级别的日志要存储在指定的文件中,实际是不会存储的
# 若配置INFO级别的日志存在文件1中,ERROR级别的文件,存在文件2中,
# 若有个ERROR的日志的话,两个文件都是可以存储的;若有个INFO级别的文件的话,则只有文件1会存储该日志,文件2是不会存储的 

日志的输出格式配置:
# %m  输出代码中指定的消息
# %p  输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
# %r  输出自应用启动到输出该log信息耗费的毫秒数 
# %c  输出所属的类目,通常就是所在类的全名 
# %t  输出产生该日志事件的线程名 
# %n  输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n” 
# %d  输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日  22 : 10 : 28 , 921  
# %l  输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 ) 

一、所需的jar包

log4j-1.2.9.jar

commons-logging-1.0.4.jar

二、利用xml配置log4j

步骤:

1、在web.xml中,添加log4j监听器配置,所填内容如下(若直接将log.properties放在src目录下,则不需要配置监听)

 <context-param> 
  <param-name>log4jConfigLocation</param-name> 
  <param-value>/WEB-INF/config/log4j.xml</param-value> 
   </context-param> 
   
   <listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
   </listener>

2、在/WEB-INF/config/文件夹下,建立log4j.xml。log4j.xml的内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">   

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">

<!-- 日志输出格式 -->
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss}-[%p] [%l] %m%n"/>
</layout>
</appender>
<!--
<appender name="DEBUG" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/lin/log4j/debug.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss}-[%p] [%l] %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="DEBUG" />
</filter>
</appender>
-->
<appender name="INFO" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/lin/log4j/info.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="100MB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss}-[%p] [%l] %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>


<appender name="WARN" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/lin/log4j/warn.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="100MB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss}-[%p] [%l] %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>


<appender name="ERROR" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/lin/log4j/error.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="100MB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss}-[%p] [%l] %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>

<!-- 利用logger标签,可以自定义某个包下的日志,输出级别。这个不受最低输出级别的现在。例如:我最低级别设置的是error,但是我用logger标签,配置com.ever包下的日志输出级别为:info,经过测试,可以输出com.ever包下的各个级别的日志(当然不能低于logger标签配置的最低级别)-->
<logger name="com.ever">
<level value="INFO"></level>
</logger>
<root>

<!-- 配置最低输出级别为“info”,即只能输出info以及info以上级别的日志 -->
<priority value="info"/>
<appender-ref ref="STDOUT"/>
<!--
<appender-ref ref="DEBUG"/>
-->
<appender-ref ref="INFO"/>
<appender-ref ref="WARN"/>
<appender-ref ref="ERROR"/>
</root>
</log4j:configuration>

特别注意:如想只把log4j的debug信息输出到debug.log.error信息输出到error.log,info信息输出到info.log
必须使用xml方式进行配置才能够支持filter过滤元素。

properties方式可以用log4j.appender.IF.Threshold = INFO来限制输出级别,但是只能输出你配置的级别,以及比你所配置的级别大的级别。不能精确到只输出某个级别的日志。例如我们配置log4j.appender.IF.Threshold = INFO,则在输出文件输出数据INFO,以及WARN、ERROR、FATAL级别的日志,而不能只输出INFO级别的日志

在properties方式中,可以用如下配置现在输出级别,

log4j.appender.IF.filter.myrange=org.apache.log4j.varia.LevelRangeFilter 
log4j.appender.IF.filter.myrange.levelMax=INFO 
log4j.appender.IF.filter.myrange.levelMin=INFO 

但是实测,不能满足要求。

3、在class类中使用log4j

package com.tianze.jmsn.test;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
public class TestLogger {
    static Logger logger = Logger.getLogger(TestLogger.class.getName());
    public static void main(String[] s){
           DOMConfigurator.configureAndWatch("D://log4j.xml");  //模拟导入log4j.xml配置文件,在实际中,要用web.xml中配置log4j监听
            logger.debug("----logger debug ----");
            logger.info("----logger info ----");
            logger.warn("----logger warn ----");
            logger.error("----logger errors ----");
            logger.fatal("----logger fatal ----");
    }

}

4、输出结果:

d:/lin/log4j/debug.log 中,输出:----logger debug ----

d:/lin/log4j/infor.log 中,输出:----logger info ----

d:/lin/log4j/error.log 中,输出:----logger error ----

d:/lin/log4j/fatal.log 中,输出:----logger fatal ----

三、利用properties方式配置

1、在web.xml中配置监听(若直接将log.properties放在src目录下,则不需要配置监听)

 <context-param> 
   <param-name>log4jConfigLocation</param-name> 
   <param-value>/WEB-INF/config/log4j.properties</param-value> 
   </context-param> 
   
   <listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
   </listener>

2、在/WEB-INF/config/文件夹下,建立log4j.properties配置文件,配置文件内容如下:

###############################################################################

#定义最低输出基本为INFO, 

#定义各输出设备的名字:

#stdout表示控制台输出;

#INFOF表示info级别的日志输出

#WARNF表示warn级别的日志输出

#ERRORF表示error级别的日志输出

#FATALF表示fatal级别的日志输出


log4j.rootLogger = INFO, stdout, INFOF, WARNF, ERRORF


### 输出到控制台 ###
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{yyyy-MM-dd HH:mm:ss}-[%p] [%l] %m%n


## 输出到日志文件,每天生成一个日志,配置log4j.appender.IF.Threshold = INFO,实际是INFO或者INFO以上级别的日志,都会记录在该文件中 ###
log4j.appender.INFOF = org.apache.log4j.DailyRollingFileAppender
log4j.appender.INFOF.File = d:/lin/log4j/info.log
log4j.appender.INFOF.Append = true

#定义日志输出级别,该日志文件中,可输出INFO、WARN、ERROR、FATAL级别的文件
log4j.appender.INFOF.Threshold = INFO
log4j.appender.INFOF.layout = org.apache.log4j.PatternLayout
#后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
log4j.appender.EF.MaxFileSize=100MB
#指定可以产生的滚动文件的最大数。
log4j.appender.INFOF.MaxBackupIndex=2

#配置级别拦截,其中myrange为拦截器的名字,这个必须要有(暂时不好用,原因为查明)
#log4j.appender.INFOF.filter.myrange=org.apache.log4j.varia.LevelRangeFilter 
#log4j.appender.INFOF.filter.myrange.levelMax=INFO 
#log4j.appender.INFOF.filter.myrange.levelMin=INFO 
log4j.appender.IF.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}-[%p] [%l] %m%n


### 保存异常信息到单独文件,每天生成一个日志,其中log4j.appender.EF.Threshold = ERROR,表示ERROR以及ERROR以上级别的日志,要记录在该文件中 ###
log4j.appender.WARNF= org.apache.log4j.DailyRollingFileAppender
log4j.appender.WARNF.File = d:/lin/log4j/warn.log 
log4j.appender.WARNF.Append = true

#定义日志输出级别,该日志文件中,可输出WARN、ERROR、FATAL级别的文件
log4j.appender.WARNF.Threshold = WARN
log4j.appender.WARNF.layout = org.apache.log4j.PatternLayout
# 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
log4j.appender.WARNF.MaxFileSize=100MB
#指定可以产生的滚动文件的最大数。
log4j.appender.WARNF.MaxBackupIndex=2

#配置级别拦截,其中myrange为拦截器的名字,这个必须要有(暂时不好用,原因为查明)
#log4j.appender.WARNF.filter.myrange=org.apache.log4j.varia.LevelRangeFilter 
#log4j.appender.WARNF.filter.myrange.levelMax=WARN
#log4j.appender.ERRORF.filter.myrange.levelMin=WARN
log4j.appender.ERRORF.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}-[%p] [%l] %m%n


### 保存异常信息到单独文件,每天生成一个日志,其中log4j.appender.EF.Threshold = ERROR,表示ERROR以及ERROR以上级别的日志,要记录在该文件中 ###
log4j.appender.ERRORF = org.apache.log4j.DailyRollingFileAppender
log4j.appender.ERRORF.File = d:/lin/log4j/error.log 
log4j.appender.ERRORF.Append = true

#定义日志输出级别,该日志文件中,可输出WARN、ERROR、FATAL级别的文件
log4j.appender.ERRORF.Threshold = ERROR 
log4j.appender.ERRORF.layout = org.apache.log4j.PatternLayout
# 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
log4j.appender.EF.MaxFileSize=100MB
#指定可以产生的滚动文件的最大数。
log4j.appender.ERRORF.MaxBackupIndex=2

#配置级别拦截,其中myrange为拦截器的名字,这个必须要有(暂时不好用,原因为查明)
#log4j.appender.ERRORF.filter.myrange=org.apache.log4j.varia.LevelRangeFilter 
#log4j.appender.ERRORF.filter.myrange.levelMax=ERROR 
#log4j.appender.ERRORF.filter.myrange.levelMin=ERROR 
log4j.appender.ERRORF.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}-[%p] [%l] %m%n


3、在class类中使用

package com.tianze.jmsn.test;
import org.apache.log4j.Logger;
public class TestLogger {
    static Logger logger = Logger.getLogger(TestLogger.class.getName());
    public static void main(String[] s){
            logger.debug("----logger debug ----");
            logger.info("----logger info ----");
            logger.warn("----logger warn ----");
            logger.error("----logger errors ----");
            logger.fatal("----logger fatal ----");
    }

}


4、输出结果:

d:/lin/log4j/infor.log 中,输出:

    ----logger info ----

    ----logger warn ----

    ----logger error ----

d:/lin/log4j/warn.log 中,输出:

   ----logger warn ----

   ----logger error ----

d:/lin/log4j/error.log 中,输出:

   ----logger error ----


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值