Java 类路径中有多个Log4j.properties文件
Log4j如何管理其类路径中的多个Log4j.properties?哪个log4j.properties文件优先?让我描述一下确切的情况 我有多个由不同团队开发的maven模块,每个模块都有自己的log4j.properties文件。所有这些log4j.properties文件都配置了RootLogger以及ConsolePender和FileAppenderJava 类路径中有多个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文件时,它将用于配置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)和其他调试提示。