通常我们项目里,有一些重要的日志想单独的输出到指定的文件,而不是全总输出到系统的日志文件里,那么我们log4j为我们提供了这样的功能,下面我们来一步一步看是怎么做的。这里以property的配置方式写,xml方式类似,想了解的,可以看官方文档。
这里测试的项目包结构如下:
log4j 主要由三部分组成:Loggers, Appenders 和Layouts,(appender 可以理解为输出的目的地)
咱们的log4j.properties或log4j.xml 里可以配置多个logger,
每个logger 可以对应多个Appender,而appender和layout是一一对应的。
下面看最简单的配置,我们配置系统rootLogger,如下:
### rootLogger config log4j.rootLogger=debug,A_console log4j.appender.A_console=org.apache.log4j.ConsoleAppender log4j.appender.A_console.layout=org.apache.log4j.PatternLayout log4j.appender.A_console.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
其中:
1、log4j.rootLogger 这个的配置三模式为:log4j.rootLogger=level,appender1,appender2,...
level为日志等级,关系如:DEBUG < INFO < WARN < ERROR < FATAL,等级越小可以输出比自己大的日志,如设置为debug,可以输出warn,error,等的日志。
而紧跟在后面的是appender列表:appender1,appender2,...
2、log4j.appender.A_console=org.apache.log4j.ConsoleAppender 指定对应的appender类,这是输出到控制台。
3、log4j.appender.A_console.layout=org.apache.log4j.PatternLayout ,指定layout类,
4、log4j.appender.A_console.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 输出格式化,具体怎么使用可以查询PatternLayout 这个api。
我们用一个main方法输出来看看日志打印效果
package com.pt.test; import java.io.InputStream; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import com.pt.Tool; /** * @author mzy * */ public class App { static Logger logger = Logger.getLogger(App.class); /** * @param args */ public static void main(String[] args) { //BasicConfigurator.configure(); InputStream in = App.class.getClassLoader().getResourceAsStream("log4j.properties"); PropertyConfigurator.configure(in); //DOMConfigurator ==>log4j.xml logger.debug(" this is main.1."); logger.warn(" testing warn..."); Tool t = new Tool(); t.doWork(); } } class Tool { static Logger logger = Logger.getLogger(Tool.class); public void doWork(){ logger.debug(" this is tool run method.."); } }
2014-07-12 09:51:19,554 [main] DEBUG com.pt.test.App - this is main.1. 2014-07-12 09:51:19,555 [main] WARN com.pt.test.App - testing warn... 2014-07-12 09:51:19,556 [main] DEBUG com.pt.Tool - this is tool run method..
配置多个appener的情况
每个logger可以对应多个appender,如下配置:
### rootLogger config log4j.rootLogger=debug,A_console,A_file ## first appender is A_console log4j.appender.A_console=org.apache.log4j.ConsoleAppender log4j.appender.A_console.layout=org.apache.log4j.PatternLayout log4j.appender.A_console.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ## second appender is A_file log4j.appender.A_file=org.apache.log4j.FileAppender log4j.appender.A_file.file=D:/test/mylog.log log4j.appender.A_file.layout=org.apache.log4j.PatternLayout log4j.appender.A_file.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ### end rootLogger config
这样,当我们远行App时,日志会办出到控制台和mylog.log日志文件,这是就不再贴出来了。
配置多个logger 情况
当我们需要对一些重要的日志进行抽取时,或系统中比较独立的模块,如专门与外部系统对接的接口,这时我们就可以配置多个logger,而实现日志分柝,便于我们的日常维护工作。我们下面在原来的基础上再增加两个logger ,分别为:“com.pt.test” 和“com.pt.test.intf”,命名都是用包名来定义的,看看详细的配置吧:
### rootLogger config log4j.rootLogger=debug,A_console,A_file ## first appender is A_console log4j.appender.A_console=org.apache.log4j.ConsoleAppender log4j.appender.A_console.layout=org.apache.log4j.PatternLayout log4j.appender.A_console.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ## second appender is A_file log4j.appender.A_file=org.apache.log4j.FileAppender log4j.appender.A_file.file=D:/test/logfile1.log log4j.appender.A_file.layout=org.apache.log4j.PatternLayout log4j.appender.A_file.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ### end rootLogger config ### logger [com.pt.test] config log4j.logger.com.pt.test=debug,A_file2 #log4j.additivity.com.pt.test=false log4j.appender.A_file2=org.apache.log4j.FileAppender log4j.appender.A_file2.file=D:/test/logfile2.log log4j.appender.A_file2.layout=org.apache.log4j.PatternLayout log4j.appender.A_file2.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ### logger [com.pt.test] config ### logger [com.pt.test.intf] config log4j.logger.com.pt.test.intf=debug,A_file3 log4j.appender.A_file3=org.apache.log4j.FileAppender log4j.appender.A_file3.file=D:/test/logfile3.log log4j.appender.A_file3.layout=org.apache.log4j.PatternLayout log4j.appender.A_file3.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ### end serviceLogger config
我们注意到:新增加的两个logger 配置为:
log4j.logger.
com.pt.test=debug,A_file2
日志输出到:D:/test/logfile2.log
log4j.logger.
com.pt.test.intf=debug,A_file3
日志输出到:D:/test/logfile3.log
我们看看三个文件的日志输出内容:
logfile1.log
2014-07-12 11:22:36,284 [main] DEBUG com.pt.test.App - this is main.1. 2014-07-12 11:22:36,285 [main] WARN com.pt.test.App - testing warn... 2014-07-12 11:22:36,286 [main] DEBUG com.pt.Tool - this is tool run method.. 2014-07-12 11:22:36,287 [main] DEBUG com.pt.test.intf.ParseService - this ParseService log.....
logfile2.log
2014-07-12 11:22:36,284 [main] DEBUG com.pt.test.App - this is main.1. 2014-07-12 11:22:36,285 [main] WARN com.pt.test.App - testing warn... 2014-07-12 11:22:36,287 [main] DEBUG com.pt.test.intf.ParseService - this ParseService log.....
logfile3.log
2014-07-12 11:22:36,287 [main] DEBUG com.pt.test.intf.ParseService - this ParseService log.....
这时我们会发现,filelog1,filelog2,filelog3都有打印了日志内容,细心的朋友应该会发现,filelog1里包含了filelog2里的所有内容,默认情况下,子Logger会的日志会向所有父级的appender输出,如果我们不想要这样的输出那么我们可以把对应的Looger的additivity属性设置为false就可以了,如:把第17行注释打开log4j.additivity.com.pt.test=false
这样,rootLogger就不会再有Logger "com.pt.test" 及其子包里的日志了。
滚动生成日志文件的两种模式:
1、使用
RollingFileAppender ,这种模式为以大小为基准生成日志文件,配置maxFileSize来限定每个文件大小,当超出指定大小,系统会自动生成下一个文件,
如下面面所示的appender:
log4j.appender.A_roll=org.apache.log4j.RollingFileAppender log4j.appender.A_roll.file=D:/test/rollFile.log log4j.appender.A_roll.maxFileSize=1KB log4j.appender.A_roll.layout=org.apache.log4j.PatternLayout log4j.appender.A_roll.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
2、使用DailyRollingFileAppender ,这种模式是按时间来切割文件,可以细每种生成一个文件如:
log4j.appender.A_r_date=org.apache.log4j.DailyRollingFileAppender log4j.appender.A_r_date.file=D:/test/rollFiledate.log log4j.appender.A_r_date.datePattern='.'yyyy-MM-dd-HH-mm'.log' log4j.appender.A_r_date.layout=org.apache.log4j.PatternLayout log4j.appender.A_r_date.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.A_r_date.datePattern='.'yyyy-MM-dd-HH-mm'.log' 表示每分钟就会生成一个日志文件如:
rollFiledate.log.2014-07-12-14-09.log rollFiledate.log.2014-07-12-14-10.log
如果想配置每天一个日志文件则可以:log4j.appender.A_r_date.datePattern='.'yyyy-MM-dd'.log'
web 项目中使用log4j
我把只要把写好的log4j.properties 放到src目录下就可以了。