【问题标题】:Log4j2 not loading from external classpath in an EARLog4j2 未从 EAR 中的外部类路径加载
【发布时间】:2020-05-14 10:59:32
【问题描述】:

项目工件结构为:

test.ear
--lib - has all log4j2 jars core, web, bridge and JCL
--META-INF -- has app.xml, JBoss specific deployment XML, and manifest file 
--a.war -- each war has web.xml with log4jConfiguration and Log4jServletContextListener specified.
--b.war
--c.war

战争使用 log4jConfiguration 创建上下文,即“classpath:test.xml”。我可以看到每场战争都使用我在 web.xml 中提供的 log4jContextName 创建上下文。我也有一些 cron,它们根据配置的时间间隔运行。当 crons 运行并且许多 JMS 进程运行时,我观察到日志文件没有填充日志(来自项目特定的类)。在浏览 log4j2 代码时,我了解到 log4j2 为每个类加载器创建一个上下文。在我的例子中,它为“test.ear”创建了一个上下文,默认为 error(DefaultContext),因为它无法找到默认的 log4j2.xml,因为我在类路径。 Log4jServletContextListener 没有捕捉到“test.ear”事件。

如何在 log4j2 为 ear 文件创建上下文时注入我的“classpath:test.xml”?由于我的项目可以同时部署到 WebSphere 和 JBoss,我期待着不是特定于服务器的建议。或者有没有办法以某种方式为所有战争和耳朵创建一个单一的上下文?我在同一台服务器的这个耳朵之外有不同的应用程序,所以我不能提供 -Dlog4j.configurationFile 的环境配置,因为其他应用程序有自己的 log4j2 xml。

【问题讨论】:

    标签: spring jboss log4j websphere log4j2


    【解决方案1】:

    我能想到的一种方法是将您的 log4j 配置文件 test.xml 放在共享库中,并将您的应用程序配置为使用共享库。

    以下链接描述了如何在 WebSphere 上为服务器或企业应用程序配置共享库。

    https://www.ibm.com/support/pages/how-create-shared-library-and-associate-it-application-server-or-enterprise-application-websphere-application-server

    共享库应该是现代 Java 应用服务器的通用函数,因此 JBoss 也应该能够配置它。

    【讨论】:

    • “test.xml”已经在类路径中。问题是当 Log4j2 为 EAR 创建上下文时,无法以编程方式在共享文件夹中指定与 log4j2.xml 不同的名称的 XML。如果我放 log4j2.xml 它可以工作,但我想从类路径加载 test.xml。
    • 您能否在您的 web.xml 中发布您的 log4j 配置?在 log4j 网站上,它有这样一行:“除非您使用 isLog4jAutoInitializationDisabled 禁用自动初始化,否则您不得在部署描述符 (web.xml) 或 Servlet 3.0 或更新的应用程序中的另一个初始化程序或侦听器中手动配置 Log4jServletContextListener 或 Log4jServletFilter。这样做会导致启动错误和未指定的错误行为。”
    • 你是对的。我已经为战争准备了该配置。但是没有类似的配置可以应用于 EAR 级别。 <context-param> <param-name>log4jContextName</param-name> <param-value>AppName</param-value> <param-name>isLog4jAutoInitializationDisabled</param-name> <param-value>true</param-value> <param-name>log4jConfiguration</param-name> <param-value>classpath:test.xml</param-value> <listener> <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> </listener>
    • 我不知道那时是否有可能拥有 EAR 范围的配置。 log4j 网站并没有真正详细解释这种情况。由于需要与其他应用程序进行上下文分离,也许没有必要使用非默认 log4j 配置文件名。
    猜你喜欢
    • 2015-07-11
    • 2018-12-19
    • 1970-01-01
    • 2012-05-29
    • 2014-12-16
    • 2014-02-03
    • 2020-09-02
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多