我的桌面应用程序使用log4j 1.2.17。
我允许通过属性文件进行配置,这样用户可以设置他们想要的多个日志输出。
在生产中,我有一个特定的日志目录,位于/var/myapp/log
目录下。
在开发中,我有一个特定的日志目录,在/users/agostino/development/myapp/devenvironment/log
下,这使我可以轻松地进行自动化测试,因为所有的东西都在一个地方。
在log4j.properties中我有这样一行:
log4j.appender.default_file.File=example.log
好吧,正如我所说,这应该在指定的日志目录中,/var/myapp/log
在生产时或/users/agostino/development/myapp/devenvironment/log
我正在开发中。
我只能考虑在属性中进行一些搜索和替换,即使这样也会有点麻烦。有更干净的方法吗?
我不想使用插值,因为它应该对用户透明。
答案 0 :(得分:3)
我认为解决问题的一种方法是在虚拟机启动时使用参数。 e.g:
java -Dcustom.log.file=/var/myapp/log ...
您在配置文件中使用该系统属性。 e.g:
log4j.appender.default_file.File=${custom.log.file}/example.log
答案 1 :(得分:1)
你可以通过使用听众来实现它。
示例代码:
public class Log4jListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
System.setProperty("rootPath", context.getRealPath(File.separator));
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
在上面的代码中,已部署的路径设置为系统属性。使用 $ {rootPath}
在log4j.xml中访问它- 您必须在web.xml中声明该侦听器
<!-- listener to set deployed path to logger -->
<listener>
<listener-class>a.b.c.Log4jListener</listener-class>
</listener>