从war包外部加载Log4j.xml文件

11

我在我的应用程序中使用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。在settings目录中,我需要放置我的log4j.xml。

我尝试通过编辑run.bat来设置jboss类路径并加载它,如下所示: set 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:无效的“log4jConfigLocation”参数:类路径资源[ /log4j.xml ]无法解析为URL,因为它不存在

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


1
@atulkumar-v-jain,你的编辑破坏了代码高亮显示 :-( - Betlista
6个回答

10

请记得在路径前加上 "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)。”那么为什么您要使用这个类呢? - herman
2
file:后面只有一个/而不是两个时,我成功地让它工作了。我希望我的建议能帮助其他人。 - Stephen D

6
我遇到了同样的异常。
我使用了以下代码:
<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 clean install


1
这个答案最好的部分是 classpath:log4j.properties。 - Azim

5
您可以像这样简单声明log4j配置文件的位置:
<context-param>
      <param-name>log4jConfigLocation</param-name>
     <param-value>${JBOSS_HOME}/server/default/deploy/settings/log4j.xml</param-value>
</context-param>

我不想要lo4j.xml的硬编码位置,因为每当你想要更改它的位置时,你都必须修改web.xml并构建war文件。 - Narendra
系统属性或环境变量。 - Eugene Kuleshov
log4jConfigLocation通常用于包内定制。如果来自包外,则最好使用jboss全局log4j配置。 - Jackie
如何从外部文件夹加载logback.xml,有什么想法吗? - Sai prateek
命令行参数“-Dlog4j.config.location”对我也起作用了。 - spinus
显示剩余2条评论

0
您可以在 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:/”。

0

您可以使用:

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

在你的log4jConfigLocation标签内部。

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


0

的语法有点不同:使用log4jConfiguration参数。 请参考以下答案: @rgoers @Gowtham


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接