转自https://blog.csdn.net/hfcenter/article/details/70212951
Log4j2配置文件的读取顺序
官网上给了一串的if-else的说明,概括起来就是一条读取顺序链
System Property -> properties -> YAML -> JSON -> XML -> Default Configuration
YAML配置文件包括: .yaml和.yml
JSON配置文件包括: .json和.jsn
Appender配置
基本配置
# 采用RollingFile类型的Appender
appender.rolling.type = RollingFile
# 本appender的名字,以便在Logger的配置项中能够调用
appender.rolling.name = broker
# 当前正在操作的日志文件的文件名
appender.rolling.fileName = /druid/log/broker.log
# 归档后的日志文件的文件名格式,其中`%d{yyyy-MM-dd-HH}`用来自动填充日期
appender.rolling.filePattern = /druid/log/broker-%d{yyyy-MM-dd-HH}.log.gz
Layout配置
appender.rolling.layout.type = PatternLayout
# 对应输出的每条日志的日志头
appender.rolling.layout.pattern = %date- %c{2}: %m%n
Policy配置
appender.rolling.policies.type = Policies
# 基于时间进行日志的切割
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
# 切割的间隔为1小时, 即每小时进行一次日志的归档
appender.rolling.policies.time.interval = 1
# 修正时间范围, 从0时开始计数
appender.rolling.policies.time.modulate = true
除了时间之外还可以基于文件的大小进行切割,相关的策略类为SizeBasedTriggeringPolicy。
Strategy配置
配置Strategy用来删除过多的日志归档文件
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.delete.type = Delete
# 删除哪个目录下的日志归档文件
appender.rolling.strategy.delete.basePath = /druid/log
# 从basePath起向下遍历几级子文件夹?
appender.rolling.strategy.delete.maxDepth = 1
appender.rolling.strategy.delete.iffile.type = IfFileName
# 删除符合该模式文件名的归档日志文件
appender.rolling.strategy.delete.iffile.glob = broker-*.log.gz
appender.rolling.strategy.delete.iflastmodify.type = IfLastModified
# 保留多少天的日志?
appender.rolling.strategy.delete.iflastmodify.age = 2d
Logger说明
- Logger的配置用来细节化地配置具体类的日志输出选项
- Logger中必须要配置的是root级别的Logger,用
rootLogger
作为属性 - 其他的Logger由用户自行定义
# 自定义的logger名字
logger.emitter.name = com.metamx.emitter.core.LoggingEmitter
# 该logger的日志级别
logger.emitter.level = info
logger.emitter.additivity = true
# 该logger通过什么类型的appender来输出
logger.emitter.appenderRefs = kafka
# 该logger通过该类型具体的哪个appender来输出
logger.emitter.appenderRef.kafka.ref = kafka-monitor
# root的配置和自定义Logger一样
rootLogger.level = info
rootLogger.appenderRefs = rolling
rootLogger.appenderRef.rolling.ref = middleManager
XML怎么翻译成properties
- 这个钻研了很久,官方的文档翻阅了很多遍,只能看出一些端倪来
- Google的结果基本只有一两篇有价值的
- 读了一小部分Log4j2的源代码,了解了propertie文件的解析方式
- 最后终于在各种连蒙带猜中,顿悟除了规则来
properties配置文件读取
Log4j-2.5对properties文件的解析位于PropertiesConfigurationFactory类
中
- 解析
appenders键
、loggers键
,获得所有的appender和logger rootLogger键
是另外单独解析的- 为每个appender调用
createAppender()方法
,为每个logger调用createLogger()方法
- properties配置文件的键是根据符合
.
来进行区分的,一个.
隔开了上下层的级联,在createAppender()方法
和createLogger()方法
中,就是一层一层的递归遍历来获取有级联关系的配置 - 从代码中可以看出, 在appender中每配置一个组件都要先定义一个
type
,然后就可以在这一层定义属性键
= 对应的值
遍历配置的代码如下, 不包括一些默认的属性键
private void processRemainingProperties(ComponentBuilder<?> builder, String name, Properties properties) {
while (properties.size() > 0) {
String propertyName = properties.stringPropertyNames().iterator().next();
int index = propertyName.indexOf('.');
if (index > 0) {
String prefix = propertyName.substring(0, index);
Properties componentProperties = PropertiesUtil.extractSubset(properties, prefix);
builder.addComponent(createComponent(builder, prefix, componentProperties));
} else {
builder.addAttribute(propertyName, properties.getProperty(propertyName));
properties.remove(propertyName);
}
}
}
xml文件与properties文件的对应
一开始没能理解官网给的例子,后来顿悟的关键点就在这个type
上
- xml类似于HTML中的标签写法,所以每个标签名就对应properties文件中的type
- 每个标签中跟进的属性就可以转化成properties文件中该type层下的键值对
xml文件与properties文件的对应
举个例子, 有appender的切割策略配置如下:
<Policies>
<TimeBasedTriggeringPolicy intervel = "2" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
# 对应Policies标签
appender.rolling.policies.type = Policies
# 对应TimeBasedTriggeringPolicy
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
# 对应SizeBasedTriggeringPolicy
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
logger匹配
<logger name="org.springframework" level="INFO" additivity="false">
<AppenderRef ref="RollingFile"/>
</logger>
logger.rolling.name = org.springframework
logger.rolling.level = INFO
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile
其中,RollingFile是Appenders的一个名字
<Appenders>
<RollingFile name="RollingFile" fileName="c://test_log/test.log"
filePattern="c://test_log/test-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="500 MB"/>
</Policies>
</RollingFile>
</Appenders>