log4j配置无效的解决方法

前言

在项目中配置了log4j不起作用,但仍然可以输日志,猜想是不是在其它地方配置了log4j。

解决方法

如何去确认是否是使用其它地方的log4j配置呢?
可以在java命令中加入-Dlog4j.debug虚拟机参数来显示log4j加载配置文件的位置。

打印结果显示:

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@18b4aac2.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader@18b4aac2 class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@18b4aac2.
log4j: Using URL [jar:file:../hisuConnPoolAPI20160105.jar!/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL jar:file:../lib/hisuConnPoolAPI20160105.jar!/log4j.properties
log4j: Parsing for [root] with value=[debug,stdout,file].
log4j: Level token is [debug].

从中可以很明显加载了第三方jar包的log4j.properties文件。

扩展

此时,如果我们在自己定义一个log4j.properties的文件,看会加载哪个配置文件呢?

此时打印的内容显示:

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@18b4aac2.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader@18b4aac2 class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@18b4aac2.
log4j: Using URL [file:../target/classes/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:../target/classes/log4j.properties

发现找到的是刚才自定义的日志文件。

相关源码

加载配置文件部分的源码

//LoggerManager.java

static public final String DEFAULT_CONFIGURATION_FILE = "log4j.properties";

static final String DEFAULT_XML_CONFIGURATION_FILE = "log4j.xml"; 

// 下面是一个静态代码块,可以看到先找classpath下的log4j.xml文件,如果找不到就找classpath下的log4j.properties。loader.getResource找到一条就会结束。
if(configurationOptionStr == null) {    
    url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
    if(url == null) {
      url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
    }
}

   转载规则


《log4j配置无效的解决方法》 孤独如梦 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
java项目自动部署的启动和终止的脚本 java项目自动部署的启动和终止的脚本
前言以下的启动脚本(start.sh)和终止脚本(stop.sh)参考自dubbo中提供的脚本。是为了方便自动部署,不需要手动的kill进程,防止出错。 启动脚本:start.sh #!/bin/bash # java home expo
2019-06-06
下一篇 
分布式系统所带来的技术问题 分布式系统所带来的技术问题
前言如果要把一个单体应用变成一个分布式系统,或者构建一个分布式系统需要用到哪些技术呢?下面介绍的框架都是开源的框架。 分布式服务框架作为分布式系统,首先需要让各系统或服务之前互相通信,必须要有一个分布式服务框架。各个服务可以感知对方在哪里,
2019-06-06
  目录