【问题标题】:Disable logging of apache HTTP Client?禁用 apache HTTP 客户端的日志记录?
【发布时间】:2011-07-07 03:49:39
【问题描述】:

我正在编写一个应用程序,在该应用程序中我使用 HTTP 协议将文件上传到服务器。一切正常,我可以上传文件,我使用 Apache HTTP 客户端 jar 集来完成此操作。在应用程序中,我使用了设置为 DEBUG 级别的 log4j 日志框架,默认情况下,Apache HTTP 客户端也采用了具有相同日志级别的相同日志框架,并且它产生了大量的日志。谁能指导我如何禁用 apache Http 客户端的日志记录?

我在 XML 文件名 log4j.xml 的帮助下配置 log4j。

【问题讨论】:

    标签: java apache http log4j


    【解决方案1】:

    给出的答案是人们回答他们甚至不理解的问题的好例子。他们只是重复他们在糟糕的文档中听到或读到的内容,比如来自 Apache HTTP 客户端的文档。比如:

    <logger name="org.apache.commons.httpclient">
      <level value="warn"/> 
    </logger>
    

    如果Apache HTTP客户端的文档是正确的应该做什么。在这种情况下,这个问题的发布者会自己解决问题。给出如此糟糕的答案是一种侮辱。

    问题是,虽然文档说:

    每个类都有自己的日志,根据类的完全限定名称命名。 例如,类 HttpClient 有一个名为 org.apache.commons.httpclient.HttpClient 的日志。 由于所有类都遵循此约定,因此可以为 所有类都使用名为 org.apache.commons.httpclient 的单个日志。

    这根本不是真的。

    比给出答案更好的是展示如何自己找到它。要找到解决方案,您必须首先在日志中启用位置以查看日志发生的位置。然后日志将显示如下一行:

    2013-02-07 15:33:02,369 DEBUG [Some thread name] org.apache.commons.httpclient.Wire.wire(Wire.java:84) - << "[\r]"
    

    这表明日志记录发生在类 Wire.java 中,第 84 行。然后您可以在您喜欢的 IDE 中打开源代码,您将看到以下内容:

    80    if (buffer.length() > 0) {
    81        buffer.append("\"");
    82        buffer.insert(0, "\"");
    83        buffer.insert(0, header);
    84        log.debug(buffer.toString()); // Log is happening here
    85    }
    

    日志变量保存记录器。转到此变量接收其值的地方:

    52 /** Log for any wire messages. */
    53 private Log log;
    54 
    55 private Wire(Log log) {
    56    this.log = log;
    57 }
    

    您现在要做的就是在第 56 行设置一个断点并在调试器中运行您的应用程序。当它在第 56 行停止时,读取日志值。因为它是一个 Log 类型的对象,所以打开它看看它的“name”属性。您将看到名称“httpclient”。显然,Apache 的文档是错误的。

    现在您可以使用以下方法禁用此记录器:

    <logger name="httpclient">
      <level value="warn"/> 
    </logger>
    

    结论是:

    • 如果可能,学会为自己的问题寻找答案,而不是问。

    • 不要相信每个人所说的。通过完全限定的类名命名记录器是一种约定。像所有惯例一样,没有人有义务遵守它。 Apache 不会。

    • 不知道答案时不要回答问题。这只是噪音。

    【讨论】:

      【解决方案2】:

      您可以调整每个包的日志记录级别。这是来自http://wiki.apache.org/logging-log4j/Log4jXmlFormat 的示例:

      <logger name="com.eatmutton.muttonsite.torque" additivity="false">
         <level value="info" />
         <appender-ref ref="local-torque" />
      </logger>
      

      因此,即使您的默认级别是“调试”,对于 com.eatmutton.muttonsite.torque 包(和嵌套包)的类,级别也会是“信息” 因此,您需要找出 HTTP 客户端类所属的包并将此类记录添加到您的配置中。

      【讨论】:

        【解决方案3】:

        假设您使用的是 httpclient 4,不会在您的 log4j.xml 工作中添加类似 this 的内容:

        <logger name="org.apache.http">
          <level value="warn"/> 
        </logger>
        

        如果您没有 log4j.xml,请创建一个并将其添加到您的类路径中。

        如果您使用的是 httpclient 3,那么您必须使用类似的东西:

        <logger name="org.apache.commons.httpclient">
          <level value="warn"/> 
        </logger>
        

        在这些示例中,我将级别设置为 warn,您可以选择使用 none,但至少会出现 error明智的。

        【讨论】:

          猜你喜欢
          • 2014-01-09
          • 1970-01-01
          • 2016-05-22
          • 1970-01-01
          • 2013-11-11
          • 2013-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多