【问题标题】:How to configure log4j.properties in external folder for a web application in tomcat如何在tomcat中为Web应用程序配置外部文件夹中的log4j.properties
【发布时间】:2012-12-30 06:17:10
【问题描述】:

请帮助如何处理以下情况。

当前的网络应用: 我已将 log4j.propertes 放在 webapp 的 /WEB-INF/classes 文件夹中。

想要实现: 将 log4j.properties 放在外部位置并从我的 Web 应用程序中引用,这样我就可以随时修改日志位置而无需重新构建战争。

$CATALINA_HOME/propdirwebapp1/log4j.properties $CATALINA_HOME/propdirwebapp2/log4j.properties

如果我部署了多个应用程序,请提出解决方案。如果服务器上只部署了一个应用程序,请提出解决方案

【问题讨论】:

    标签: java jakarta-ee tomcat classpath tomcat5.5


    【解决方案1】:

    web.xml 的情况下,我添加了Log4jConfigListener 并且它起作用了。 log4jRefreshInterval 在这里是可选的。

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>file:/<your-path-here>/log4j.properties</param-value>
    </context-param>
    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <!-- Refresh log4j configuration every 5 minutes. -->
        <param-value>300000</param-value>
    </context-param>
    
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    

    【讨论】:

      【解决方案2】:

      war文件不需要重建,直接修改log4j.properties,重启tomcat即可。

      【讨论】:

      • 感谢您的回答,但只要您在 webapps 文件夹中发生战争,无论您是否更改爆炸文件夹中的路径,它都会在 tomcat 重启时覆盖,我认为需要在某些方面进行处理其他方式。
      • 不,Tomcat 不会在重启时更改展开的文件夹,但是,我同意修改展开的文件夹不是一个好习惯。
      【解决方案3】:

      您可以在 $CATALINA_BASE/conf/catalina.properties 中的 shared.loader 属性中添加一个目录。

      shared.loader=conf/myapp/
      

      然后把log4j.properties放到这个目录下。

      但是有两个限制。

      1) 如果WEBINF/classes 中有一个 log4j.properties 文件,那么将首先加载该文件

      2) 该目录被所有 webapps 共享,因此所有 webapps 只能有一个 log4j.properties 文件。

      【讨论】:

      • 这看起来很酷,但瓶颈是所有 webapps 将共享相同的 log4j。可能需要基于包配置日志并将日志推送到特定的日志文件才能解决问题。 :) 谢谢你的回复。
      【解决方案4】:

      我喜欢我的尝试,它只处理不同战争应用程序的日志级别。

      例如在conf中放置一个自定义属性文件

      $CATALINA_BASE/conf/my.properties
      

      创建类似的条目

      myapp.loglevel = INFO
      myapp2.loglevel = DEBUG
      

      读取每个请求的道具,例如

      myProps = new Properties();
      myProps.load(new FileInputStream(new File(System.getProperty("catalina.base"), "conf/my.properties")));
      

      在请求开始时读取和使用属性,例如在 servlet 中

      String myLoglevel = (String)myProps.get("myapp.loglevel");
      LogManager.getRootLogger().setLevel(Level.toLevel(myLoglevel));
      

      我们正在使用 slf4j-log4j12,我已经读过 log4j2 中没有 LogManager,但我确信这个机制也可以应用于 log4j2。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多