2017-07-19 18 views
7

我已经部署在WebLogic与log4j2.xml日志路径设置为log4j2记录在错误的道路发生

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

,并定义为

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

这里面耳塞/ lib中有一个记录器耳是一个jar包含log4j2.xml和logPath属性被定义为

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

和一个非常simil记录器ar包装结构

<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 
+2

我想你让log4j2模块在类路径中搜索log4j2配置文件。因此,基于无论哪个jar,都会先加载目录,然后加载配置文件。 可能的话,您可以将'-Dlog4j.configurationFile = path/to/log4j2.xml'作为参数。如果这是不可能的,以编程方式让log4j找到特定的路径。 – Andrews

+0

“如何确保两个记录输出按照定义分开进行?”不支持多个配置文件。您必须手动合并配置,然后您需要指定log4j2.xml与@Andrews建议的属性一起使用,否则您必须确保类路径中只有一个log4j2.xml。 – alan7678

回答

2

的Log4j被初始化仅仅一次该文件首先由log4j引导程序找到。所有其他(可能存在的)配置文件都不会被考虑在内。在适当的教程中了解更多关于log4j自动配置的优先级。

-1

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

official documentation

的Log4j必须在 初始化自动进行配置的能力。当Log4j启动时,它会找到所有的 ConfigurationFactory插件,并按从 最高到最低的加权顺序排列它们。交付后,Log4j包含四个配置工厂实现:一个用于JSON,一个用于YAML,一个用于属性的 ,另一个用于XML。

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

如果没有设置系统属性,ConfigurationFactory属性将在classpath中查找log4j2.properties或log4j2.json或log4j2.xml文件。

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

+1

问题在第一行中明确提到使用log4j2.xml而不是log4j.xml。 – rajesh

+0

答案是根据原始问题中给定的耳朵结构作出的。您已经进行了编辑以纠正耳朵结构中的文件名。无论如何,我会编辑你的问题的答案。 – skadya

2

正如你已经知道你的问题是只有一个配置文件得到加载,哪一个取决于类加载器。所以你不应该依赖这个。

您的问题只有两种可能的解决办法,但今天我没有时间为您解决 - 对不起。你必须从abc.jar 与ANT/MAVEN /摇篮你的构建脚本或任何这样做在abc.jar

  1. 删除log4j2.xml删除或重命名的配置文件。将配置文件的交互部分复制粘贴到配置文件中。

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

我希望这个小小的建议能帮助你。 祝你好运!