Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类路径中有多个Log4j.properties文件_Java_Logging_Log4j - Fatal编程技术网

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

Java 类路径中有多个Log4j.properties文件,java,logging,log4j,Java,Logging,Log4j,Log4j如何管理其类路径中的多个Log4j.properties?哪个log4j.properties文件优先?让我描述一下确切的情况 我有多个由不同团队开发的maven模块,每个模块都有自己的log4j.properties文件。所有这些log4j.properties文件都配置了RootLogger以及ConsolePender和FileAppender 现在,当Log4j加载哪个Log4j.properties文件时,它将用于配置RootLogger设置?此外,Log4j将如何创建记录器

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

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


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

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

log4j版本1.x:

正如其他人所说,log4j在类路径中查找第一个配置文件。见:

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

i、 首先,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:

默认配置文件的搜索顺序记录在此处:

i、 e.对于log4j版本2.x,如果未找到更高优先级的配置文件(例如log4j2 test.[properties | yaml | json | xml]),则如果在类路径中找到,则使用文件log4j2.properties。请注意,log4j2.xml的优先级最低,只有在未找到log4j2“属性”、“yaml”或“json”配置文件时才会使用

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

java -Dlog4j.debug ... 

另请参见:

如果我想同时加载两个属性文件,我有一个特定的要求如何实现?我的意思是a.jar和b.jar中的log4j.properties文件都应该加载…有没有办法?为什么需要同时加载它们?将配置外部化到文件的目的是能够以您想要的方式配置日志记录。所以jar文件甚至不应该附带log4j.xml文件。相反,他们应该记录他们使用的记录器(按照惯例,记录器名称是类名),然后应用程序汇编程序使用这两个jar文件创建自己的配置文件,包含应用程序中使用的所有库的配置。我希望加载这两个库,因为我正在编写一个客户端api,其中我希望将特定于客户端api的日志记录到一个单独的文件中。该应用程序可以有自己的log4j配置,但我不希望客户端更改任何内容。我将给他们一个api jar,在这里定义特定于api的appender和logger。还要注意的是,我不想通过编程实现它,我想通过配置来实现。然后,您应该告诉客户机向自己的log4j配置文件添加什么,以便从您的库中获取日志。在jar中绑定log4j配置文件只会让他们生气,因为你的配置可能会被加载,而不是他们的配置。让客户控制。我知道这个选项,但我在想是否有其他方法可以解决这个问题。谢谢你的建议!!看起来是相反的?参考[link]()编辑答案以反映log4j版本2.x,添加文档链接(感谢@chandra_cst)和其他调试提示。