Log4j如何在其类路径中管理多个log4j.properties?哪个log4j.properties文件优先?让我来描述确切的情况。
我有不同团队开发的多个maven模块,每个模块都有自己的log4j.properties文件。所有这些log4j.properties文件都配有RootLogger以及ConsoleAppender和FileAppenders。
现在,当Log4j加载哪个log4j.properties文件时,它将用于配置RootLogger设置?另外,Log4j将如何创建Logger层次结构?其他第三方jar中的log4j.properties文件如何影响日志记录过程?
答案 0 :(得分:12)
将加载类路径中的第一个文件。因此,如果A.jar和B.jar都包含一个文件,并且A.jar在类路径中出现在B.jar之前,则会加载A.jar的文件。这就是类加载器的工作原理。
答案 1 :(得分:3)
log4j ver 1.x:
正如其他人所说,log4j在类路径中查找第一个配置文件。请参阅:http://logging.apache.org/log4j/1.2/manual.html
但是当有两个' log4j.xml'和' log4j.properties'在类路径中的文件,似乎从实验中看出log4j优先于' log4j.xml' over' 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。[properties | yaml | json | xml]),则在类路径中找到文件log4j2.properties。请注意,log4j2.xml具有最低优先级,并且仅在log4j2'属性',' yaml'或者' json'找不到配置文件。
注意:为了帮助调试log4j配置问题,请设置' log4j.debug'财产,例如用:
java -Dlog4j.debug ...