`

commons-logging和log4j多配置文件问题的定位

    博客分类:
  • java
阅读更多
现象
项目里使用的commons-httclient组件,莫名其妙的打印debug信息,
[      0]  DEBUG - .commons.httpclient.HttpClient - Java version: 1.6.0_24 
[      0]  DEBUG - .commons.httpclient.HttpClient - Java vendor: Sun Microsystems Inc. 
[      1]  DEBUG - .commons.httpclient.HttpClient - Operating system name: Windows 7 
[      1]  DEBUG - .commons.httpclient.HttpClient - Operating system architecture: amd64 
[      1]  DEBUG - .commons.httpclient.HttpClient - Operating system version: 6.1 
[     42]  DEBUG - .commons.httpclient.HttpClient - SUN 1.6: SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration) 
[     42]  DEBUG - .commons.httpclient.HttpClient - SunRsaSign 1.5: Sun RSA signature provider 
[     42]  DEBUG - .commons.httpclient.HttpClient - SunJSSE 1.6: Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1) 
[     42]  DEBUG - .commons.httpclient.HttpClient - SunJCE 1.6: SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC) 
[     42]  DEBUG - .commons.httpclient.HttpClient - SunJGSS 1.0: Sun (Kerberos v5, SPNEGO) 
[     42]  DEBUG - .commons.httpclient.HttpClient - SunSASL 1.5: Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5) 
[     42]  DEBUG - .commons.httpclient.HttpClient - XMLDSig 1.0: XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory) 
[     42]  DEBUG - .commons.httpclient.HttpClient - SunPCSC 1.6: Sun PC/SC provider 
[     44]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.useragent = Jakarta Commons-HttpClient/3.1 
[     45]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.protocol.version = HTTP/1.1 
[     46]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.connection-manager.class = class org.apache.commons.httpclient.SimpleHttpConnectionManager 
[     46]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.protocol.cookie-policy = default 
[     46]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.protocol.element-charset = US-ASCII 
[     46]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.protocol.content-charset = ISO-8859-1 
[     47]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.method.retry-handler = org.apache.commons.httpclient.DefaultHttpMethodRetryHandler@3e018c74 
[     47]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.dateparser.patterns = [EEE, dd MMM yyyy HH:mm:ss zzz, EEEE, dd-MMM-yy HH:mm:ss zzz, EEE MMM d HH:mm:ss yyyy, EEE, dd-MMM-yyyy HH:mm:ss z, EEE, dd-MMM-yyyy HH-mm-ss z, EEE, dd MMM yy HH:mm:ss z, EEE dd-MMM-yyyy HH:mm:ss z, EEE dd MMM yyyy HH:mm:ss z, EEE dd-MMM-yyyy HH-mm-ss z, EEE dd-MMM-yy HH:mm:ss z, EEE dd MMM yy HH:mm:ss z, EEE,dd-MMM-yy HH:mm:ss z, EEE,dd-MMM-yyyy HH:mm:ss z, EEE, dd-MM-yyyy HH:mm:ss z] 
[     50]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.connection.timeout = 10000 
[     50]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.socket.timeout = 10000 
[     50]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.protocol.cookie-policy = compatibility 
[     50]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.protocol.single-cookie-header = true 
[     50]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.protocol.content-charset = UTF-8 
[     65]  DEBUG - lient.params.DefaultHttpParams - Set parameter http.method.response.buffer.warnlimit = 10485760 


问题定位
项目里配置了多个日志组件,log4j\slf4j\commons-logging
不知道到底是哪个组件打印的。

看commons-httpclient的官方说明,用的是commons-logging组件。
引用

Being a library HttpClient is not to dictate which logging framework the user has to use. Therefore HttpClient utilizes the logging interface provided by the Commons Logging package. Commons Logging provides a simple and generalized log interface to various logging packages. By using Commons Logging, HttpClient can be configured for a variety of different logging behaviours. That means the user will have to make a choice which logging framework to use. By default Commons Logging supports the following logging frameworks:

    Log4J
    java.util.logging
    SimpleLog (internal to Commons Logging)


而commons-logging,如果有其它的日志组件,会自动的适配到其它的日志组件,比如log4j\slf4j等。
到底是哪一个呢?
commons-logging官方文档说,可以打印commons-logging的诊断信息。眼泪哗哗的,一个项目作的优秀不优秀,细节上就能体现出来。
在执行代码的第一行,加入以下属性。
		System.setProperty("org.apache.commons.logging.diagnostics.dest", "JCL.log");

或者配置到eclipse里,


会在项目根目录下生成JCL.log文件。
[LogFactory from sun.misc.Launcher$AppClassLoader@1435494339] Created object org.apache.commons.logging.impl.LogFactoryImpl@808460461 to manage classloader sun.misc.Launcher$AppClassLoader@1435494339
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] Discovering a Log implementation...
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] Trying to get configuration for item org.apache.commons.logging.Log.allowFlawedContext
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] No LogFactory attribute found for org.apache.commons.logging.Log.allowFlawedContext
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] No system property found for property org.apache.commons.logging.Log.allowFlawedContext
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] No configuration defined for item org.apache.commons.logging.Log.allowFlawedContext
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] Trying to get configuration for item org.apache.commons.logging.Log.allowFlawedDiscovery
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] No LogFactory attribute found for org.apache.commons.logging.Log.allowFlawedDiscovery
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] No system property found for property org.apache.commons.logging.Log.allowFlawedDiscovery
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] No configuration defined for item org.apache.commons.logging.Log.allowFlawedDiscovery
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] Trying to get configuration for item org.apache.commons.logging.Log.allowFlawedHierarchy
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] No LogFactory attribute found for org.apache.commons.logging.Log.allowFlawedHierarchy
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] No system property found for property org.apache.commons.logging.Log.allowFlawedHierarchy
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] [ENV] No configuration defined for item org.apache.commons.logging.Log.allowFlawedHierarchy
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] Trying to get log class from attribute 'org.apache.commons.logging.Log'
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] Attempting to load user-specified log class 'org.apache.commons.logging.impl.Log4JLogger'...
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] Attempting to instantiate 'org.apache.commons.logging.impl.Log4JLogger'
[LogFactoryImpl@808460461 from sun.misc.Launcher$AppClassLoader@1435494339] Trying to load 'org.apache.commons.logging.impl.Log4JLogger' from classloader sun.misc.Launcher$AppClassLoader@1435494339

看到了吧,使用的是log4j。
既然使用的是log4j,那问题还挺麻烦,项目里的多个jar包里,都有log4j的配置文件,
用的到底是哪一个呢?
stackoverflow上的大神说,加一个启动参数
引用

java -Dlog4j.debug

对我们来说,加到eclipse里,如图


再次运行测试用例,多了下面的内容
log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@558fe7c3.
log4j: Using URL [jar:file:/xxxx1.0-SNAPSHOT.jar!/log4j.xml] for automatic log4j configuration.
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator
log4j: System property is :null
log4j: Standard DocumentBuilderFactory search succeded.
log4j: DocumentBuilderFactory is: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
log4j: debug attribute= "null".
log4j: Ignoring debug attribute.
log4j: reset attribute= "false".
log4j: Threshold ="null".
log4j: Level value for root is  [].
log4j: root level set to DEBUG
log4j: Class name: [org.apache.log4j.ConsoleAppender]
log4j: Setting property [encoding] to [UTF-8].
log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
log4j: Setting property [conversionPattern] to [[%7r] %6p - %30.30c - %m 
].
log4j: Adding appender named [CONSOLE] to category [root].
log4j: Class name: [org.apache.log4j.FileAppender]
log4j: Setting property [append] to [false].
log4j: Setting property [file] to [/xxx-debug.log].
log4j: Setting property [encoding] to [UTF-8].
log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
log4j: Setting property [conversionPattern] to [%d [%7r] %6p - %30.30c - %m 
].
log4j: setFile called: /xxx-debug.log, false
log4j: setFile ended
log4j: Adding appender named [FILE-DEBUG] to category [root].

看到了吧,我们用的哪个jar包的log4j的配置文件

log4j: Using URL [jar:file:/xxxx1.0-SNAPSHOT.jar!/log4j.xml] for automatic log4j configuration.

解决办法
找那个jar包的提供者,或者动态修改log4j的属性。
http://blog.csdn.net/attilax/article/details/21157659
引用

项目里面也许有log4j.xml,这个的优先级比property的高
删除或者reset cfg
//        core.logger.info("xxx");
//        org.apache.log4j.LogManager.resetConfiguration();
//        org.apache.log4j.PropertyConfigurator
//                .configure("D:\\workspace\\imServer\\src\\log4j.properties");
//        core.logger("xxxt");
//
//        // (2)重新设置属性
//
//        Properties log4jCfg = log4jloadAgain.getLog4jProperties();
//
//        PropertyConfigurator.configure(log4jCfg);
//
//        core.logger.info("xxxt3");
//        log.info("xx4");
        core.logger.info("xx");



方便你加参数
-Dlog4j.debug 
-Dorg.apache.commons.logging.diagnostics.dest=JCL.log
  • 大小: 386 KB
  • 大小: 387.4 KB
分享到:
评论

相关推荐

    (zt)Commons-logging + Log4j 入门指南

    Log4j的配置文件(log4j.properties或log4j.xml)使得你可以精细控制日志的输出格式和目的地。 接下来,我们来看看如何在项目中集成这两个库: 1. 添加依赖:确保你的项目中包含Apache Commons Logging和Log4j的...

    Commons-logging + Log4j 使用

    `log4j`则是Apache的一个开源项目,它提供了丰富的日志功能,包括不同级别的日志记录(DEBUG, INFO, WARN, ERROR, FATAL, ALL 和 OFF),支持输出到控制台、文件、网络、数据库等多种目的地,还可以通过配置文件灵活...

    commons-logging和Log4j的关系

    标题中的“commons-logging”和“Log4j”是两个在Java编程中广泛使用的日志处理框架。它们在日志管理领域中各自扮演着不同的角色,而它们之间的关系则涉及到日志实现的抽象与具体实现的层次问题。 首先,让我们了解...

    log4j.jar和commons-logging.jar

    "log4j.jar" 和 "commons-logging.jar" 是两个非常著名的Java日志库,它们在Java日志处理中扮演着核心角色。 **log4j.jar** 是Apache软件基金会开发的一个开源日志框架,它为Java应用程序提供了灵活的日志记录解决...

    commons-logging-1.2-bin.zip下载

    此外,如果你的项目已经使用了其他日志框架,比如Log4j,那么Commons Logging会自动识别并使用它,避免了日志冲突的问题。 总结来说,Apache Commons Logging-1.2是一个为Java应用程序提供日志服务的工具包,它的...

    log4j-1.2.14和commons-logging-1.1

    Log4j和Commons Logging是两个非常流行且实用的日志框架,广泛应用于各种Java应用程序。 **Log4j** 是Apache软件基金会的一个开源项目,它为Java程序员提供了一种强大的日志API。Log4j 1.2.14是该框架的一个较旧...

    commons-logging-1.2_commonslogging_

    2. 配置日志实现,可以通过设置`java.util.logging.config.file`、`log4j.configuration`等系统属性,或者在类路径下放置适当的配置文件(如log4j.properties)。 3. 在代码中获取并使用Logger,如`Logger logger = ...

    日志框架学习之一:commons-logging+log4j

    1. **安装与配置**:介绍如何在项目中引入commons-logging和log4j的依赖,并设置相应的配置文件,如log4j.properties或log4j.xml。 2. **使用API**:讲解如何在代码中通过commons-logging接口来调用log4j的记录方法...

    commons-logging.jar log4j.jar

    总的来说,commons-logging和log4j是Java开发中的重要工具,它们使得日志管理更加灵活、高效,对于排查问题、维护系统稳定性和提升开发效率具有不可忽视的价值。在项目中正确地集成和使用这两个库,可以极大地提升你...

    Java日志学习一:Log4j和commons-logging的关系

    Log4j和commons-logging是两个常见的日志框架,它们之间存在紧密的关系。本文将深入探讨这两个组件,以及它们在Java日志系统中的作用。 首先,Log4j是由Apache组织开发的一个强大的日志处理库,它提供了丰富的日志...

    log4j与commons-logging-1.0.4.jar

    Log4j和Commons Logging是两个非常流行且实用的日志记录库,它们各自拥有独特的功能和优势,而在某些情况下,它们可以协同工作,提供更灵活的日志解决方案。 首先,Log4j是由Apache软件基金会开发的一个开源日志...

    commons-logging-1.2.jar

    这个库允许开发者选择底层的日志实现,如Log4j、Java内置的日志API(java.util.logging)或者其他第三方日志系统,而无需修改代码。它的核心概念是提供一种抽象,使得应用代码与特定的日志实现解耦,从而增强了灵活...

    poi-3.6-20091214.jar commons-logging-1.1.jar junit-3.8.1.jar log4j-1.2.13.jar

    4. Log4j:广泛采用的Java日志框架,提供了丰富的日志控制和配置选项。 5. Excel处理:可能涉及到使用Apache POI和用户自定义的"exceljar"来操作Excel文件,例如读取数据、生成报告等。 这些组件常常在企业级Java...

    commons-logging-1.1.3-bin.zip

    标题“commons-logging-1.1.3-bin.zip”表明这是Apache Commons Logging的1.1.3版本的二进制发布包,通常包含编译好的jar文件以及可能的配置文件和文档。这个版本可能修复了前一版本的一些已知问题,并可能引入了...

    commons-logging-1.2-bin.zip

    为了设置默认的日志实现,可以在项目的类路径中包含相应的配置文件,如Log4j的`log4j.properties`或Java内置日志系统的`logging.properties`。 总的来说,Apache Commons Logging是一个非常实用的工具,它降低了...

    commons-logging-1.1.1.jar和java-unrar-0.3.jar

    它的主要目的是提供一个抽象层,使得开发人员可以在不修改代码的情况下,选择和切换不同的日志实现(如log4j、java.util.logging或commons-logging自身的SimpleLog)。通过引入Commons Logging,"java-unrar-0.3.jar...

    commons-logging-1.2-bin2014最新版

    Apache Commons Logging 是一个Java日志框架的抽象层,它允许应用程序使用多种不同的日志实现,如Log4j、Java Util Logging或JDK14 Logging。标题提到的"commons-logging-1.2-bin2014最新版"是Apache Commons ...

    commons-modeler-XXX.jar、commons-logging-XXX.jar

    Apache Commons Logging是另一个关键的Java库,它提供了一个统一的日志接口,让开发者可以轻松地切换不同的日志实现,如Log4j、Java内置的java.util.logging或Simple Logging Facade for Java (SLF4J)。这个库的主要...

    java日志记录组件log4j-1.2.14和commons-logging-1.1.1

    Java日志记录是开发过程...总的来说,Log4j和Commons-Logging是Java开发中日志管理的重要工具,它们可以帮助开发者更好地监控应用程序,定位问题,并提供详细的运行日志,对于任何Java项目来说都是不可或缺的组成部分。

Global site tag (gtag.js) - Google Analytics