log4j配置讲解

来源:互联网 发布:哈尔滨网络公安局 编辑:程序博客网 时间:2024/05/20 21:43

在实际应用中,要使Log4j在系统中运行须事先设定配置文件。配置文件事实上也就是对Logger、Appender及Layout进行相应设定。

Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties属性文件。

下面以properties属性文件为例介绍log4j.properties的配置。


【1】配置根Logger:

语法格式如下:

log4j.rootLogger = [ level ] , appenderName1, appenderName2, …

log4j.additivity.org.apache=false:表示Logger不会在父Logger的appender里输出,默认为true。

level :设定日志记录的最低级别。

appenderName:就是指定日志信息要输出到哪里。可以同时指定多个输出目的地,用逗号隔开。

示例如下:

log4j.rootLogger=info,Console,File

【2】配置日志信息输出目的地(appender)

语法格式如下:

log4j.appender.appenderName = className

appenderName:自定义appderName,在log4j.rootLogger设置中使用;

className:可设值如下:

(1)org.apache.log4j.ConsoleAppender(控制台)(2)org.apache.log4j.FileAppender(文件)(3)org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)(4)org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)(5)org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

(1)ConsoleAppender选项:

Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。

ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。

Target=System.err:默认值是System.out。

示例如下:

log4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.Threshold=DEBUGlog4j.appender.Console.Target=System.outlog4j.appender.Console.layout=org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

(2)FileAppender选项:

Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。

ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。

Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。

File=${catalina.base}/mylog/appsys.log:指定当前消息输出到appsys.log文件中。

示例如下:

log4j.appender.logFile=org.apache.log4j.FileAppender log4j.appender.logFile.Threshold=DEBUG log4j.appender.logFile.ImmediateFlush=true log4j.appender.logFile.Append=true log4j.appender.logFile.File=D:/logs/log.log4j log4j.appender.logFile.layout=org.apache.log4j.PatternLayout log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) –> [%t] %l: %m %x %n

(3)RollingFileAppender选项:

Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。

ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。

Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。

File=${catalina.base}/logs/appsys.log:指定消息输出到appsys.log文件中。

MaxFileSize=100KB:后缀可以是KB, MB 或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j.1文件中。

MaxBackupIndex=2:指定可以产生的滚动文件的最大数。

例如,设为2则可以产生logging.log4j.1,logging.log4j.2两个滚动文件和一个logging.log4j文件。当第二个日志文件达到最大值,第一个日志文件将被删除,之后所有的日志信息将被回滚到第一个日志文件。

示例如下:

log4j.appender.R.File=${catalina.base}/logs/appsys.loglog4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.MaxFileSize=5000KB log4j.appender.R.MaxBackupIndex=8 log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %t %c - %m%nlog4j.appender.R=org.apache.log4j.RollingFileAppender 

(4)DailyRollingFileAppender选项:

Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。

ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。

Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。

File=${catalina.base}/mylog/appsys.log:指定当前消息输出到appsys.log文件中。

DatePattern=’.’yyyy-MM:每月滚动一次日志文件,即每月产生一个新的日志文件。当前月的日志文件名为lappsys.log,前一个月的日志文件名为appsys.log.yyyy-MM。

另外,也可以指定按周、天、时、分等来滚动日志文件,对应的格式如下:
1)’.’yyyy-MM:每月
2)’.’yyyy-ww:每周
3)’.’yyyy-MM-dd:每天
4)’.’yyyy-MM-dd-a:每天两次
5)’.’yyyy-MM-dd-HH:每小时
6)’.’yyyy-MM-dd-HH-mm:每分钟

示例如下:

log4j.appender.File=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.File.File=${catalina.base}/HNTOWER/hn_tower_check.loglog4j.appender.File.Threshold=INFOlog4j.appender.File.Append=truelog4j.appender.File.ImmediateFlush=truelog4j.appender.File.DatePattern=yyyy-MM-dd'.log'log4j.appender.File.layout=org.apache.log4j.PatternLayoutlog4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

产生日志如下图所示:

这里写图片描述


【3】配置日志信息的输出格式(Layout):

语法格式如下:

log4j.appender.appenderName.layout=className

className:可设值如下:

(1)org.apache.log4j.HTMLLayout(以HTML表格形式布局)(2)org.apache.log4j.PatternLayout(可以灵活地指定布局模式)(3)org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)(4)org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

(1)HTMLLayout选项:

LocationInfo=true:输出java文件名称和行号,默认值是false。
Title=My Logging: 默认值是Log4J Log Messages。

(2)PatternLayout选项:

ConversionPattern=%m%n:设定以怎样的格式显示消息。

(3)XMLLayout选项:

LocationInfo=true:默认值是false,输出java文件和行号。


【4】设置不同框架(不同包)的日志级别

示例如下:

log4j.logger.org.hibernate=INFO#log4j.logger.org.hibernate=ERROR#log4j.logger.org.hibernate=DEBUG#log4j.logger.org.apache=INFO#log4j.logger.org.apache=DEBUG#log4j.logger.org.apache=ERROR#log4j.logger.org.apache.struts2=INFO#log4j.logger.org.apache.myfaces=INFO#log4j.logger.org.apache.myfaces=DEBUGlog4j.logger.org.apache.myfaces=ERRORlog4j.logger.org.springframework=INFO#log4j.logger.org.springframework=DEBUG#log4j.logger.org.springframework=ERROR#log4j.logger.com.opensymphony.xwork2=INFO#log4j.logger.com.opensymphony.xwork2=INFO#log4j.logger.com.opensymphony.xwork2.config=DEBUGlog4j.logger.com.opensymphony.xwork2=ERRORlog4j.logger.freemarker=INFO#log4j.logger.freemarker=DEBUG#log4j.logger.freemarker=ERRORlog4j.logger.org.quartz=INFO#log4j.logger.org.quartz=DEBUG#log4j.logger.org.quartz=ERRORlog4j.logger.org.json=INFO#log4j.logger.org.json=DEBUG#log4j.logger.org.json=ERRORlog4j.logger.javax.faces=INFO#log4j.logger.javax.faces=DEBUG#log4j.logger.javax.faces=ERROR#log4j.logger.org.apache.ibatis=INFO,debug,stdout #log4j.logger.org.apache.ibatis=DEBUG#log4j.logger.org.apache.ibatis=ERRORlog4j.logger.org.apache.ibatis=DEBUG#log4j.logger.org.mybatis.spring=INFOlog4j.logger.org.mybatis=DEBUGlog4j.logger.org.mybatis.spring=DEBUGlog4j.logger.org.mybatis.spring.mapper=DEBUG#log4j.logger.org.mybatis.spring=ERRORlog4j.logger.org.activiti=INFO#log4j.logger.org.activiti=DEBUG#log4j.logger.org.activiti=ERRORlog4j.logger.oracle=INFO#log4j.logger.oracle=DEBUG#log4j.logger.oracle=ERROR#设置自定义包的级别#log4j.logger.com.web=INFOlog4j.logger.com.web=DEBUG#log4j.logger.com.web=ERRORlog4j.logger.java.sql.Connection = DEBUGlog4j.logger.java.sql.Statement = DEBUGlog4j.logger.java.sql.PreparedStatement = DEBUGlog4j.logger.java.sql.ResultSet =ERROR #log4j.logger.java.sql.ResultSet=DEBUG

【5】输出信息到单独文件

【1】输入error信息到单独文件

即,根据级别划分,将error日志输出到单独文件。

log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = logs/error.log ## 异常日志文件名log4j.appender.D.Append = truelog4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!log4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

【2】输出自定义类到单独文件

即,将指定类的日志输出到单独文件。

如果想对不同的类输出不同的文件(以cn.com.Test为例),先要在Test.java中定义:

private static Log logger = LogFactory.getLog(Test.class);

然后在log4j.properties中加入如下配置(以类的全类名作为logger自定义名字):

log4j.logger.cn.com.Test= DEBUG, testlog4j.appender.test=org.apache.log4j.FileAppenderlog4j.appender.test.File=${myweb.root}/WEB-INF/log/test.loglog4j.appender.test.layout=org.apache.log4j.PatternLayoutlog4j.appender.test.layout.ConversionPattern=%d %p [%c] - %m%n

也就是让cn.com.Test中的logger使用log4j.appender.test所做的配置。


但是,如果在同一类中需要输出多个日志文件呢?

其实道理是一样的,先在Test.java中定义:

private static Log logger1 = LogFactory.getLog("myTest1");private static Log logger2 = LogFactory.getLog("myTest2");

然后在log4j.properties中加入如下配置(这里注意logger自定义名字和appender自定义名字):

log4j.logger.myTest1= DEBUG, test1log4j.appender.test1=org.apache.log4j.FileAppenderlog4j.appender.test1.File=${myweb.root}/WEB-INF/log/test1.loglog4j.appender.test1.layout=org.apache.log4j.PatternLayoutlog4j.appender.test1.layout.ConversionPattern=%d %p [%c] - %m%nlog4j.logger.myTest2= DEBUG, test2log4j.appender.test2=org.apache.log4j.FileAppenderlog4j.appender.test2.File=${myweb.root}/WEB-INF/log/test2.loglog4j.appender.test2.layout=org.apache.log4j.PatternLayoutlog4j.appender.test2.layout.ConversionPattern=%d %p [%c] - %m%n

也就是在用logger时给它一个自定义的名字(如这里的”myTest1”),然后在log4j.properties中做出相应配置即可。

别忘了不同日志要使用不同的logger(如输出到test1.log的要用logger1.info(“abc”))。


还有一个问题,就是这些自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的,如何能只让它们输出到自己指定的日志中呢?

别急,这里有个开关:

log4j.additivity.myTest1 = false

它用来设置是否同时输出到log4j.rootLogger所配置的日志中,设为false就不会输出到其它地方!

注意这里的”myTest1”是你在程序中给logger起的那个自定义的名字!


如果你说,我只是不想同时输出这个日志到log4j.rootLogger所配置的logfile中,console里我还想同时输出呢!

那也好办,把你的

log4j.logger.myTest1 = DEBUG, test1

改为

log4j.logger.myTest1=DEBUG, test1,console