【问题标题】:Loading Log4j.xml from outside fo the war从战争之外加载 Log4j.xml
【发布时间】:2010-10-26 13:54:48
【问题描述】:

在我的应用程序中,我使用 Log4j 进行日志记录。目前我将 log4j.xml 放在 WEB-INF/classes 中。 以下是我用来加载 log4j.xml 文件的配置。

<!-- language: xml -->

    <context-param>
          <param-name>log4jConfigLocation</param-name>
         <param-value>/WEB-INF/classes/log4j.xml</param-value>
    </context-param>

    <listener>
       <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener> 

现在我需要将 log4j.xml 文件放在我的 war 文件之外。该位置很可能是 JBOSS_HOME/server/default/deploy/settings。在设置目录中,我需要放置我的 log4j.xml。

我尝试通过编辑 run.bat 来设置 jboss 类路径来加载它,如下所示 设置 JBOSS_CLASSPATH=%RUN_CLASSPATH%;%JBOSS_HOME%\server\default\deploy\settings 我在下面的 web.xml 中使用了

<!-- language: xml -->

    <context-param>
            <param-name>log4jConfigLocation</param-name>
            <param-value>classpath:/log4j.xml</param-value>  
    </context-param>

    <listener>
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener> 

但它在部署应用程序时抛出异常。例外是 java.lang.IllegalArgumentException: Invalid 'log4jConfigLocation' parameter: class path resource [/log4j.xml] cannot be resolved to URL because it does not exist

现在我的问题是如何加载它。

【问题讨论】:

  • @atulkumar-v-jain 你的编辑打破了突出显示:-(

标签: log4j


【解决方案1】:

记得在路径前加上“file://”,否则会在webapp文件夹内搜索。

以下示例适用于我。

<web-app>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>file://${MY_ENV_VAR}log4j.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
</web-app>

【讨论】:

  • Log4JConfigListener 的 javadoc 说:“如果您想保持 WAR 未扩展或不需要 WAR 目录中特定于应用程序的日志文件,请不要在应用程序中使用 log4j 设置(因此,不要使用 Log4jConfigListener 或 Log4jConfigServlet)。”那你为什么要使用这个类?
  • file: 之后只有一个/ 而不是两个时,我能够让它工作。我希望我的建议可以帮助其他人。
【解决方案2】:

我也有同样的例外。

我用过这段代码:

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

这个异常在我执行时消失了:

mvn 全新安装

【讨论】:

  • 这个答案最好的部分是 classpath:log4j.properties
【解决方案3】:

您可以像这样简单地声明 log4j 配置的位置:

<context-param>
      <param-name>log4jConfigLocation</param-name>
     <param-value>${JBOSS_HOME}/server/default/deploy/settings/log4j.xml</param-value>
</context-param>

【讨论】:

  • 我不想要 lo4j.xml bcz 的硬核位置,只要你想更改它的位置,你必须在 web.xml 中修改它并构建战争文件
  • 这只是一个例子。您可以使用类似 ${DEPLOY_SETTINGS}/log4j.xml
  • 从哪里可以得到这个值。我必须将其设置为系统属性吗?
  • 系统属性或环境变量。
  • log4jConfigLocation 通常用于包内定制。如果是包外的,最好使用jboss全局log4j配置。
【解决方案4】:

你可以使用:

  • file:///${MY_ENV_VAR}/log4j.xml
  • file:///${JBOSS_HOME}/server/default/deploy/settings/log4j.xml

在您的 log4jConfigLocation 标记中。

如果路径是绝对路径(在webapp文件夹之外),请注意添加file:///

【讨论】:

    【解决方案5】:

    你可以在web.xml文件中这样设置:

        <context-param>
                <param-name>log4jConfigLocation</param-name>
                <param-value>file://${JBOSS_HOME}/domain/configuration/log4j.xml</param-value>
            </context-param>
    
      <listener>
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
        </listener>
    

    注意:对于 windows 环境,以双“/”开头,如“file://”。对于带有单个“/”的 linux 环境,例如“file:/”。

    【讨论】:

      【解决方案6】:

      的语法略有不同:使用 log4jConfiguration 参数。 参考这些答案: @rgoers @Gowtham

      【讨论】:

        猜你喜欢
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        相关资源
        最近更新 更多