禁用HttpClient日志记录

问题

我在集成测试套件中使用commons-httpclient 3.1。 HttpClient的默认日志记录非常嘈杂,我似乎无法将其关闭。我试过按照说明here,但没有一个有任何区别。

大多数情况下,我只需要关闭org.apache.http.wire记录器。问题的一部分是我不知道HttpClient尝试使用什么类型的记录器,大多数问题是我之前从未使用过这个库。我尝试创建一个log4j.properties文件并将其放在我的test / resources文件夹中,修改jre / lib中的master logging.properties文件,然后按照logging page的规定将各种日志记录选项发送到Maven,并且它们都没有生成任何文件区别。

任何帮助表示赞赏......这让我疯狂。

**更新:**A更正:看来有问题的输出实际上是通过jwebunit使用HttpClient而不是我自己的。无论哪种方式,这都是不可取的。

**更新:**感谢目前为止的尝试。我已经尝试了下面提出的所有建议,但仍然没有运气。我的src / test / resources文件夹中有一个文件commons-logging.properties,其中包含以下内容

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

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

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]"

对于我遇到的所有内容,这个输出使得这个库对我来说无法使用......直到我能弄清楚如何关闭它。我需要做些什么特别的事情才能读入这个日志配置?


#1 热门回答(69 赞)

更新log4j.properties包括:

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

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

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

使用程序包名称org.apache.commons.httpclientinlog4j.properties将Log4j的日志级别设置为363​​877434将无法正常工作

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"));

#2 热门回答(21 赞)

注意:这个答案中的一些可能会重复你已经知道的事情(或者你认为你知道),但是在这个问题上存在一些错误的信息,所以我将从一开始就把它全部拼出来 - Commons HttpClient使用Commons-Logging来满足其所有日志记录需求。

  • Commons-Logging不是一个完整的日志框架,而是几个现有日志框架的包装器
  • 这意味着当你想控制日志记录输出时,你(大部分)最终会配置除Commons-Logging之外的库,但由于Commons-Logging包含了其他几个库,我们很难猜测哪一个没有配置知道你的确切设置。
  • Commons-Logging可以登录到log4j,但也可以登录到java.util.logging(JDK1.4日志记录)
  • Commons-Logging试图变得聪明并猜测你正在使用哪个日志框架,并将其日志发送到该框架。
  • 如果你还没有日志记录框架,并且正在运行1.4或更高版本的JRE(你确实应该这样做),那么它可能会将其日志消息发送到JDK日志记录(java.util.logging)
  • 依赖Commons-Logging的自动发现机制容易出错。简单地将log4j.jar添加到类路径中会导致它切换它使用的日志记录机制,这可能不是你想要的
  • 你最好明确告诉Commons-Logging使用哪个日志库
  • 你可以通过按照这些说明创建commons-logging.properties文件来完成此操作
  • 配置commons-httpclient日志记录要遵循的步骤是决定要使用哪个底层日志记录框架。有很多选择,但log4j或java.util.logging可能是最好的选择。设置commons-logging属性文件以指向正确的Log实现。例如使用log4j,将其放入属性文件:org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger,或使用JDK日志集org.apache.commons.logging.Log = org .apache.commons.logging.impl.Jdk14Logger。这些也可以设置为系统属性(例如,在命令行上使用-D)。配置底层日志记录实现(例如log4j)以忽略你不想要的消息,并输出你想要的消息。

这是很多步骤,但这就是它需要的。 Apache-commons的开发人员倾向于假设你已经配置了日志框架,他们可以通过自动发现来确定它是哪一个。
如果这对你不适用,那么让事情运转起来往往会有更多的工作。


#3 热门回答(17 赞)

我把它放到我的log4j配置文件中

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

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