问题描述
我目前正在从事一个大型项目,该项目仅使用log4j版本1(因为它是很久以前开发的),并且最近我们考虑迁移到log4j版本2。尽管我已经替换了许多代码参考并添加了依赖性,该项目使用了数十个自定义配置文件,形式为log4j.properties文件。
我只是想知道是否有指南详细说明了如何在log4j.properties和log4j2.properties之间进行转换,似乎属性文件格式仍在使用中。由于该项目涵盖了各种各样的属性,因此有一个毯子转换器手册,因为我们希望避免尝试转换为xml格式,因为我们之前都没有使用过它。
解决方法
否,没有指南可以告诉您如何在Log4j 1属性和Log4j 2属性之间进行转换。这实际上会相当复杂,因为它必须完成两件事:
- 描述Log4j 2属性的语法以及与Log4j 1属性的区别。
- 描述ConsoleAppender,RollingFileAppender等各种元素之间的配置差异。
Log4j configuration guide确实提供了属性语法的概述,尽管它可以使用一些更详细的说明。
说实话,我拒绝使用属性来实现配置,因为配置在Log4j 2中的工作方式非常不同。无论使用哪种配置语法,配置都将转换为节点定义的层次结构,每个节点定义都包含键/值属性。从本质上讲,属性文件不是分层的。要模拟,您必须创建属性名称,其中元素以点表示法表示。例如,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
vs对应的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进行比较,则应该提供有关其他元素必须执行的操作的指导。