禁用HttpClient日志记录

问题描述 投票:119回答:25

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

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

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

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

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

java logging apache-commons-httpclient jwebunit
25个回答
78
投票

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

使用WARN中的包名称org.apache.commons.httpclient将Log4j的日志级别设置为log4j.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"));

4
投票

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

4
投票

我已经被同样的问题困扰了很长一段时间,最后决定调查一下。原来问题是我的项目依赖于http-builder-0.5.2.jar,它将log4j.xml文件捆绑在自身中。果然,org.apache.http.wire的日志级别是DEBUG!我发现它的方式只是遍历我的依赖项中的所有jar文件,然后执行“jar tvf”并为log4j进行grepping。

虽然这一发现最终解决了将我的http-builder依赖版本提升到0.6的问题,但是当将log4j.xml文件捆绑到jar文件中时,它仍然困扰着开发人员的想法。无论如何,这可能与此线程无关。但我认为提到这个解决方案是有用的,因为我之前在搜索解决方案时,我从未提出过。希望有人会觉得这很有用。


3
投票

我和JWebUnit有同样的问题。请注意,如果使用二进制分发,则Logback是默认记录器。要将log4j与JWebUnit一起使用,我执行了以下步骤:

  • 删除了Logback jar
  • 为sfl4j添加lod4j桥库 - slf4j-log4j12-1.6.4.jar
  • 添加log4j.properties

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


3
投票

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

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

2
投票

在寻找类似问题的解决方案时,我被引导到这篇文章。蒂姆的回答非常有帮助。像Matt Baker一样,我只是想在没有太多配置的情况下关闭httpClient日志。由于我们不确定使用common-logging下面的日志记录实现,我的解决方案是通过在类路径中抛出log4j jar文件来强制使用log4j。 log4j配置的默认设置会关闭common-httpclient调试输出。当然,为了使其更加健壮,您可以创建common-logging.properties和log4j.properties文件以进一步定义日志记录配置。


2
投票

试用

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

在你的commons-logging.properties中


2
投票

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


2
投票

对于apache 4.5.3,如果要将所有apache http客户端日志记录的级别移动到Warn,请使用:

log4j.logger.org.apache=WARN

1
投票

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

1
投票

这花了我很多年才弄清楚,你需要这个:

log4j.logger.httpclient.wire=ERROR

我想HttpClient使用“httpclient.wire”作为其记录器名称,而不是“org.apache.commons.httpclient”。

偷偷摸摸的小虫。


26
投票

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

  • 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创建these instructions文件来完成此操作
  • 配置commons-httpclient日志记录时要遵循的步骤是 确定要使用的基础日志框架。有很多选择,但可能log4jjava.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的开发人员倾向于假设您已经配置了日志框架,他们可以通过自动发现来确定它是哪一个。 如果这对你不适用,那么让事情运转往往会有更多的工作。


1
投票

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

对我有用的解决方案是创建一个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>

0
投票

我发现的最佳解决方案是使用maven enforcer插件,以防止公共日志记录被完全使用。然后我添加了slf4j依赖项来进行日志记录。所以将以下内容添加到您的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>

0
投票

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

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


0
投票

只需在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>

Commons-Logging - > Logback和默认Info,而Debug不存在;您可以使用:

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

定义您要记录的信息:像Final Result这样。只有我想要记录的信息才会出现。


0
投票

我尝试了以上所有解决方案都无济于事。对我来说最接近的一个建议是建议创建一个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以下的所有级别都会正确记录。


0
投票

附:

  • Log2J 2 2.11.2
  • HttpClient 4.5.7(elasticsearch 7.0.0 rest client)
  • 使用属性文件进行配置

可以添加:

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

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

(在Java 11 OpenFX应用程序上测试过。)


0
投票

在我的情况下,我使用xml配置,并将其附加到配置文件

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

0
投票

试试'log4j.logger.org.apache.http.headers = ERROR'


18
投票

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

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

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


17
投票

这适用于我的测试;

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

15
投票

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

11
投票

发现这一点花了太长时间,但JWebUnit与Logback日志记录组件捆绑在一起,所以它甚至不会使用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似乎仍在改变,因此此代码示例可能在将来失败。另见this StackOverflow question


8
投票

我们使用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>

5
投票

我在使用RestAssured和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);

    //...
}

4
投票

在你的log4.properties中 - 你有这样的设置,就像我在下面做的那样,文件中没有设置其他org.apache.http记录器吗?

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

此外,如果您在log4j属性文件中没有为org.apache.http指定任何日志级别,那么它将继承log4j.rootLogger级别。因此,如果你设置log4j.rootLogger让我们说错误并在你的log4j.properties中取出org.apache.http设置,那么只能通过继承来记录ERROR消息。

更新:

创建一个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

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

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
}
© www.soinside.com 2019 - 2024. All rights reserved.