将 log4j.properties 文件从 Log4j 版本 1 迁移到 2 的合适指南
A suitable guide for migrating log4j.properties files from Log4j version 1 to 2
我目前正在做一个专门使用 log4j 版本 1 的大型项目(因为它是很久以前开发的),我们最近考虑迁移到 log4j 版本 2。虽然我已经替换了大部分代码引用并添加了依赖项,该项目使用了几十个 log4j.properties 文件形式的自定义配置文件。
我只是想知道是否有详细说明如何在 log4j.properties 和 log4j2.properties 之间转换的指南,因为属性文件格式似乎仍在使用。由于该项目涵盖了各种各样的属性,因此我们希望避免尝试转换为 xml 格式,因为我们中的 none 以前使用过它。
不,没有指南告诉您如何在 Log4j 1 属性和 Log4j 2 属性之间进行转换。这实际上相当复杂,因为它必须完成两件事:
- 描述 Log4j 2 属性的语法以及它与 Log4j 1 属性的区别。
- 描述 ConsoleAppender、RollingFileAppender 等各种元素在配置上的差异
Log4j configuration guide 确实提供了属性语法的概述,尽管它可以使用一些更详细的解释。
老实说,我拒绝使用属性实现配置,因为配置在 Log4j 2 中的工作方式非常不同。无论使用什么配置语法,配置都会转换为节点定义的层次结构,每个定义包含 key/value 属性.就其性质而言,属性文件不是分层的。要模拟您必须创建 属性 名称,其中元素以点符号表示。例如,appender.console 表示这是控制台附加程序的配置,所有以它开头的字段都是属性或 sub-nodes。在定义诸如 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 占用更少 space。这主要是因为在 XML 中,属性既可以表示为元素上的属性,也可以表示为子元素。如果在 XML 示例中使用了子元素,它将与 JSON 示例中的大小基本相同。
就是说,如果您将此处显示的属性语法与相应的 XML 或 JSON 进行比较,它应该会提供有关您必须对其他元素执行的操作的指导。
我目前正在做一个专门使用 log4j 版本 1 的大型项目(因为它是很久以前开发的),我们最近考虑迁移到 log4j 版本 2。虽然我已经替换了大部分代码引用并添加了依赖项,该项目使用了几十个 log4j.properties 文件形式的自定义配置文件。
我只是想知道是否有详细说明如何在 log4j.properties 和 log4j2.properties 之间转换的指南,因为属性文件格式似乎仍在使用。由于该项目涵盖了各种各样的属性,因此我们希望避免尝试转换为 xml 格式,因为我们中的 none 以前使用过它。
不,没有指南告诉您如何在 Log4j 1 属性和 Log4j 2 属性之间进行转换。这实际上相当复杂,因为它必须完成两件事:
- 描述 Log4j 2 属性的语法以及它与 Log4j 1 属性的区别。
- 描述 ConsoleAppender、RollingFileAppender 等各种元素在配置上的差异
Log4j configuration guide 确实提供了属性语法的概述,尽管它可以使用一些更详细的解释。
老实说,我拒绝使用属性实现配置,因为配置在 Log4j 2 中的工作方式非常不同。无论使用什么配置语法,配置都会转换为节点定义的层次结构,每个定义包含 key/value 属性.就其性质而言,属性文件不是分层的。要模拟您必须创建 属性 名称,其中元素以点符号表示。例如,appender.console 表示这是控制台附加程序的配置,所有以它开头的字段都是属性或 sub-nodes。在定义诸如 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 占用更少 space。这主要是因为在 XML 中,属性既可以表示为元素上的属性,也可以表示为子元素。如果在 XML 示例中使用了子元素,它将与 JSON 示例中的大小基本相同。
就是说,如果您将此处显示的属性语法与相应的 XML 或 JSON 进行比较,它应该会提供有关您必须对其他元素执行的操作的指导。