禁用 HttpClient 日志记录

我在一个集成测试套件中使用 commons-httpclient3.1。HttpClient的默认日志记录非常嘈杂,我似乎无法关闭它。我试着按照说明 给你操作,但是没有一个有效。

通常我只需要关闭 org.apache.http.wire 日志记录器。问题的一部分在于我不知道 HttpClient试图使用哪种类型的日志记录器。我从没用过这个图书馆。我尝试创建一个 log4j.properties 文件并将其放到我的 test/resources 文件夹中,修改 jre/lib中的主 logging.properties 文件,并按照 日志页面中的指定将各种日志选项发送给 Maven,但它们都没有任何作用。

更新: 一个更正: 看起来有问题的输出实际上是源于 jwebunit 对 HttpClient的使用,而不是我自己的。不管怎样,这都是不可取的。

更新: 感谢迄今为止的尝试。我试了下面建议的所有方法,但仍然没有效果。我有一个文件 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

然而,当我运行我的测试时,我仍然会得到这样的输出:

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

这个输出的一切,通过线路是使这个库不可用的我... 这是直到我可以找出如何关闭它。要读入这个日志配置,我需要做什么特别的事情吗?

128527 次浏览

在您的 log4.properties 中——您是否像我下面所做的那样设置了这个集合,并且在文件中没有设置其他 org.apache.http日志记录器?

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

另外,如果在 log4j 属性文件中没有为 org.apache.http指定任何日志级别,那么它将继承 log4j.rootLogger级别。因此,如果将 log4j.rootLogger设置为 ERROR,并在 log4j.properties 中取出 org.apache.http设置,那么应该只通过继承记录 ERROR消息。

更新:

创建一个 commons-logging.properties文件并向其中添加以下代码行。同时确保该文件在 CLASSPATH 中。

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

添加了一个完整的 log4j 文件以及为 OP 调用它的代码。这个 log4j.properties 应该在您的 CLASSPATH 中。我暂时接受标准输出。

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

下面是需要添加到类中以调用日志记录器的一些代码。

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
}

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

  • 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 日志记录,需要遵循以下步骤

  • 确定要使用的基础日志框架。从历史上看,通常的选择是 log4jjava.util.logging。在2022年,常见的选择是 LogBack(也是 Spring 框架的默认值)。

  • 设置 commons-log 属性文件以指向正确的 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.
    使用 Slf4J:
    org.apache.commons.logging.Log=org.apache.logging.slf4j.SLF4JLogger

    这些属性也可以设置为系统属性(例如,在命令行上使用 -D)。

  1. 配置底层日志实现(例如 log4j) ,忽略您不想要的消息,并输出您想要的消息。

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

这对我的测试有效;

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.logger.org.apache.http.wire=WARN

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

我是在寻找类似问题的解决方案时被引导到这个职位的。蒂姆的回答很有帮助。就像 Matt Baker 一样,我只想在没有太多配置的情况下关闭 httpClient 日志。

由于我们不确定在公共日志记录下使用了哪种日志记录实现,我的解决方案是通过在类路径中抛出 log4jjar 文件来强制使用 log4j。Log4j 配置的默认设置将关闭 common-httpclient 调试输出。当然,为了使其更加健壮,您可以创建公共日志记录。Properties 和 log4j.properties 文件,以进一步定义日志记录配置。

更新 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.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"));

我们使用 XML 而不是属性文件来配置日志输出。下面的代码可以让这段对话安静下来。

<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 并添加 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>

我对 JWebUnit 也有同样的问题。请注意,如果使用二进制分发,则 Logback 是默认的日志记录器。为了在 JWebUnit 中使用 log4j,我执行了以下步骤:

  • 取出后退罐
  • 为 sfl4j-slf4j-log4j12-1.6.4. jar 添加 lod4j 桥库
  • 添加 log4j.properties

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

我们花了很长时间才发现这一点,但是 JWebUnit 与 后退日志组件捆绑在一起,所以它甚至不会使用 log4j.propertiescommons-logging.properties

相反,创建一个名为 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 问题

我花了很长时间才想明白,你需要这个:

log4j.logger.httpclient.wire=ERROR

我猜 HttpClient 使用“ HttpClient.wire”作为它的日志记录器名称,而不是“ org.apache.comms.HttpClient”。

鬼鬼祟祟的家伙。

简单的方法 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();

试试放

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

在你的 commons-logging.properties

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

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

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

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

对于日志回退,以下 logback.xml将消除噪音:

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

它可能是由引入日志配置的依赖关系引起的(它们实际上不应该引入日志配置,除非它是一个应该这样做的框架)。

同样的问题困扰我已经有一段时间了,我最终决定调查一下这件事。

事实证明,问题在于我的项目依赖于 http-builder-0.5.2.jar,而 http-builder-0.5.2.jar在自身内部捆绑了一个 log4j.xml文件。果然,org.apache.http.wire 的日志级别是 DEBUG!我找到它的方法是遍历我的依赖项中的所有 jar 文件并执行“ jar tvf”和 greping for log4j。

虽然这个发现最终解决了将我的 http-builder依赖关系版本提升到0.6的问题,但是当把 log4j.xml文件捆绑到 jar 文件中时,开发人员的想法还是让我感到困惑。不管怎样,这可能和这个帖子暂时无关。但是我觉得提到我发现的这个解决方案是有用的,因为之前我在寻找一个解决方案的时候,我的方案从来没有出现过。希望有人会发现这个有用。

我发现的最佳解决方案是使用 maven 强制程序插件,以防止公共日志记录被完全使用。然后,我为日志添加了 slf4j 依赖项。因此,将以下内容添加到 pom.xml 中

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

还要加入 maven 强制执行器插件

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

在 log4j 属性文件中添加以下行,它将关闭 http 日志:-log4j.logger.org.apache.http = OFF

在为我的休息模板设置 HttpComponent entClientHttpRequestFactory 之后,我遇到了这样的问题。

设置 OkHttpClientHttpRequestFactory 可以解决垃圾日志记录的问题。

只需在 pom 文件中添加这两个依赖项: 经过以前的讨论,我已经尝试过并且成功了。

<!--Using logback-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>

共用-日志-> 登录和默认信息,而调试将不存在; 你可使用:

private static Logger log = LoggerFactory.getLogger(HuaweiAPI.class);

定义要记录的信息 最终结果 只有我要记录的信息才会显示。

对于 Apache HttpClient 4.5.3,如果希望将所有 Apache 日志记录的级别移动到 警告,请使用:

log4j.logger.org.apache=WARN

我在使用 RestAssure 和 JUnit 时遇到了这个问题,对我来说,这种编程方法奏效了:

@BeforeClass
public static void setUpClass() {
ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory.getLogger("org.apache.http");
root.setLevel(ch.qos.logback.classic.Level.INFO);


//...
}

我尝试了以上所有的解决方案,但都无济于事。对我来说最接近的一个解决方案是建议创建 logback.xml。但是没有任何记录。在使用 logback.xml 之后,这就是我最终得到的结果

<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>

现在 DEBUG 以下的所有级别都正确记录。

配合:

  • Log2J22.11.2
  • HttpClient 4.5.7(elasticsearch 7.0.0 rest 客户端)
  • 使用属性文件进行配置

人们可以补充说:

logger.httpclient.name=org.apache.http
logger.httpclient.level=info

上面示例中的“ httpclient”是您选择的逻辑名称。

(在 Java11OpenFX 应用程序上进行测试。)

我也遇到了同样的问题。在运行测试时,整个控制台都充满了 [main] DEBUG org.apache.http.wire

对我有效的解决方案是创建一个 < strong > logback-test. xml Src/test/resources/logback-test.xml ,如 https://github.com/bonigarcia/webdrivermanager-examples/blob/master/src/test/resources/logback-test.xml(ref-https://github.com/bonigarcia/webdrivermanager/issues/203)所示

为了查看日志信息,我将 logger name = “ io.github.bonigarcia”替换为包名

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>


<logger name="com.mypackage" level="DEBUG" />
<logger name="org" level="INFO" />
<logger name="com" level="INFO" />


<root level="INFO">
<appender-ref ref="STDOUT" />
</root>


</configuration>

在我的例子中,我使用 xml 配置,并将其附加到配置文件

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

尝试“ log4j.logger.org.apache.http.headers = ERROR”

对于我来说,log4j.properties文件中的下面几行清除了 HttpClient 日志记录带来的所有混乱... ... 万岁! ! !:)

log4j.logger.org.apache.http.headers=ERROR
log4j.logger.org.apache.http.wire=ERROR
log4j.logger.org.apache.http.impl.conn.PoolingHttpClientConnectionManager=ERROR
log4j.logger.org.apache.http.impl.conn.DefaultManagedHttpClientConnection=ERROR
log4j.logger.org.apache.http.conn.ssl.SSLConnectionSocketFactory=ERROR
log4j.logger.org.springframework.web.client.RestTemplate=ERROR
log4j.logger.org.apache.http.client.protocol.RequestAddCookies=ERROR
log4j.logger.org.apache.http.client.protocol.RequestAuthCache=ERROR
log4j.logger.org.apache.http.impl.execchain.MainClientExec=ERROR
log4j.logger.org.apache.http.impl.conn.DefaultHttpClientConnectionOperator=ERROR

对我来说,这是一个非常简单的解决方案:

我必须在 POM.xml 中添加 log4j 依赖关系,这解决了不必要的日志记录。

	  <dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.1</version>
</dependency>

在类的根路径中添加“ logback.xml”并在设置下面添加,这对我来说是可行的。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<logger name="org.apache" level="WARN"/>
<logger name="httpclient" level="WARN"/>
</configuration>

这招对我很管用。

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.header", "error");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "error");
System.setProperty("log4j.logger.org.apache.http", "error");
System.setProperty("log4j.logger.org.apache.http.wire", "error");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient", "error");

因为即使在搜索 log4j2解决方案时,Google 也在这方面处于领先地位,下面是您可以使用的解决方案。在 Loggers标签中将以下 XML代码片段添加到 log4j2.xml中:

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

org.apache.httpcomponents:httpclient:4.5.13org.apache.logging.log4j:log4-core:2.14.1工作。

只需要首先检查 pom.xml 文件,并在需要时相应地进行更新。当你在屏幕上多次看到“ [ main ] DEBUG org.apache.http.wire”时,就让它完全发生,什么也不做,慢慢来。只要看一下你的屏幕... 它很快就会开始运行你的套件。

谢谢

对于 Spring (启动)用户:

Spring 可以从 logback-spring.xml加载日志配置,以支持 Spring“扩展”(目前只支持基于配置文件的日志级别)。

在发现 logback-spring.xml会导致 HttpClient 日志记录无法提高级别之前,我花了几个小时进行试验。

重命名为 logback.xml终于起作用了。

(我认为这是一个不同的原因,值得我们自己去回答。)