在实际应用中,要使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

② 配置日志信息输出目的地(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.ConsoleAppender
log4j.appender.Console.Threshold=DEBUG
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.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.log
log4j.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%n
log4j.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.DailyRollingFileAppender
log4j.appender.File.File=${catalina.base}/HNTOWER/hn_tower_check.log
log4j.appender.File.Threshold=INFO
log4j.appender.File.Append=true
log4j.appender.File.ImmediateFlush=true
log4j.appender.File.DatePattern=yyyy-MM-dd'.log'
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

产生日志如下图所示:

log4j配置使用详解与实例_日志文件


③ 配置日志信息的输出格式(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文件和行号。


④ 设置不同框架(不同包)的日志级别

示例如下:

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=DEBUG
log4j.logger.org.apache.myfaces=ERROR

log4j.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=DEBUG
log4j.logger.com.opensymphony.xwork2=ERROR

log4j.logger.freemarker=INFO
#log4j.logger.freemarker=DEBUG
#log4j.logger.freemarker=ERROR

log4j.logger.org.quartz=INFO
#log4j.logger.org.quartz=DEBUG
#log4j.logger.org.quartz=ERROR

log4j.logger.org.json=INFO
#log4j.logger.org.json=DEBUG
#log4j.logger.org.json=ERROR

log4j.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=ERROR
log4j.logger.org.apache.ibatis=DEBUG

#log4j.logger.org.mybatis.spring=INFO
log4j.logger.org.mybatis=DEBUG
log4j.logger.org.mybatis.spring=DEBUG
log4j.logger.org.mybatis.spring.mapper=DEBUG
#log4j.logger.org.mybatis.spring=ERROR

log4j.logger.org.activiti=INFO
#log4j.logger.org.activiti=DEBUG
#log4j.logger.org.activiti=ERROR

log4j.logger.oracle=INFO
#log4j.logger.oracle=DEBUG
#log4j.logger.oracle=ERROR

#设置自定义包的级别
#log4j.logger.com.web=INFO
log4j.logger.com.web=DEBUG
#log4j.logger.com.web=ERROR

log4j.logger.java.sql.Connection = DEBUG
log4j.logger.java.sql.Statement = DEBUG
log4j.logger.java.sql.PreparedStatement = DEBUG
log4j.logger.java.sql.ResultSet =ERROR
#log4j.logger.java.sql.ResultSet=DEBUG

⑤ 输出信息到单独文件

① 输入error信息到单独文件

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

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

② 输出自定义类到单独文件

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

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

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

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

log4j.logger.cn.com.Test= DEBUG, test

log4j.appender.test=org.apache.log4j.FileAppender

log4j.appender.test.File=${myweb.root}/WEB-INF/log/test.log

log4j.appender.test.layout=org.apache.log4j.PatternLayout

log4j.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, test1

log4j.appender.test1=org.apache.log4j.FileAppender

log4j.appender.test1.File=${myweb.root}/WEB-INF/log/test1.log

log4j.appender.test1.layout=org.apache.log4j.PatternLayout

log4j.appender.test1.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.logger.myTest2= DEBUG, test2

log4j.appender.test2=org.apache.log4j.FileAppender

log4j.appender.test2.File=${myweb.root}/WEB-INF/log/test2.log

log4j.appender.test2.layout=org.apache.log4j.PatternLayout

log4j.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

Log4j配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。

根配置如下

log4j.rootLogger=DEBUG,console,dailyFile,im
log4j.additivity.org.apache=true

【2】配置实例

① 控制台(console)

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

② 日志文件(logFile)


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

③ 回滚文件(rollingFile)

log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold=DEBUG
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=D:/logs/log.log4j
log4j.appender.rollingFile.MaxFileSize=200KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

④ 定期回滚日志文件(dailyFile)

log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=DEBUG
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=D:/logs/log.log4j
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

⑤ 应用于socket


log4j.appender.socket=org.apache.log4j.RollingFileAppender
log4j.appender.socket.RemoteHost=localhost
log4j.appender.socket.Port=5001
log4j.appender.socket.LocationInfo=true

⑥ 发送日志到指定邮件


log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=FATAL
log4j.appender.mail.BufferSize=10
log4j.appender.mail.From = xxx@mail.com
log4j.appender.mail.SMTPHost=mail.com
log4j.appender.mail.Subject=Log4J Message
log4j.appender.mail.To= xxx@mail.com
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

⑦ 应用于数据库


log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
log4j.appender.database.driver=com.mysql.jdbc.Driver
log4j.appender.database.user=root
log4j.appender.database.password=
log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
log4j.appender.database.layout=org.apache.log4j.PatternLayout
log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

⑧ 自定义Appender


log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

⑨ 项目配置实例

① 根据日期生成日志文件

完整实例如下:

log4j.rootLogger=INFO,console,file

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.SimpleLayout

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=../logs/ssm.log
log4j.appender.file.encoding=GBK
log4j.appender.file.DatePattern=yyyy-MM-dd'.log'
log4j.appender.file.Append=true
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c - %m%n

log4j.logger.com*=DEBUG
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug

生成日志文件效果如下:
log4j配置使用详解与实例_java_02