使用log4j无法输出日志
前段时间在项目的过程中使用log4j来输出日志,但是在一个项目里我明明已经在src/main/resource目录下创建了log4j.properties。具体配置如下:
log4j.rootLogger = INFO, stdout
log4j.category.appcloud.approuter = INFO
log4j.category.appcloud.nginxcontroller = INFO
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold = DEBUG
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ISO8601} %-5p [%F:%L] : %m%n
但是该模块就是没有日志输出。。于是乎就开始查看该模块引入的log4j的包是自己引入的还是引入上层模块的。于是发现该模块依赖的log4j是在另外一个工程里引入的,在eclipse中查看如下。
现在就大概可以猜出来原因了,大概就是因为配置文件加载顺序的问题。那我们来刨根问底一下:到底log4j加载配置文件的原则是什么?那我们来看log4j的源码吧。
我们使用log4j的时候,一般是通过Logger.getLogger(xxx)的方式来获取logger的实例的,而Logger.getLogger()方法其实是调用的LoggerManager.getLogger(xxx)方法。那我们就来看看那LoggerManager是怎么加载配置文件的。
static {
.....
/** Search for the properties file log4j.properties in the CLASSPATH. */
String override =OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY,
null);
// if there is no default init override, then get the resource
// specified by the user or the default config file.
if(override == null || "false".equalsIgnoreCase(override)) {
String configurationOptionStr = OptionConverter.getSystemProperty(
DEFAULT_CONFIGURATION_KEY,
null);
String configuratorClassName = OptionConverter.getSystemProperty(
CONFIGURATOR_CLASS_KEY,
null);
URL url = null; // if the user has not specified the log4j.configuration
// property, we search first for the file "log4j.xml" and then
// "log4j.properties"
if(configurationOptionStr == null) {
url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
if(url == null) {
url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
}
} else {
try {
url = new URL(configurationOptionStr);
} catch (MalformedURLException ex) {
// so, resource is not a URL:
// attempt to get the resource from the class path
url = Loader.getResource(configurationOptionStr);
}
}
}
}
通过代码里的注释我们可以看到log4j优先加载在classpath下的log4j.defaultInitOverride。如果没有default init override的话,就去加载用户自定义的配置类名称。(可以看出log4j支持log4j.defaultInitOverride 和log4j.configuration 和log4j.configuratorClass 系统属性配置)如果还是无法加载的话,就优先加载.xml的配置文件,最后才会去加载.properties文件。 所以我的项目里由于在引用maven依赖关系的时候,classpath下有.xml文件,便不会去加载本工程下的.properties文件。
这个问题找到了,怎么解决呢?在该工程下,写一个.xml文件,能把依赖的工程下的.xml文件覆盖掉吗?
其实关键的就是这个调用:url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);在这个调用里我抽出了debug的输出,可以清楚的看到,针对xml或者properties。log4j优先加载本工程中的配置文件,其次加载jar 包中的配置文件,最后加载系统类路径的配置文件。并且前者如果加载成功,后面的加载便不进行了。
LogLog.debug("Trying to find ["+resource+"] using context classloader "
+classLoader+".");
LogLog.debug("Trying to find ["+resource+"] using "+classLoader
+" class loader.");
LogLog.debug("Trying to find ["+resource+
"] using ClassLoader.getSystemResource().");
FN7IZG.jpg)
使用log4j无法输出日志的更多相关文章
- log4j配置输出日志文件
在测试程序时,有时候运行一次可能需要很久,把日志文件保存下来是很有必要的,本文给出了scala程序输出日志文件的方式,同时使用本人的另一篇博客中介绍的将log4j.properties放到程序jar包 ...
- log4j不输出日志错误分析
1.rootLogger不输出 代码如下: 配置文件代码: log4j.rootLogger=info, R,userLog log4j.appender.R=org.apache.log4j.Rol ...
- kettle使用log4j管理输出日志
在使用kettle进行数据分析和清洗时日志非常多而且杂乱,使用原有的日志有时找不到异常的位置,有时日志不够详细,说简单一点就是日志不是我们想要的.因而对kettle日志进行相应的管理就想得尤为重要了. ...
- log4j直接输出日志到flume
log4j.properties配置: log4j.rootLogger=INFOlog4j.category.com.besttone=INFO,flumelog4j.appender.flume ...
- Log4j指定输出日志的文件
在Log4j的配置文件中,有一个log4j.rootLogger用于指定将何种等级的信息输出到哪些文件中, 这一项的配置情况如下: log4j.rootLogger=日志等级,输出目的地1,输出目的地 ...
- 排查log4j不输出日志到文件的问题
问题描述 项目使用Spring Boot框架,在pom文件中添加了如下配置: <dependency> <groupId>org.slf4j</groupId> & ...
- log4j不输出日志的解决方案
参考:http://blog.csdn.net/qq994406030/article/details/53433159 主要是log4j.properties log权限和log输出方式没配好.
- log4j日志优先级导致的不输出日志
在sae部署微信代码的时候,发现它的默认日志很不友好,看起来很费劲,详细看了一下说明发现它可以根据log4j的输出级别而分类输出,就拖了一个log4j的xml文件扔进项目代码,然后部署运行,发现没有日 ...
- (OAF)jdeveloper集成log4j并将日志输出到指定文件并写入数据库
参考: How to configure Log4j in JDev 11g Ever wanted to use log4j in your adf project ? Well though Or ...
随机推荐
- 第2章 熟悉Eclipse开发工具----加减乘除,和差积商的英文写法
加减乘除表示运算:plus minus multiply divide和差积商表示运算结果:sum difference product quotient
- boost log库
http://blog.csdn.net/sheismylife/article/category/1820481
- wordpress建站过程3——header.php
header.php中包含了一个页面的页头,也就是其他页面中重复出现的部分,包括用户登陆/登陆后显示的文字,导航条,网页logo,有的还包括轮播图. 下面就简单的贴上一个文件吧. <!DOCTY ...
- uploadifive源码学习
一.简介 Uploadify是一个基于JQuery的多文件上传JS组件,高度定制,两个版本可供选择.flash版本在最新的Safari等不再支持flash的浏览器或者一些手机浏览器中就无法正常的加载使 ...
- hadoop文件系统浅析
1.什么是分布式文件系统? 管理网络中跨多台计算机存储的文件系统称为分布式文件系统. 2.为什么需要分布式文件系统了? 原因很简单,当数据集的大小超过一台独立物理计算机的存储能力时候,就有必要对它进行 ...
- 反编译app方法
如果你没有代码,那么可以反编译该app. 这里将用到2个工具,分别是dex2jar和jd-gui.你可以在这里下载目前为止的最新版本以及示例apk. 我们以工具包里的ContactManager.ap ...
- array_walk与array_map 的不同 array_filter
array_walk 主要是要对数组内的每个值进行操作,操作结果影响原来的数组 array_map主要是对数组中的值进行操作后返回数组,以得到一个新数组 wallk 可以没有返回值 map要有,因 ...
- 详细理解servlet实现的几种方式和生命周期
现在很多的开发都是用的框架,然后很多同学学习的时候又是直接接触的框架,对于底层的一些开发,完全没有任何的了解.虽然对于业务上面来说,没有什么问题.但是很多时候当你被面试问到,或者是想要了解框架底层原理 ...
- ssh proxy配置
在.ssh目录下新建config文件,并添加以下内容: Host 10.100.101.123 ProxyCommand=nc -X 5 -x [proxyip:proxyport] %h %p
- pdo 抽象层连接数据库
<?php header("content-type:text/html; charset=utf8"); try{ $pdo=new PDO(' ...