基础: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 ----