我有这样的log4j.xml配置:
<appender name="MyAppender"class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="/logs/custom/my.log"/>
...
</appender>
然而,对于很多appender,我的文件的根目录是相同的。有没有办法将“/ logs / custom /”定义为变量并在我的所有appender中重用它。
谢谢,
肖恩
答案 0 :(得分:14)
更新:原始答案适用于Log4j 1.x
Log4j 2.x对配置文件中的属性提供了更丰富的支持,请参阅有关Configuration with properties的Log4j手册。
Log4j 1.x(原始答案):
使用log4j.xml
时实现类似功能的唯一方法是在启动时设置系统属性,然后从log4j.xml
引用该属性。
启动时,您可以设置系统属性:
java -Dlog_dir=/var/logs/custom com.yourorg.yourapp.Main
或者在运行时以编程方式设置它(在初始化Log4j之前):
System.setProperty("log_dir", "/var/logs/custom")
然后你可以像这样引用它:
<appender name="MyAppender"class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${log_dir}/my.log"/>
...
</appender>
或者在属性文件中,如下所示:
log4j.appender.MyAppender.File = ${log_dir}/my.log
资料来源:我从Using system environment variables in log4j xml configuration获得了这个答案的灵感。
此外,如果您在Tomcat下运行,则可以使用${catalina.home}
变量,如下所示:
<appender name="MyAppender"class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${catalina.home}/logs/my.log"/>
...
</appender>
答案 1 :(得分:14)
在XML中也可以定义一个变量并在doc的其余部分重用它:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" [
<!ENTITY logHome "/logs/folder1/folder2">
]
>
然后,请参考刚定义的此变量,作为&amp; logHome;
<param name="File" value="&logHome;/folder3/my.log"/>
那怎么样?
(我相信我不久前在这个链接上了解了XML实体引用:http://www.ibm.com/developerworks/xml/library/x-tipentref/index.html)
答案 2 :(得分:6)
我不相信这可以使用XML配置,但它是在.properties文件配置中:
mysubdir = /logs/custom
...
log4j.appender.MyAppender.File = ${mysubdir}/my.log