使用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 ...
随机推荐
- ios中判断当前手机的网络状态
typedef enum { NETWORK_TYPE_NONE= 0, NETWORK_TYPE_2G= 1, NETWORK_TYPE_3G= 2, NETWORK_TYP ...
- pt-heartbeat监控延时
测试国内主机到国外主机mysql的延时 主机 perl /usr/bin/pt-heartbeat -uroot --ask-pass -D uk --create-table --update ...
- treecnt
treecnt ﹡ LH (命题人) 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择 ...
- 安装、配置、启动FTP、SSH或NFS服务
(1)准备使用软件维护工具apt-get. Ubuntu7.10中没有安装FTP.SSH.NFS服务器软件,它提供了一个很方便的安装.升级.维护软件的工具apt-get.apt-get从光盘.网络上下 ...
- js导入的注意.txt
如有两个外部js文件: jquery-1.8.2.min.js Jqery的系统文件 LYFArray.js 和个人的 ===============我要将两个js文件导入一个页面的方法:====== ...
- HDU - 5455 Fang Fang
Problem Description Fang Fang says she wants to be remembered.I promise her. We define the sequence ...
- 通过在xml布局文件中设置android:onClick=""来实现组件单击事件
在布局中出现android:onClick=""语句: <Button android:id="@+id/call_button" android:onC ...
- HDU 5776 sum
猜了一下,发现对了.n>m是一定有解的.所以最多m*m暴力,一定能找到.而T较小,所以能过. #pragma comment(linker, "/STACK:1024000000,10 ...
- Android测试日志文件抓取与分析
1.log文件分类简介 实时打印的主要有:logcat main,logcat radio,logcat events,tcpdump,还有高通平台的还会有QXDM日志 状态信息的有:adb shel ...
- Java中的Builder模式
package com.mc.bsfram.others.entity; public class Person { private String name; private String addre ...