将log4j.properties文件从log4j版本1迁移到2的合适指南



我目前正在处理一个专门使用log4j版本1的大型项目(因为它是很久以前开发的(,我们最近研究了迁移到log4j的版本2。虽然我已经替换了大部分代码引用并添加了依赖项,但该项目使用了几十个log4j.properties文件形式的自定义配置文件。

我只是想知道是否有一个指南详细介绍了如何在log4j.properties和log4j2.properties之间转换,因为属性文件格式似乎仍在使用中。由于该项目涵盖了各种各样的属性,因此有一个一揽子转换器手册,因为我们希望避免尝试转换为xml格式,因为我们以前都没有使用过它。

不,没有指南告诉您如何在Log4j 1属性和Log4j 2属性之间转换。这实际上相当复杂,因为它必须完成两件事:

  1. 描述Log4j2属性的语法,以及它与Log4j1属性的区别
  2. 描述各种元素(如ConsoleAppender、RollingFileAppender等(之间的配置差异

Log4j配置指南确实提供了属性语法的概述,尽管它可以使用一些更详细的解释。

老实说,我拒绝用属性实现配置,因为配置在Log4j2中的工作方式非常不同。无论使用何种配置语法,配置都会转换为节点定义的层次结构,每个节点定义都包含键/值属性。从本质上讲,属性文件不是分层的。为了模拟这一点,您必须创建属性名称,其中元素以句点表示。例如,appender.console意味着这是控制台appender的配置,以及所有以属性或子节点开头的字段。当定义RollingFileAppender之类的东西时,这会变得非常麻烦(IMO(。在您拥有的属性中:

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

与相应的XML

<RollingFile name="RollingFile" fileName="${filename}" filePattern="target/rolling2/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz">
<PatternLayout pattern="%d %p %C{1.} [%t] %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="2" modulate="true" />
<SizeBasedTriggeringPolicy size="100MB" />
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingFile>

同样,YAML和JSON本质上是分层的,因此也是配置的好选择。在JSON中,这将是:

"RollingFile": {
"name": "RollingFile,
"fileName": "${filename}",
"filePattern": "target/rolling2/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz",
"PatternLayout": {
"Pattern": "%d %p %C{1.} [%t] %m%n"
},
"Policies": {
"TimeBasedTriggeringPolicy": {
"interval": 2,
"modulate": true,
},
"SizeBasedTriggeringPolicy": {
"size": "100MB"
}
}
}

但是您会注意到,即使在这里,XML也可以比JSON占用更少的空间。这主要是因为在XML中,属性可以表示为元素上的属性,也可以表示为子元素。如果在XML示例中使用子元素,那么它的大小基本上与JSON示例相同。

也就是说,如果您将此处显示的属性语法与相应的XML或JSON进行比较,它应该为您对其他元素所做的操作提供指导。

最新更新