我使用log4j2,并在log4j2.xml中配置了一个滚动文件
<RollingFile name="a2.log" append="true"
fileName="C:/Dev/error_log/local_error_log_app_name.log"
filePattern="C:/Dev/error_log/local_error_log_app_name_-%d{MM-dd-yyyy}-%i.txt.gz">
这对于本地Eclipse Development很好,但是当我部署到JBOSS服务器时,我希望路径和文件名适合该文件系统,而不必在部署之前记住编辑log4j2.xml文件。
fileName="/www/logs/error_log/error_log_app_name.log"
我看到了以下帖子
如何在log4j.xml的appender中给出动态文件名
Log4J2 -在运行时分配文件附加程序文件名
和尝试fileName="$${sys:logFilename}"
和fileName="${sys:logFilename}"
,但所做的只是将文件${sys
放在Jboss bin文件夹' Jboss -as-7.1.1. final bin'
您是否尝试过在配置文件中声明属性?log4j2文档有一个示例:http://logging.apache.org/log4j/2.x/manual/configuration.html PropertySubstitution
如果这不起作用,请在log4j2问题跟踪器中提出一个票:https://issues.apache.org/jira/browse/LOG4J2
在log4j2.xml中声明属性时,使用双美元符号$$
<Properties>
<Property name="filenameVariable">$${sys:errorLogFileName}</Property>
<Property name="filePatternVariable">$${sys:errorLogFilePattern}</Property>
</Properties>
和引用使用单美元符号$
<RollingFile name="a2.log" append="true"
fileName="${filename}"
filePattern="${filePattern}">
但是,不一定要使用属性。直接引用system属性,还是用一个美元符号
<RollingFile name="a2.log" append="true"
fileName="${sys:errorLogFileName}"
filePattern="${sys:errorLogFilePattern}">
对于我实际问题的答案,如何根据我是在Eclipse本地运行还是部署到我们的服务器来动态指定日志文件,我使用
@Singleton
@Startup
public class StartupBean {
@PostConstruct
private void startup() {
if (File("C:/").exists()) {
System.setProperty("errorLogFileName", "C:/path/to/error_log.txt");
System.setProperty("errorLogFilePattern", "C:/path/to/error_log-%d{MM-dd-yyyy}-%i.txt.gz");
} else {
System.setProperty("errorLogFileName", "/unix/path/to/error_log.txt");
System.setProperty("errorLogFilePattern", "/unix/path/to/error_log-%d{MM-dd-yyyy}-%i.txt.gz");
}
}
}
重要!如果没有系统属性设置System.setProperty("whatever")
,您的log4j2.xml中的查找将失败,相反,log4j将写入一个名为您查找的第一部分的文件,即${sys