Log4j,将 Web 应用配置为使用相对路径

2022-08-31 12:35:11

我有一个Java webapp,必须部署在Win或Linux机器上。我现在想添加log4j用于日志记录,并且我想为日志文件使用相对路径,因为我不想在每个部署上更改文件路径。容器很可能是Tomcat,但不一定。

最好的方法是什么?


答案 1

Tomcat 设置了一个 catalina.home 系统属性。您可以在 log4j 属性文件中使用它。像这样:

log4j.rootCategory=DEBUG,errorfile

log4j.appender.errorfile.File=${catalina.home}/logs/LogFilename.log

在 Debian(包括 Ubuntu)上,将不起作用,因为它指向 /usr/share/tomcat6,它没有链接到 /var/log/tomcat6。这里只需使用.${catalina.home}${catalina.base}

如果使用其他容器,请尝试查找类似的系统属性,或定义自己的属性。设置系统属性将因平台和容器而异。但是对于 Linux/Unix 上的 Tomcat,我会在 CATALINA_HOME/bin 目录中创建一个 setenv.sh。它将包含:

export JAVA_OPTS="-Dcustom.logging.root=/var/log/webapps"

那么你的log4j.properties将是:

log4j.rootCategory=DEBUG,errorfile

log4j.appender.errorfile.File=${custom.logging.root}/LogFilename.log

答案 2

我终于以这种方式做到了。

添加了一个 ServletContextListener,它执行以下操作:

public void contextInitialized(ServletContextEvent event) {
    ServletContext context = event.getServletContext();
    System.setProperty("rootPath", context.getRealPath("/"));
}

然后在 log4j.properties 文件中:

log4j.appender.file.File=${rootPath}WEB-INF/logs/MyLog.log

通过这种方式,Log4j将写入正确的文件夹,只要您在设置“rootPath”系统属性之前不使用它。这意味着您不能从ServletContextListener本身使用它,但您应该能够从应用程序中的任何其他位置使用它。

它应该适用于每个Web容器和操作系统,因为它不依赖于特定于容器的系统属性,并且不受特定于操作系统的路径问题的影响。使用Tomcat和Orion Web容器以及在Windows和Linux上进行了测试,到目前为止它工作正常。

你觉得怎么样?


推荐