17

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

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

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

4

2 回答 2

16

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

于 2012-06-10T07:07:18.587 回答
6

log4j 版本 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 版本 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 ... 

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

于 2014-10-15T20:24:53.727 回答