【问题标题】:Multiple Log4j.properties files in classpath类路径中有多个 Log4j.properties 文件
【发布时间】:2012-06-09 01:39:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: java logging log4j


    【解决方案1】:

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

    【讨论】:

    • 我有一个特定的要求如果我想同时加载两个属性文件,我该如何实现呢?我的意思是应该加载来自 a.jar 和 b.jar 的 log4j.properties 文件......有什么办法吗??
    • 为什么需要同时加载它们?将配置外部化到文件的目标是能够以您想要的方式配置日志记录。所以 jar 文件甚至不应该附带捆绑的 log4j.xml 文件。相反,他们应该记录他们使用的记录器(按照惯例,记录器名称是类名),然后应用程序组装器使用两个 jar 文件创建自己的配置文件,其中包含在应用程序。
    • 我想同时加载它们,因为我正在编写一个客户端 api,我想将客户端 api 特定的日志记录到一个单独的文件中。该应用程序可以拥有自己的 log4j 配置,但我不希望客户端更改任何内容。我只会给他们 api jar,其中将定义 api 特定的 appender 和 logger。另请注意,我不想以编程方式实现它,我想通过配置来实现。
    • 然后你应该告诉客户端添加什么到他们自己的 log4j 配置文件中以从你的库中获取日志。在你的 jar 中捆绑一个 log4j 配置文件只会让他们发疯,因为你的配置可能会被加载而不是他们的。让客户端拥有控制权。
    • 我知道这个选项,但我在想是否有其他可用的方法。谢谢你的建议!!
    【解决方案2】:

    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 ... 
    

    另请参阅: How to initialize log4j properly?

    【讨论】:

    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多