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

cos*_*mos 14 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文件如何影响日志记录过程?

JB *_*zet 13

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


Kie*_*rdy 5

log4j 版本 1.x:

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

但是,当类路径中同时存在“log4j.xml”和“log4j.properties”文件时,从实验看来,log4j 比“log4j.properties”优先于“log4j.xml”。

即首先,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():");
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

log4j 版本 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 'properties'、'yaml' 或 'json' 配置文件时才会使用。

注意:为了帮助调试 log4j 配置问题,设置“log4j.debug”属性,例如:

java -Dlog4j.debug ... 
Run Code Online (Sandbox Code Playgroud)

另请参阅: 如何正确初始化 log4j?