log4j.xml配置的通用变量

2022-09-04 06:03:50

我有log4j.xml配置,如下所示:

<appender name="MyAppender"class="org.apache.log4j.DailyRollingFileAppender">   
     <param name="File"     value="/logs/custom/my.log"/>
...  
 </appender>

但是,对于许多追加器,我的文件的根目录是相同的。有没有办法将“/logs/custom/”定义为变量,并在我所有的追加器中重用它。

谢谢

肖恩


答案 1

更新:原始答案适用于Log4j 1.x

Log4j 2.x对配置文件中的属性有更丰富的支持,请参阅Log4j手册关于使用属性进行配置

Log4j 1.x(原始答案):

使用时实现类似效果的唯一方法是在启动时设置系统属性,然后从 中引用该属性。log4j.xmllog4j.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

来源:我从在log4j xml配置中使用系统环境变量中获得了这个答案的灵感。

另外,如果你在Tomcat下运行,你可以使用变量,就像这样:${catalina.home}

<appender name="MyAppender"class="org.apache.log4j.DailyRollingFileAppender">   
     <param name="File" value="${catalina.home}/logs/my.log"/>
     ...  
</appender>

答案 2

在 XML 中也可以定义一个变量,并在文档的其余部分重用它:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" [
  <!ENTITY logHome "/logs/folder1/folder2">
]
>

然后,引用刚刚定义的此变量,如 &logHome;

<param name="File" value="&logHome;/folder3/my.log"/>

怎么样?

(我相信我前段时间在这个链接中了解了XML实体引用:http://www.ibm.com/developerworks/xml/library/x-tipentref/index.html)


推荐