禁用HttpClient日志logging

我在集成testing套件中使用commons-httpclient 3.1。 HttpClient的默认日志logging非常嘈杂,我似乎无法closures它。 我试过按照这里的说明,但没有一个有所作为。

大多数情况下,我只需要让org.apache.http.wirelogging器闭嘴。 部分问题是我不知道HttpClient试图使用什么types的logging器,大部分的问题是我从来没有使用过这个库。 我试图创build一个log4j.properties文件,并将其放在我的testing/资源文件夹中,修改jre / lib中的master logging.properties文件,并将各种日志logging选项发送到Maven,如日志页上指定的,有什么区别。

任何帮助表示赞赏…这使我疯狂。

更新:一个更正:看起来问题的输出实际上源于jwebunit使用HttpClient,而不是我自己的。 无论哪种方式,这是不可取的。

更新:感谢迄今的尝试。 我已经尝试了以下build议,但仍然没有运气。 我有一个文件commons-logging.properties在我的src / test / resources文件夹下面的内容

org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory log4j.configuration=log4j.properties 

和一个文件log4j.properties与下面的内容在同一个文件夹中

 log4j.rootLogger=ERROR, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%c] %m%n #This is the line that should make httpclient shut up log4j.logger.org.apache.http=ERROR 

但是,当我运行我的testing时,我仍然得到一堆像这样的输出:

 21:57:41.413 [main] DEBUG org.apache.http.wire - << " [\r][\n]" 21:57:41.413 [main] DEBUG org.apache.http.wire - << "[\r][\n]" 21:57:41.413 [main] DEBUG org.apache.http.wire - << " [\r][\n]" 21:57:41.413 [main] DEBUG org.apache.http.wire - << " </ul>[\n]" 21:57:41.413 [main] DEBUG org.apache.http.wire - << " [\n]" 21:57:41.424 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.425 [main] DEBUG org.apache.http.wire - << "[\r][\n]" 21:57:41.425 [main] DEBUG org.apache.http.wire - << "[\r][\n]" 21:57:41.425 [main] DEBUG org.apache.http.wire - << " </div>[\r][\n]" 21:57:41.425 [main] DEBUG org.apache.http.wire - << " </li>[\r][\n]" 21:57:41.425 [main] DEBUG org.apache.http.wire - << " [\r][\n]" 21:57:41.425 [main] DEBUG org.apache.http.wire - << " [\r][\n]" 21:57:41.433 [main] DEBUG org.apache.http.wire - << " </ul>[\n]" 21:57:41.433 [main] DEBUG org.apache.http.wire - << "</div>[\n]" 21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.433 [main] DEBUG org.apache.http.wire - << "</div>[\n]" 21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.433 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.433 [main] DEBUG org.apache.http.wire - << "<div class="details">[\n]" 21:57:41.442 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.443 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.443 [main] DEBUG org.apache.http.wire - << "<div class="details-body details-precis ">[\n] " 21:57:41.443 [main] DEBUG org.apache.http.wire - << "<div class="details-state">[\n]" 21:57:41.443 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.443 [main] DEBUG org.apache.http.wire - << "</div>[\n]" 21:57:41.443 [main] DEBUG org.apache.http.wire - << "</div>[\n]" 21:57:41.443 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.455 [main] DEBUG org.apache.http.wire - << "</div>[\n]" 21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.455 [main] DEBUG org.apache.http.wire - << "</div>[\n]" 21:57:41.455 [main] DEBUG org.apache.http.wire - << "</div>[\n]" 21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\n]" 21:57:41.455 [main] DEBUG org.apache.http.wire - << "[\r][\n]" Destroying 1 processes21:57:41.465 [main] DEBUG org.apache.http.wire - << "[\r][\n]" 

这个输出是为了让这个库对我来说是不可用的,直到我能想出如何closures它。 有什么特别的我需要做的,以获得这个日志configuration读入?

更新log4j.properties以包含:

 log4j.logger.httpclient.wire.header=WARN log4j.logger.httpclient.wire.content=WARN 

请注意,如果未安装Log4j库,则HttpClient(因此将使用JWebUnit)将使用logback。 在这种情况下,创build或编辑logback.xml以包含:

 <configuration> <logger name="org.apache" level="WARN" /> <logger name="httpclient" level="WARN" /> </configuration> 

使用log4j.properties的软件包名称org.apache.commons.httpclient Log4j设置为WARN 将无法按预期工作

 log4j.logger.org.apache.commons.httpclient=WARN 

这是因为HttpClient(v3.1)的源使用以下日志名称:

 public static Wire HEADER_WIRE = new Wire(LogFactory.getLog("httpclient.wire.header")); public static Wire CONTENT_WIRE = new Wire(LogFactory.getLog("httpclient.wire.content")); 

注意:这个答案中的一些可能会重复你已经知道的事情(或者认为你知道的事情),但是这个问题上有一些错误的信息,所以我要从头开始,拼出来

  • Commons HttpClient使用Commons-Logging来满足所有的日志需求。
  • Commons-Logging不是一个完整的日志框架,而是一些现有日志框架的封装
  • 这意味着,当你想控制日志logging输出时,你(主要是)最终configuration一个库, 不是Commons-Logging, 但是因为Commons-Logging包装了其他几个库,所以我们很难猜测哪一个configuration不知道你准确的设置。
  • Commons-Logging可以login到log4j,但也可以login到java.util.logging (JDK1.4日志logging)
  • Commons-Logging试图很聪明,并猜测你正在使用哪个日志框架,并将日志发送给它。
  • 如果你还没有一个日志框架,并且运行在1.4或者更高版本的JRE上(你确实应该是这样),那么它可能会把它的日志消息发送到JDK logging( java.util.logging
  • 依赖Commons-Logging的自动发现机制很容易出错。 简单地将log4j.jar添加到类path将导致它切换使用哪种日志logging机制,这可能不是你想要的
  • 您最好明确告诉Commons-Logging使用哪个日志库
  • 您可以按照这些说明创buildcommons-logging.properties文件来完成此操作
  • 你想要遵循的步骤来configurationcommons-httpclient日志logging
    1. 决定要使用哪个基础日志logging框架。 有很多select,但可能log4jjava.util.logging是最好的select。
    2. 设置公共日志logging属性文件以指向正确的Log实现。 例如要使用log4j,把它放到属性文件中: org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger ,或者使用JDK日志logging设置org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger 。 这些也可以设置为系统属性(例如在命令行中使用-D )。
    3. configuration底层日志logging实现(例如log4j)忽略不需要的消息,并输出您想要的消息。

这是很多步骤,但这就是要做的。 Apache-commons的开发人员往往认为你已经configuration了一个日志框架,他们可以通过自动发现来确定它是哪一个。
如果这不是真的,那么让事情继续下去往往是更多的工作。

我把这个到我的log4jconfiguration文件

 log4j.logger.org.apache.http.wire=WARN 

这将输出限制在警告级别或更高级别

这对我的testing有效;

 java.util.logging.Logger.getLogger("org.apache.http.wire").setLevel(java.util.logging.Level.FINEST); java.util.logging.Logger.getLogger("org.apache.http.headers").setLevel(java.util.logging.Level.FINEST); System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog"); System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true"); System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire", "ERROR"); System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "ERROR"); System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.headers", "ERROR"); 

对于log4j,将以下内容添加到log4j.properties (在应用程序的source目录中):

 log4j.logger.org.apache=WARN log4j.logger.httpclient=WARN 

对于logback,下面的logback.xml会消除噪音:

 <configuration> <logger name="org.apache" level="WARN" /> <logger name="httpclient" level="WARN" /> </configuration> 

我们使用XML而不是一个属性文件来configuration我们的日志输出。 下面的代码工作沉默这个喋喋不休。

 <logger name="org.apache.commons.httpclient"> <level value="fatal"/> </logger> <logger name="httpclient.wire.header"> <level value="fatal"/> </logger> <logger name="httpclient.wire.content"> <level value="fatal"/> </logger> 

花了很长时间才发现这个问题,但JWebUnit与Logback日志logging组件捆绑在一起,所以它甚至不会使用log4j.propertiescommons-logging.properties

相反,创build一个名为logback.xml的文件,并将其放在源代码文件夹(在我的情况下, src ):

 <configuration debug="false"> <!-- definition of appender STDOUT --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender> <root level="ERROR"> <!-- appender referenced after it is defined --> <appender-ref ref="STDOUT"/> </root> </configuration> 

Logback看起来还在开发中,API似乎还在改变,所以这个代码示例将来可能会失败。 另请参阅此StackOverflow问题 。

一段时间以来,我一直在困扰同样的问题,最后决定研究这个问题。 事实certificate,问题是我的项目依赖于http-builder-0.5.2.jar,它捆绑了一个log4j.xml文件。 果然,org.apache.http.wire的日志级别是DEBUG! 我发现它只是通过我的依赖关系中的所有jar文件,并做“jar tvf”和gre4 log4j。

虽然这个发现导致了最终的解决scheme,把我的http-builder dependency的版本提高到了0.6,但是仍然困扰着我将log4j.xml文件绑定到jar文件时必须经过开发人员的头脑。 无论如何,这可能与此线程现在不相关。 但是我认为提及这个解决scheme是有用的,因为在我之前寻找解决scheme的时候,我从来没有出现过。 希望有人会觉得这有用。

在你的log4.properties – 你有没有这样的设置,如下所示,没有其他的org.apache.httplogging器设置在文件中?

 -org.apache.commons.logging.simplelog.log.org.apache.http=ERROR 

另外,如果在log4j属性文件中没有为org.apache.http指定任何日志级别,则它将inheritancelog4j.rootLogger级别。 所以,如果你有log4j.rootLogger设置让我们说错误,并取出你log4j.properties中的org.apache.http设置,应该使它只能通过inheritanceloggingERROR消息。

更新:

创build一个commons-logging.properties文件,并添加以下行。 还要确保这个文件在你的CLASSPATH中。

org.apache.commons.logging.LogFactory = org.apache.commons.logging.impl.Log4jFactory

添加了一个完整的log4j文件和代码来为OP调用它。 这个log4j.properties应该在你的CLASSPATH中。 我暂时假设stdout。

 log4j.configuration=log4j.properties log4j.rootLogger=ERROR, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%c] %m%n log4j.logger.org.apache.http=ERROR 

这里有一些你需要添加到你的类来调用logging器的代码。

 import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class MyClazz { private Log log = LogFactory.getLog(MyClazz.class); //your code for the class } 

我有与JWebUnit相同的问题。 请注意,如果您使用二进制分发,那么Logback是一个默认的logging器。 使用JWebUnit的log4j我执行以下步骤:

  • 删除Logbackjar子
  • 为sfl4j添加lod4j桥接库 – slf4j-log4j12-1.6.4.jar
  • 添加log4j.properties

可能你不必删除Logback jar,但是你需要一些额外的步骤来强制slf4j使用log4j

Log4j和HttpCLient的简单方法(在这种情况下,v3.1应该工作得更高,可能需要稍微改动)

确保所有的依赖关系是正确的,并且MD5你的下载!

 import org.apache.commons.httpclient.HttpClient; import org.apache.log4j.Level; import org.apache.log4j.Logger; --- Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.WARN); Logger.getLogger("httpclient.wire.header").setLevel(Level.WARN); Logger.getLogger("httpclient.wire.content").setLevel(Level.WARN); HttpClient client = new HttpClient(); 

以下两行完全解决了我的问题:

 Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.ERROR); Logger.getLogger("httpclient").setLevel(Level.ERROR); 

当我search类似问题的解决scheme时,我被引导到这个职位。 Tim的回答非常有帮助。 像Matt Baker,我只是想closureshttpClient日志而没有太多configuration。 由于我们不确定使用common-logging下的哪个日志logging实现, 我的解决scheme是通过在类path中引入log4j jar文件来强制使用log4j。 log4jconfiguration的默认设置closurescommon-httpclientdebugging输出。 当然,为了使它更健壮,你可以创buildcommon-logging.properties和log4j.properties文件来进一步定义你的日志configuration。

运行jwebunit集成testing时,我遇到了同样的问题。 我通过排除logback并添加到slf4j-log4j12来修复它,如下所示:

 <dependency> <groupId>net.sourceforge.jwebunit</groupId> <artifactId>jwebunit-htmlunit-plugin</artifactId> <version>3.0</version> <exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> 

这花了我很多时间来弄清楚,你需要这个:

 log4j.logger.httpclient.wire=ERROR 

我猜HttpClient使用“httpclient.wire”作为它的logging器名称,而不是“org.apache.commons.httpclient”。

鬼鬼祟祟的臭虫

试试吧

 org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog 

在你的commons-logging.properties

在log4j属性文件中添加以下行,并closureshttp日志: – log4j.logger.org.apache.http = OFF

我发现最好的解决scheme是使用maven执行者插件,以防止公共日志被完全使用。 然后,我添加了slf4j依赖日志logging。 因此,将以下内容添加到您的pom.xml中

 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>[your version here]</version> </dependency> 

并添加maven-enforcer插件

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>[your version here]</version> <executions> <execution> <id>enforce</id> <configuration> <rules> <DependencyConvergence /> <bannedDependencies> <excludes> <exclude>commons-logging:commons-logging</exclude> </excludes> </bannedDependencies> </rules> </configuration> <goals> <goal>enforce</goal> </goals> </execution> </executions> </plugin> 

为我的rest模板设置HttpComponentsClientHttpRequestFactory后,我遇到了这样的问题。

设置OkHttpClientHttpRequestFactory应该解决垃圾日志问题。