在实际应用中,要使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
产生日志如下图所示:
③ 配置日志信息的输出格式(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
生成日志文件效果如下: