分享

log4j的2.6.2版本properties配置文件的使用举例

 我的java之路 2016-11-28

【写作动机】

  log4j是由apache基金会开发的开源日志组件,是用来记录日志文件的一套API,截止发文当天(2016/09/28)的最新版为v2.6.2版。与传统1.2版相比,新版log4j在properties配置文件的具体使用上解释不多,网上相关资料也很少。下面结合示例略作说明,希望起到理清思路、抛砖引玉的作用。

【官网文档参考】

  配置log4j的2.x版可以通过以下4中方式实现:

(1)通过xml格式、json格式、yaml格式或properties格式的配置文件的方式;
(2)通过编程,创建ConfigurationFactory和实现Configuration接口的方式;
(3)通过编程,调用Configuration接口现成的各类API来向默认配置方式添加其他部件的方式;
(4)通过编程,调用内部Logger类方法的方式。

  这里重点介绍properties格式的配置文件在使用时的注意事项。

  log4j组件2.4以后的版本已经能够支持.properties格式的配置文件,只是语法结构上与1.2版有所不同。新版properties格式配置文件与其他格式(XML格式、JSON格式文件等)一样,配置的主要任务是完成对各类插件及其属性的定义。

  在2.6版之前——
   (1)properties配置文件需要在首行列出定义的各类输出源(appenders)、过滤器(filters)及记录器(loggers)的名称,并以逗号隔开,其后又需要按需要定义的组件与名称联系起来,以键值对【某属性=某值】的方式,成组地定义具体的属性值。
   (2)值得注意的是,名称并不需要逐一成组地指定属性值,但必须保证下面列出的所有属性及属性值具有唯一性。如果没有列出由逗号分隔的一组定义名称,那么这些名称中就不能出现半角英文句点符号'.'。
   (3)此外,每一个独立的组件必须包含一个特定的type属性,以指明该组件对应的插件类型(Plugin type)。

  从2.6版开始,这样的定义名称列表不再强制列出,因为名称通常可以在首次使用时推断出来。但如果确实需要定义更复杂的名称,建议还是使用名称列表。列表一旦列出便会生效。

  与基础部分的配置不同,在创建子部件时,不能在某个元素上指定一系列名称,而必须像下面举例说明的RollingFileAppender那样,在定义其多个策略(policies)的值时,必须先定义一个policies属性对应的包装元素(wrapper element):appender.rolling.policies.type = Policies,然后再在它下面定义两个子部件(TimeBasedTriggeringPolicy和SizeBasedTriggeringPolicy)各具体属性的值。

  此外,properties配置文件还支持如下属性:advertiser、monitorInterval、name、packages、shutdownHook、status和verbose。

官方示例:RollingFileAppender的properties示例配置文件如下:

[plain] view plain copy
  1. status = error  
  2. name = PropertiesConfig  
  3.    
  4. property.filename = target/rolling/rollingtest.log  
  5.    
  6. filter.threshold.type = ThresholdFilter  
  7. filter.threshold.level = debug  
  8.    
  9. appender.console.type = Console  
  10. appender.console.name = STDOUT  
  11. appender.console.layout.type = PatternLayout  
  12. appender.console.layout.pattern = %m%n  
  13.    
  14. appender.rolling.type = RollingFile  
  15. appender.rolling.name = RollingFile  
  16. appender.rolling.fileName = ${filename}  
  17. appender.rolling.filePattern = target/rolling2/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz  
  18. appender.rolling.layout.type = PatternLayout  
  19. appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n  
  20. appender.rolling.policies.type = Policies  
  21. appender.rolling.policies.time.type = TimeBasedTriggeringPolicy  
  22. appender.rolling.policies.time.interval = 2  
  23. appender.rolling.policies.time.modulate = true  
  24. appender.rolling.policies.size.type = SizeBasedTriggeringPolicy  
  25. appender.rolling.policies.size.size=100MB  
  26. appender.rolling.strategy.type = DefaultRolloverStrategy  
  27. appender.rolling.strategy.max = 5  
  28.    
  29. appender.list.type = List  
  30. appender.list.name = List  
  31. appender.list.filter.threshold.type = ThresholdFilter  
  32. appender.list.filter.threshold.level = error  
  33.    
  34. logger.rolling.name = com.example.my.app  
  35. logger.rolling.level = debug  
  36. logger.rolling.additivity = false  
  37. logger.rolling.appenderRef.rolling.ref = RollingFile  
  38.    
  39. rootLogger.level = info  
  40. rootLogger.appenderRef.stdout.ref = STDOUT  

  由于缺乏更详细的说明,也不能与RollingFileAppender的xml格式配置文件作对比,上述properties格式内容理解起来难度较大。为便于比较,先列出1.2版常规的properties配置文件,文件名为log4j.properties,要求根日志级别为debug,配置两个输出目的地,一个到控制台,级别为debug,一个到日志文件,级别为error,文件完整路径为e:\propertiesTest.log:

[plain] view plain copy
  1. log4j.rootLogger=debug,a,b  
  2.   
  3. log4j.appender.a=org.apache.log4j.ConsoleAppender  
  4. log4j.appender.a.Threshold=debug  
  5. log4j.appender.a.target=System.out  
  6. log4j.appender.a.layout=org.apache.log4j.PatternLayout  
  7. log4j.appender.a.layout.ConversionPattern=%m%n  
  8.   
  9. log4j.appender.b=org.apache.log4j.FileAppender  
  10. log4j.appender.b.Threshold=error  
  11. log4j.appender.b.ImmediateFlush=true  
  12. log4j.appender.b.File=e:\\propertiesTest.log  
  13. log4j.appender.b.Append=true  
  14. log4j.appender.b.layout=org.apache.log4j.PatternLayout  
  15. log4j.appender.b.layout.ConversionPattern=%d -%m%n  
  最新的log4j2.properties文件代码如下:

[plain] view plain copy
  1. status = warn  
  2. name = MyApp  
  3.   
  4. appender.console.type = Console  
  5. appender.console.name = consoleLogDemo  
  6. appender.console.filter.threshold.type = ThresholdFilter  
  7. appender.console.filter.threshold.level = debug  
  8. appender.console.layout.type = PatternLayout  
  9. appender.console.layout.pattern = %m%n  
  10. appender.console.target = System_out  
  11.   
  12. appender.rolling.type = File  
  13. appender.rolling.name = fileLogDemo  
  14. appender.rolling.filter.threshold.type = ThresholdFilter  
  15. appender.rolling.filter.threshold.level = error  
  16. appender.rolling.layout.type = PatternLayout  
  17. appender.rolling.layout.pattern = %d-%m%n  
  18. appender.rolling.append = true  
  19. appender.rolling.fileName = e:\\propertiesTest.log  
  20.   
  21. rootLogger.level = debug  
  22. rootLogger.appenderRef.consolelogdemo.ref = consoleLogDemo  
  23. rootLogger.appenderRef.filelogdemo.ref = fileLogDemo  

  与之对比的log4j2.xml文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE xml>  
  2. <Configuration status="warn" name="MyApp">  
  3.     <appenders>  
  4.         <Console name="consoleLogDemo" target="SYSTEM_OUT">  
  5.             <ThresholdFilter level="debug"/>  
  6.             <PatternLayout pattern="%m%n" />  
  7.         </Console>  
  8.           
  9.         <File name="fileLogDemo" fileName="e:\\propertiesTest.log" append="true">  
  10.             <ThresholdFilter level="error" />  
  11.             <PatternLayout pattern="%d-%m%n" />  
  12.         </File>  
  13.     </appenders>  
  14.            
  15.     <loggers>  
  16.         <root level="debug">  
  17.             <appender-ref ref="consoleLogDemo"></appender-ref>  
  18.             <appender-ref ref="fileLogDemo"></appender-ref>  
  19.         </root>  
  20.     </loggers>  
  21. </Configuration>  

对比新旧版本的properties文件,可以有如下结论:

(1)旧版第一行定义根日志级别与输出目标的名称语句被转述到下方,声明语句也更突显结构性,用了上文中提到的包装元素:

rootLogger.level = debug
rootLogger.appenderRef.consolelogdemo.ref = consoleLogDemo
rootLogger.appenderRef.filelogdemo.ref = fileLogDemo
其中第一句是指定根日志的级别,为debug;第2、3句是在上一句包装元素的统领下,指定哪些appender输出源是默认执行根日志的输出级别。要用到的属性是appender的name值
。注意左边的name是全部小写右边才和定义的name完全一样。如果漏写第3句,则控制台上将不显示File类型的日志记录。

(2)新版本直接用appender.console.type和appender.console.name指定输出源的类型为Console,指定的名称为consoleLogDemo(不固定)。之所以省去原版首行的定义名称列表,可能是从字面上也能推断出要使用的是Console类型的appender吧。

(3)原来对console输出级别作控制的log4j.appender.a.threshold=debug变成了先声明type,再指定level的形式,结构性比原来更明显了,有点“先声明后使用”的感觉:
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = debug

(4)layout布局属性也是这样,先声明type类型(对应原来的log4j.appender.a.layout=org.apache.log4j.PatternLayout),再指定日志记录样式pattern的值(对应原来的log4j.appender.a.layout.ConversionPattern=%m%n),新版本看起来更工整:
appender.console.layout.type = PatternLayout 
appender.console.layout.pattern = %m%n

(5)另外一个细节是,原版console属性target的值要么是System.err,要么是System.out,前者日志信息显示为红色,后者为黑色,且只有这两种属性值。在新版中,属性值的功能和个数不变,但写法上要把英文句点符号"."改为下划线"_"。

【其他准备工作】

使用log4j,原版需要导入log4j-1.2.17.jar包,到某项目的WebContent/WEB-INF/lib目录下。新版本v2.6.2版同之前的2.x各类版本一样,导入目录不变,但需要导入两个新版jar包:

log4j-api-2.6.2.jar
log4j-core-2.6.2.jar

配置文件方面,不论是log4j2.xml还是log4j2.properties,都需要复制到src根目录下(如下图所示


【具体使用】

只需要定义一个Logger类型的实例,用LogManager.getLogger(String name);语句具体创建。

示例代码如下:

  1. package javastudy;  
  2.   
  3. import org.apache.logging.log4j.Level;  
  4. import org.apache.logging.log4j.LogManager;  
  5. import org.apache.logging.log4j.Logger;  
  6.   
  7. public class HelloLog4j2 {  
  8.     public static Logger log4j2Demo = LogManager.getLogger(HelloLog4j2.class.getName());  
  9.       
  10.     public static void main(String[] arg0) {  
  11.         log4j2Demo.trace("Demo1:我是trace信息,通过.trace(Sting s1)生成。");  
  12.         log4j2Demo.debug("Demo2:我是debug信息,通过.debug(String s2)生成。");  
  13.         log4j2Demo.info("Demo3:我是info信息,通过.info(String s3)生成。");  
  14.         log4j2Demo.warn("Demo4:我是warn信息,通过.warn(String s4)生成。");  
  15.         log4j2Demo.error("Demo5:我是error信息,通过.error(String s5)生成。");  
  16.         log4j2Demo.fatal("Demo6:我是fatal信息,通过.fatal(String s6)生成。");  
  17.         System.out.println();  
  18.         /*Valid Levels include:  
  19.          * (ALL <) TRACE < DEBUG < INFO < WARN < ERROR < FATAL (< OFF)*/  
  20.         log4j2Demo.log(Level.DEBUG, "Demo7:我是debug信息,通过.log(Level.DEBUG,String s7)生成。");  
  21.         log4j2Demo.log(Level.ERROR, "Demo8:我是error信息,通过.log(Level.ERROR,String s8)生成。");      
  22.     }  
  23. }  

运行结果:


日志文件生成情况:


日志文件内容:


  从结果中可知,由于根日志规定显示的最低级别为debug,因此trace级别的Demo1无法显示。日志级别按重要性递增的方式可分为8个级别,常用的是中间6个级别:
(ALL <) TRACE < DEBUG < INFO < WARN < ERROR < FATAL (< OFF)

  因此,只需要在上文的log4j2.xml文件中(注意文件名末尾有个2,与1.2版不同),把<root level="debug">改为<root level="trace">,即可在控制台看到示例列出的所有级别的日志信息,但日志文件propertiesTest.log由于规定只允许error及以上级别的记录,因此文件内容保持不变。


参考资料:

http://logging./log4j/2.x/manual/configuration.html
http://blog.csdn.NET/lrenjun/article/details/8178875
http://www.cnblogs.com/hanfight/p/5721855.html
http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html
http://blog.csdn.Net/lu8000/article/details/25754415
http://zengxiantao./blog/1881700

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多