类路径中有多个Log4j.properties文件

时间:2012-06-05 01:33:25

标签: java logging log4j

Log4j如何在其类路径中管理多个log4j.properties?哪个log4j.properties文件优先?让我来描述确切的情况。

我有不同团队开发的多个maven模块,每个模块都有自己的log4j.properties文件。所有这些log4j.properties文件都配有RootLogger以及ConsoleAppender和FileAppenders。

现在,当Log4j加载哪个log4j.properties文件时,它将用于配置RootLogger设置?另外,Log4j将如何创建Logger层次结构?其他第三方jar中的log4j.properties文件如何影响日志记录过程?

2 个答案:

答案 0 :(得分:12)

将加载类路径中的第一个文件。因此,如果A.jar和B.jar都包含一个文件,并且A.jar在类路径中出现在B.jar之前,则会加载A.jar的文件。这就是类加载器的工作原理。

答案 1 :(得分:3)

log4j ver 1.x:

正如其他人所说,log4j在类路径中查找第一个配置文件。请参阅:http://logging.apache.org/log4j/1.2/manual.html

但是当有两个' log4j.xml'和' log4j.properties'在类路径中的文件,似乎从实验中看出log4j优先于' log4j.xml' over' log4j.properties'。

即。首先,log4j似乎在类路径中查找第一个' log4j.xml'文件。如果没有,那么log4j似乎会在类路径中查找第一个' log4j.properties'文件。

从下面的代码中复制和粘贴可能有助于确定正在使用的配置文件:

import org.apache.log4j.Logger;

public class TestLog4j
{

  static
  {
    System.out.println("Classpath: [" + System.getProperty( "java.class.path" ) + "]" );
    System.out.println("Found logging configuration files:");
    System.out.println("  log4j.xml: " + Logger.getRootLogger().getClass().getResource( "/log4j.xml" ) );
    System.out.println("  log4j.properties: " + Logger.getRootLogger().getClass().getResource( "/log4j.properties" ) );
  }

  public static void main(String[] args)
  {
    System.out.println("main():");
  }
}

修改:

log4j ver 2.x:

此处记录了默认配置文件的搜索顺序:http://logging.apache.org/log4j/2.x/manual/configuration.html

即。对于log4j版本2.x,如果找不到更高优先级的配置文件(例如log4j2-test。[properties | yaml | json | xml]),则在类路径中找到文件log4j2.properties。请注意,log4j2.xml具有最低优先级,并且仅在log4j2'属性',' yaml'或者' json'找不到配置文件。

注意:为了帮助调试log4j配置问题,请设置' log4j.debug'财产,例如用:

java -Dlog4j.debug ... 

另请参阅: How to initialize log4j properly?