首页 > 代码库 > log4j配置输出到多个日志文件

log4j配置输出到多个日志文件

    通常我们项目里,有一些重要的日志想单独的输出到指定的文件,而不是全总输出到系统的日志文件里,那么我们log4j为我们提供了这样的功能,下面我们来一步一步看是怎么做的。这里以property的配置方式写,xml方式类似,想了解的,可以看官方文档。

这里测试的项目包结构如下:

log4j 主要由三部分组成:Loggers, Appenders 和Layouts,(appender 可以理解为输出的目的地)

咱们的log4j.properties或log4j.xml 里可以配置多个logger,

每个logger 可以对应多个Appender,而appender和layout是一一对应的。

下面看最简单的配置,我们配置系统rootLogger,如下:

<script src="https://code.csdn.net/snippets/425038.js" type="text/javascript"></script>
其中:
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方法输出来看看日志打印效果
<script src="https://code.csdn.net/snippets/425046.js" type="text/javascript"></script>
<script src="https://code.csdn.net/snippets/425047.js" type="text/javascript"></script>
 
配置多个appener的情况
  每个logger可以对应多个appender,如下配置:
<script src="https://code.csdn.net/snippets/425058.js" type="text/javascript"></script>
这样,当我们远行App时,日志会办出到控制台和mylog.log日志文件,这是就不再贴出来了。
配置多个logger 情况
  当我们需要对一些重要的日志进行抽取时,或系统中比较独立的模块,如专门与外部系统对接的接口,这时我们就可以配置多个logger,而实现日志分柝,便于我们的日常维护工作。我们下面在原来的基础上再增加两个logger ,分别为:“com.pt.test” 和“com.pt.test.intf”,命名都是用包名来定义的,看看详细的配置吧:
<script src="https://code.csdn.net/snippets/425108.js" type="text/javascript"></script>
我们注意到:新增加的两个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
<script src="https://code.csdn.net/snippets/425110.js" type="text/javascript"></script>
logfile2.log
<script src="https://code.csdn.net/snippets/425149.js" type="text/javascript"></script>
logfile3.log
<script src="https://code.csdn.net/snippets/425150.js" type="text/javascript"></script>
这时我们会发现,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:
<script src="https://code.csdn.net/snippets/425172.js" type="text/javascript"></script>
2、使用DailyRollingFileAppender ,这种模式是按时间来切割文件,可以细每种生成一个文件如:
<script src="https://code.csdn.net/snippets/425169.js" type="text/javascript"></script>
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目录下就可以了。
参考资料:http://logging.apache.org/log4j/1.2/manual.html