本文主要对如下配置文件进行解析:
status=info
name=PropertiesConfig
rootLogger.level=info
rootLogger.appenderRef.stdout.ref=STDOUT
rootLogger.appenderRef.rolling.ref=RollingFile
appender.stdout.type=Console
appender.stdout.name=STDOUT
appender.stdout.layout.type=PatternLayout
appender.stdout.layout.pattern=%d [%t] %-5p %c{2} - %X{msgId} - %m%n
appender.rolling.type=RollingFile
appender.rolling.name=RollingFile
appender.rolling.fileName=/logs/dialogue.log
appender.rolling.filePattern=/logs/dialogue.log.%d{yyyy-MM-dd}-%i
appender.rolling.layout.type=PatternLayout
appender.rolling.layout.pattern=%d [%t] %-5p %c{2} - %X{msgId} - %m%n
appender.rolling.policies.type=Policies
appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval=1
appender.rolling.strategy.type=DefaultRolloverStrategy
appender.rolling.strategy.max=5
appender.api.type=RollingFile
appender.api.name=api
appender.api.fileName=/logs/dialogue_1.log
appender.api.filePattern=/logs/dialogue_1.log.%d{yyyy-MM-dd}-%i
appender.api.layout.type=PatternLayout
appender.api.layout.pattern=%d [%t] %-5p %c{2} - %X{msgId} - %m%n
appender.api.policies.type=Policies
appender.api.policies.time.type=SizeBasedTriggeringPolicy
appender.api.policies.size.size=20000KB
appender.api.strategy.type=DefaultRolloverStrategy
appender.api.strategy.max=5
appender.api.filter.threshold.type=ThresholdFilter
appender.api.filter.threshold.level=error
logger.api.name = com.test.be.main
logger.api.level = info
logger.api.appenderRef.api.ref = api
logger.api.appenderRef.stdout.ref = STDOUT
logger.api.additivity = false
logger.test.name = com.test.be.util
logger.test.level = warn
log4j的日志包含7个级别,从低到高分别是:ALL、DEBUG、INFO、WARN、ERROR、FATAL、OFF,当然用户还可以自定义日志级别。其中DEBUG、INFO、WARN、ERROR、FATAL这5种是正常的级别,ALL表示打印全部的log,OFF表示不打印任何log。一般建议使用DEBUG、INFO、WARN、ERROR这4个级别。
在打印日志时,log4j只会打印等于和高于配置级别的日志。
log4j2对指定包的过滤是通过TAG来实现的。如果为某个package或某个类指定了特定效果,Log4j2会通过tag来识别该日志的位置,这个“tag”,实际上就是在通过LogManager.getLogger(String name)获取Logger实例的时候,输入的name属性,也是在调用Logger的实例打印log时,logger.info(tag,msg)中的tag。
例如,指定某个包的过滤级别:
logger.test.name = com.test.be.util
logger.test.level = warn
这样,根据上面的配置文件,rootLogger级别是info,未特殊指定的包的级别就是info级别,而tag的前缀是com.test.be.util的日志就会过滤掉低于warn级别的日志,即info级别的日志是不能打印的,只能打印warn及以上级别的日志。
最上面两行代码,实际上是log4j自身的配置:
status=info
name=PropertiesConfig
这里的status实际上配置的是,log4j的jar包中的log打印级别。
如下属性中,appender用来指定该属性是用来描述appender的;stdout是用户自定义的标识,只需要同一系列的appender一致即可,例如上面描述STDOUT用的都是stdout,而文首的配置文件中有两种RollingFile,分别是R和api;再后面的内容指的是该属性用来描述什么内容,例如type、fileName、layout.type等。
appender.stdout.type=Console
以上一节的一行配置为例,表示该appender的type是Console,即这个appender用于在控制台打印log。此外,还有RollingFile等,表示在文件中打印,RollingFile表示可以按文件大小或者时间来对旧log进行备份。
name属性指的是appender的名字,Logger以及rootLogger中通过name来指定appender。
appender.rolling.name=RollingFile
file系列属性用于描述RollingFile类型的appender打印的文件路径。其中,fileName表示log直接在该文件中打印,filePattern表示备份文件的文件路径和命名规则。
appender.rolling.fileName=/logs/dialogue.log
appender.rolling.filePattern=/logs/dialogue.log.%d{yyyy-MM-dd}-%i
对于filePattern,在log4j2.x中要求对于RollingFile类型必须配置,否则log4j2会提示问题:
main ERROR The parameter is null: filePattern
main ERROR Could not create plugin of type class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile org.apache.logging.log4j.core.config.ConfigurationException: Arguments given for element RollingFile are invalid: field 'filePattern' has invalid value 'null'
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.injectFields(PluginBuilder.java:209)
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:122)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:959)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:899)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:891)
at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:514)
at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:238)
at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:250)
at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:547)
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:263)
at org.apache.logging.log4j.core.async.AsyncLoggerContext.start(AsyncLoggerContext.java:87)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:179)
at org.apache.logging.log4j.core.config.Configurator.initialize(Configurator.java:85)
at
...
main ERROR Null object returned for RollingFile in Appenders.
main ERROR Unable to locate appender "R" for logger config "root"
filePattern的内容解析:
1)filePattern的作用:表示当文件达到指定大小(size based)或者达到指定时间(time based)后,就会将日志按filePattern指示的内容进行备份,备份文件名按filePattern指示的歌声命名,并清空日志文件。
2)%d{yyyy-MM-dd}:表示时间粒度的单位并指示格式。其中,时间粒度取决于大括号中的最低单位,示例中的是天,也可以写成%d{MM-dd-yy-HH-mm-ss},这样最低的时间粒度单位就是秒。具体是多少天备份一次,取决于另一个参数policies.time.interval。
3)%i:一个从1开始递增计数的ID。
上述示例中,会在2018年11月3日第一次打印log时对前一天的log进行备份,备份的文件全名为:/logs/dialogue.log.2018-11-02-1
layout系列表示日志打印时的格式。log4j提供了多种输出格式,以PatternLayout为例:
appender.rolling.layout.type=PatternLayout
appender.rolling.layout.pattern=%d [%t] %-5p %c{2} - %X{msgId} - %m%n
pattern格式的简单介绍:
官方文档传送门:Pattern格式的详细介绍:PatternLayout;其他layout的详细介绍:layouts
polices系列用来配置基于时间触发、或者基于文件大小触发的文件备份策略。如下是基于时间触发的,触发的时间单位取决于上述filePattern中的%d{}的配置,例如%d{yyyy-MM-dd}表示是天级,%d{yyyy-MM-dd-HH-mm-ss}表示秒级;结合属性appender.rolling.policies.time.interval指定的数值,文章开头的配置文件中,名为rolling的appender的日志文件,每1天备份一次。
appender.rolling.policies.type=Policies
appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval=1
而名为api的appender,定义的则是基于文件大小的文件备份策略,参数配置如下:
appender.api.policies.type=Policies
appender.api.policies.time.type=SizeBasedTriggeringPolicy
appender.api.policies.size.size=20000KB
strategy系列指定的是filePattern中的%i,appender.api.strategy.max配置的是i的最大值。i默认从1开始递增。
appender.api.strategy.type=DefaultRolloverStrategy
appender.api.strategy.max=5
filter系列定义的是该appender的日志过滤级别。
appender.api.filter.threshold.type=ThresholdFilter
appender.api.filter.threshold.level=error
Logger是用来打印日志的工具,rootLogger是一切自定义logger的父类。如下三条语句,第一条指定了rootLogger的过滤等级,后面两条各自指定了一个对应的appender。
rootLogger.level=info
rootLogger.appenderRef.stdout.ref=STDOUT
rootLogger.appenderRef.rolling.ref=RollingFile
自定义Logger是通过如下方式进行定义的。
logger.api.name = com.mobvoi.be.dm
logger.api.level = warn
logger.api.appenderRef.api.ref = api
logger.api.additivity = false
属性解析:
a)name:指定一个包名或者类名,该包或者该类使用该Logger打印日志;
b)level:指定该Logger的过滤级别;
c)additivity:设置该Logger的事件是否会被传递给它的父Logger,即本例中rootLogger不会打印api Logger的事件。false表示不会传递,默认值为true。
d)appenderRef:用来定义appender