类路径中的多个 Log4j.属性文件

2022-09-03 01:36:14

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

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

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


答案 1

将装入类路径中的第一个文件。因此,如果 A.jar 和 B.jar都包含一个文件,并且类路径中的 A.jar 位于 B.jar 之前,则将加载 A.jar 的文件。这就是类装入器的工作方式。


答案 2

log4j ver 1.x:

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

但是,当类路径中同时存在“log4j.xml”和“log4j.properties”文件时,从实验中可以看出,log4j优先于“log4j.xml”而不是“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)。属性 |亚姆尔|json |xml]) 则使用文件 log4j2.properties(如果在类路径中找到)。请注意,log4j2.xml具有最低的优先级,仅当找不到 log4j2 “属性”、“yaml” 或 “json” 配置文件时才会使用。

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

java -Dlog4j.debug ... 

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


推荐