使用log4j无法输出日志

摘要:
不久前,我在项目期间使用log4j输出日志,但在一个项目中,我在src/main/resources目录中创建了log4j.properties。具体配置如下:log4j。rootLogger=INFO,stdoutlog4j。类别应用云。approuter=INFOLog4j。类别应用云。nginxcontroller=INFOLog4j

前段时间在项目的过程中使用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无法输出日志第1张

现在就大概可以猜出来原因了,大概就是因为配置文件加载顺序的问题。那我们来刨根问底一下:到底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().");
  

免责声明:文章转载自《使用log4j无法输出日志》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇android 录制最实用的logback讲解(2)—appender下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JavaWeb学习记录(一)——response响应头之缓存设置与下载功能的实现

一、HTTP中常用响应头 Location: http://www.it315.org/index.jsp Server:apache tomcat Content-Encoding: gzip Content-Length: 80 Content-Language: zh-cn Content-Type: text/html; charset=GB23...

MyX5TbsPlusDemo【体验腾讯浏览服务Android SDK (TbsPlus 版)】

版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 按照官网上的说明:只需接入aar文件和调用一个接口即可完成TBS接入,我们会通过全屏Activity展示TBS WebView,适用于快速接入TBS且常规使用WebView的开发者。 按照接入文档中的说明:tbsplus是在tbs sdk 完整版基础上提供的开发者一键接入的AAR包,开发者...

创建TIff虚拟打印机

1.需要2个软件 GhostScript是PostScript解释程序,文件转换器。http://www.ghostscript.com/(下载地址: http://downloads.ghostscript.com/public/gs871w32.exe) RedMon是用于打印机端口监听。http://pages.cs.wisc.edu/~ghost...

vb6 控件未注册问题解决

打开项目时弹出如题错误。 另附一个帖子:http://bbs.csdn.net/topics/390580540,这个帖子讨论的不错,可以提供很多思路。 解决办法:http://rewwensoftware.blog.163.com/blog/static/1841283032013928956442/ 实际解决不需要那么麻烦,我实际情况,直接从第三步就可...

工具-效率工具-XMIND8破解(99.1.3)

@ 目录 1.下载 2.修改hosts文件 3.修改配置文件 4.填入序列号 5.破解完成 关于作者 1.下载 1.点击进入官方网站下载 2.下载破解包 网址:点击进入网盘地址 密码:domd 2.修改hosts文件 1.进入C:WindowsSystem32driversetc目录使用文本工具打开HOSTS文件 2.添加以下代码 0.0.0.0...

Installshield 2010 中集成. Net framework4 与 vc++ 2010运行安装包

1、prq的地址,通过以下地址,下载相应的prq文件     VC 2010 redist X86: http://saturn.installshield.com/is/prerequisites/microsoft visual c++ 2010 redistributable package (x86).prq VC 2010 redist X8...