禁用 HttpClient 日志记录

我在集成测试套件中使用3.1。的默认日志记录非常嘈杂,我似乎无法将其关闭。我尝试过按照此处的说明进行操作,但都没有任何区别。commons-httpclientHttpClient

大多数情况下,我只需要让org.apache.http.wire logger闭嘴。部分问题是我不知道试图使用哪种类型的记录器。我以前从未使用过这个库。我尝试创建一个log4j.properties文件并将其放在我的test/resources文件夹中,修改jre/ lib中的master logging.properties文件,并将各种日志记录选项发送到Maven,如日志记录页面上指定的那样,它们都没有任何区别。HttpClient

更新:更正:似乎有问题的输出实际上是通过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

更新以包括: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>

使用 中的包名称将日志级别设置为 Log4j 将无法按预期工作WARNorg.apache.commons.httpclientlog4j.properties

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

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

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

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


推荐