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

    xiaoxiao2023-03-24  5

    【写作动机】

      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格式的配置文件(之前的2.x版均不支持.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示例配置文件如下:

    status = error name = PropertiesConfig property.filename = target/rolling/rollingtest.log filter.threshold.type = ThresholdFilter filter.threshold.level = debug appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = %m%n appender.rolling.type = RollingFile appender.rolling.name = RollingFile appender.rolling.fileName = ${filename} appender.rolling.filePattern = target/rolling2/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 2 appender.rolling.policies.time.modulate = true appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size=100MB appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.max = 5 appender.list.type = List appender.list.name = List appender.list.filter.threshold.type = ThresholdFilter appender.list.filter.threshold.level = error logger.rolling.name = com.example.my.app logger.rolling.level = debug logger.rolling.additivity = false logger.rolling.appenderRef.rolling.ref = RollingFile rootLogger.level = info rootLogger.appenderRef.stdout.ref = STDOUT

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

      1.2版log4j.properties文件代码如下:

    log4j.rootLogger=debug,a,b log4j.appender.a=org.apache.log4j.ConsoleAppender log4j.appender.a.Threshold=debug log4j.appender.a.target=System.out log4j.appender.a.layout=org.apache.log4j.PatternLayout log4j.appender.a.layout.ConversionPattern=%m%n log4j.appender.b=org.apache.log4j.FileAppender log4j.appender.b.Threshold=error log4j.appender.b.ImmediateFlush=true log4j.appender.b.File=e:\\propertiesTest.log log4j.appender.b.Append=true log4j.appender.b.layout=org.apache.log4j.PatternLayout log4j.appender.b.layout.ConversionPattern=%d -%m%n   最新的log4j2.properties文件代码如下:

    status = warn name = MyApp appender.console.type = Console appender.console.name = consoleLogDemo appender.console.filter.threshold.type = ThresholdFilter appender.console.filter.threshold.level = debug appender.console.layout.type = PatternLayout appender.console.layout.pattern = %m%n appender.console.target = System_out appender.rolling.type = File appender.rolling.name = fileLogDemo appender.rolling.filter.threshold.type = ThresholdFilter appender.rolling.filter.threshold.level = error appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = %d-%m%n appender.rolling.append = true appender.rolling.fileName = e:\\propertiesTest.log rootLogger.level = debug rootLogger.appenderRef.consolelogdemo.ref = consoleLogDemo rootLogger.appenderRef.filelogdemo.ref = fileLogDemo

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

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE xml> <Configuration status="warn" name="MyApp"> <appenders> <Console name="consoleLogDemo" target="SYSTEM_OUT"> <ThresholdFilter level="debug"/> <PatternLayout pattern="%m%n" /> </Console> <File name="fileLogDemo" fileName="e:\\propertiesTest.log" append="true"> <ThresholdFilter level="error" /> <PatternLayout pattern="%d-%m%n" /> </File> </appenders>       <loggers> <root level="debug"> <appender-ref ref="consoleLogDemo"></appender-ref> <appender-ref ref="fileLogDemo"></appender-ref> </root> </loggers> </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);语句具体创建。

    示例代码如下:

    package javastudy; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class HelloLog4j2 { public static Logger log4j2Demo = LogManager.getLogger(HelloLog4j2.class.getName()); public static void main(String[] arg0) { log4j2Demo.trace("Demo1:我是trace信息,通过.trace(Sting s1)生成。"); log4j2Demo.debug("Demo2:我是debug信息,通过.debug(String s2)生成。"); log4j2Demo.info("Demo3:我是info信息,通过.info(String s3)生成。"); log4j2Demo.warn("Demo4:我是warn信息,通过.warn(String s4)生成。"); log4j2Demo.error("Demo5:我是error信息,通过.error(String s5)生成。"); log4j2Demo.fatal("Demo6:我是fatal信息,通过.fatal(String s6)生成。"); System.out.println(); /*Valid Levels include: * (ALL <) TRACE < DEBUG < INFO < WARN < ERROR < FATAL (< OFF)*/ log4j2Demo.log(Level.DEBUG, "Demo7:我是debug信息,通过.log(Level.DEBUG,String s7)生成。"); log4j2Demo.log(Level.ERROR, "Demo8:我是error信息,通过.log(Level.ERROR,String s8)生成。"); } }

    运行结果:

    日志文件生成情况:

    日志文件内容:

      从结果中可知,由于根日志规定显示的最低级别为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.apache.org/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.iteye.com/blog/1881700

    转载请注明原文地址: https://ju.6miu.com/read-1202467.html
    最新回复(0)