当前位置:  开发笔记 > 编程语言 > 正文

Log4j,配置Web App以使用相对路径

如何解决《Log4j,配置WebApp以使用相对路径》经验,为你挑选了5个好方法。

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

这样做的最佳方法是什么?



1> Steve K..:

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

log4j.rootCategory=DEBUG,errorfile

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

在Debian(包括Ubuntu)上,${catalina.home}将无法工作,因为它指向/ usr/share/tomcat6,它没有链接到/ var/log/tomcat6.这里只是用${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


两种解决方案都使用系统属性,我们只是以不同方式设置它们.这实际上取决于灵活性与简单性.我们管理运行我们的应用程序的所有Tomcat服务器,所以我喜欢灵活性.如果您为第三方使用分发战争,简单是有道理的
老实说,我没有看到这种方法对我使用我在答案中解释过的监听器有什么好处.我不关心它是什么容器,无论我在哪里部署它都会工作,而在你的方法中我必须如果我改变环境,改变一个值.

2> Iker Jimenez..:

我终于以这种方式完成了它.

添加了一个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进行测试,到目前为止工作正常.

你怎么看?


此解决方案仅在您将单个WebApp配置为使用它时才有效,因为系统属性是tomcat的全局属性,启动的第二个应用程序将覆盖第一个Web应用程序设置的值.您可以为每个webapp提供一个唯一的属性名称,但如果您打算这样做,那么您也可以使用$ {catalina.home}并在log4j.properties文件中添加该路径的唯一部分,因为它不易出错.
如果我只使用Tomcat,那将是真的,但我的要求是它必须在0配置的任何容器上工作.我的方法实现了这一点,到目前为止还没有人提出更好的方法.
这是一个好主意,但我认为catalina.home可能更安全,因为它会在任何log4j代码初始化之前始终设置/可用.
此解决方案可能适用于使用Servlet的Web应用程序,但是Steve K的解决方案(http://stackoverflow.com/questions/216781/log4j-configuring-a-web-app-to-use-a-relative-path/216805# 216805)适用于使用Log4j的任何应用程序.
Spencer K的解决方案也基于相对路径,适用于使用Log4j的任何应用程序,假设您将基本目录设置为可预测的路径.

3> Megadix..:

如果您使用Spring,您可以:

1)创建一个log4j配置文件,例如"/WEB-INF/classes/log4j-myapp.properties"不要将其命名为"log4j.properties"

例:

log4j.rootLogger=ERROR, stdout, rollingFile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n

log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.File=${myWebapp-instance-root}/WEB-INF/logs/application.log
log4j.appender.rollingFile.MaxFileSize=512KB
log4j.appender.rollingFile.MaxBackupIndex=10
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.rollingFile.Encoding=UTF-8

稍后我们将在第(3)点定义"myWebapp-instance-root"

2)在web.xml中指定配置位置:


  log4jConfigLocation
  /WEB-INF/classes/log4j-myapp.properties

3)为webapp的根指定唯一的变量名,例如"myWebapp-instance-root"


  webAppRootKey
  myWebapp-instance-root

4)添加Log4jConfigListener:


  org.springframework.web.util.Log4jConfigListener

如果您选择其他名称,请记住在log4j-myapp.properties中更改它.

看我的文章(仅限意大利语......但它应该是可以理解的):http: //www.megadix.it/content/configurare-path-relativi-log4j-utilizzando-spring

更新(2009/08/01) 我把我的文章翻译成英文:http: //www.megadix.it/node/136



4> 小智..:

只是评论Iker的解决方案.

ServletContext对您的问题是一个很好的解决方案.但我不认为这对维护有好处.大多数时间日志文件都需要保存很长时间.

由于ServletContext在已部署的文件下生成文件,因此在重新部署服务器时将删除该文件.我的建议是使用rootPath的父文件夹而不是子文件夹.



5> Spencer Korm..:

如果未在FileAppender的path属性中指定根目录,log4j是否只使用应用程序根目录?所以你应该能够使用:

log4j.appender.file.File =日志/ MyLog.log

自从我完成Java Web开发以来已经有一段时间了,但这似乎是最直观的,并且也不会与写入$ {catalina.home}/logs目录的其他不幸的命名日志冲突.


从我所看到它可以使用用户的主目录,或者如果你没有提供绝对路径,则可以使用容器的主目录.不可靠.
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有