【问题标题】:log4j2 logging happening in the wrong pathlog4j2 日志记录发生在错误的路径中
【发布时间】:2017-07-19 09:11:25
【问题描述】:

我在 weblogic 中部署了一个耳朵,其中 log4j2.xml logPath 设置为

<Property name="logPath">some_path_1<Property>

和一个定义为

的记录器
<Logger name="a.b.c.d" level="INFO" />

在这个 ear/lib 中有一个包含 log4j2.xml 的 jar,logPath 属性定义为

<Property name="logPath">some_path_2<Property>

和一个封装结构非常相似的logger

<Logger name="a.b.c" level="INFO" />

两个 log4j2.xml 也被配置为具有不同的日志文件名。 但是两者的日志都来自路径 some_path_2 和该 jar 中定义的文件名

如何确保两个日志输出按照定义分别发生?

我的耳朵结构是这样的

ear
|--lib
|--|--abc.jar
|--|--|--log4j2.xml //the one thats getting loaded
|--xyz.war
|--|--WEB-INF
|--|--|--classes
|--|--|--|--log4j2.xml // the one I want

Edit1:我在包含战争的 web.xml 中添加了以下内容,但没有帮助

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

Edit2:我也试过了,发现这是间歇性工作

ear
|--lib
|--|--abc.jar
|--|--|--log4j2.xml //the one thats getting loaded
|--|--xyz.jar
|--|--|--log4j2.xml //the one I want.. works but not always.Does classloader loads the jars alphabetically?
|--xyz.war
|--|--WEB-INF
|--|--|--classes
|--|--|--|--log4j2.xml // the one I want

【问题讨论】:

  • 我认为你让 log4j2 模块在类路径中搜索 log4j2 配置文件。因此,根据哪个 jar,首先加载目录,然后加载配置文件。潜在地,您可以将 -Dlog4j.configurationFile=path/to/log4j2.xml 作为参数。如果这不可能,以编程方式让 log4j 在特定路径中查找。
  • "如何确保两个日志输出按照定义分别发生?"不支持多个配置文件。您必须手动合并配置,然后您需要指定 log4j2.xml 以与 @Andrews 建议的属性一起使用,或者您必须确保类路径中只有一个 log4j2.xml。

标签: java logging log4j log4j2 weblogic12c


【解决方案1】:

Log4j 仅使用 log4j 引导程序首先找到的配置文件初始化一次。所有其他(可能存在的)配置文件都不会被考虑在内。在相应的教程中详细了解 log4j 自动配置的优先级。

【讨论】:

    【解决方案2】:

    您可能已经知道您的问题是只加载了一个配置文件,而哪一个取决于类加载器。所以你不应该依赖它。

    对于您的问题,只有两种可能的解决方案,但今天我没有时间为您解决 - 抱歉。您必须删除或重命名 abc.jar 中的配置文件

    1. 从 abc.jar 中删除 log4j2.xml 在 ANT/MAVEN/GRADLE 或其他任何地方使用您的构建脚本来执行此操作。将配置文件中有趣的部分复制粘贴到您的配置文件中。

    2. 在 abc.jar 中重命名 log4j2.xml 在 ANT/MAVEN/GRADLE 或其他任何地方使用您的构建脚本来执行此操作。现在您可以在 log4j2.xml 中包含整个配置文件。这称为CompositeConfiguration

    我希望这个小建议对您有所帮助。 祝你好运!

    【讨论】:

      【解决方案3】:

      您能否从 jar/war 中删除 XML 并在 ear 级别仅使用一个 xml 文件,该文件包含两个日志路径/属性的详细信息。你可以试试reconfigure log4j2 in code with a specific configuration file

      你也可以dynamically write to separate log files,但我个人没有尝试过,所以我无法在这方面提供更多指导。

      【讨论】:

        【解决方案4】:

        您确定要使用“log4.xml”文件供 log4j2 使用吗?我不认为,log4j2自动配置机制试图找出名称为“logj.xml”的配置文件。

        来自official documentation

        Log4j 能够在运行期间自动配置自身 初始化。当 Log4j 启​​动时,它将找到所有 ConfigurationFactory 插件并按加权顺序排列它们 从最高到最低。交付时,Log4j 包含四个 ConfigurationFactory 实现:一种用于 JSON,一种用于 YAML,一种用于 用于属性,一个用于 XML。

        Log4j 将检查“log4j.configurationFile”系统属性,并且, 如果设置,将尝试使用 与文件扩展名匹配的 ConfigurationFactory。

        如果未设置系统属性,则 ConfigurationFactory 将在类路径中查找 log4j2.properties 或 log4j2.json 或 log4j2.xml 文件。

        您可能应该尝试将文件“xyz.war//WEB-INF/classes/log4j.xml”重命名为“xyz.war//WEB-INF/classes/log4j2.xml”。显然这个文件的内容必须与log4j配置xsd确认。

        【讨论】:

        • 问题在第一行中清楚地提到了使用 log4j2.xml 而不是 log4j.xml。
        • 答案是根据原始问题中给定的耳朵结构做出的。您已进行编辑以更正 ear 结构中的文件名。无论如何,我会编辑你的问题的答案。
        猜你喜欢
        • 1970-01-01
        • 2020-06-22
        • 2018-06-01
        • 1970-01-01
        • 2019-08-22
        • 1970-01-01
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多