Log4j 1.x配置文件报错及自定义属性优先级配置咨询
Log4j 1.x配置解析错误与自定义属性引用问题
先看你遇到的配置解析错误,这是因为你用了Log4j 2的配置格式来写Log4j 1.x的配置文件,导致Log4j 1.x无法识别根元素,进而初始化失败。
一、解决配置文件解析错误
Log4j 1.x的XML配置有严格的格式要求:
- 根元素必须是
<log4j:configuration>,而不是<Configuration> - 需要在文件开头声明对应的DTD
修正后的log4j.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <param name="threshold" value="info" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level Line: %L - %msg%n" /> </layout> </appender> <appender name="LOGFILE" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="c:/temp/logfile.log" /> <param name="Append" value="true" /> <param name="MaxFileSize" value="2MB" /> <param name="MaxBackupIndex" value="2" /> <priority value="WARN" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level Line: %L - %msg%n" /> </layout> </appender> <appender name="UNMAPFILE" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="c:/temp/unmapped.log" /> <param name="Append" value="true" /> <param name="MaxFileSize" value="2MB" /> <param name="MaxBackupIndex" value="2" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> <category name="com.ma.dev" additivity="false"> <priority value="INFO" /> <appender-ref ref="STDOUT" /> <appender-ref ref="LOGFILE" /> </category> <root> <priority value="WARN" /> <appender-ref ref="UNMAPFILE" /> </root> </log4j:configuration>
二、关于自定义属性引用的可行性
你想在<priority value="${myinfo}" />里引用自定义属性,Log4j 1.x本身不支持这种内部属性的直接引用——它的XML配置不会自动解析${}格式的内部属性。如果要实现类似功能,有几种方案:
- 使用系统属性:把
myinfo设置为JVM系统属性(比如启动时加-Dmyinfo=INFO),然后在配置里写<priority value="${myinfo}" />,Log4j 1.x会自动解析系统属性。 - 自定义PropertyConfigurator:继承
org.apache.log4j.PropertyConfigurator,在加载配置前手动替换配置文件里的自定义属性占位符。 - 构建时替换:用Maven或Ant的资源过滤功能,在构建项目时自动把配置文件里的
${myinfo}替换成对应的值。 - 升级到Log4j 2:Log4j 2原生支持配置文件内部的属性定义和引用,也就是你现在写的
<Properties>+${myinfo}的方式,而且Log4j 2的性能和功能都比1.x强很多,这是最推荐的方案。
修正配置文件后,你的Java代码就能正常输出日志了,再根据需求选择合适的属性引用方案即可。
内容的提问来源于stack exchange,提问作者masiboo
相关产品推荐
相关产品推荐

