禁用HttpClient日志记录

时间:2011-02-06 19:02:33

标签: java logging apache-commons-httpclient jwebunit

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

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

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

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

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

32 个答案:

答案 0 :(得分: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"));

答案 1 :(得分: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使用哪个日志库
  • 您可以按照these instructions
  • 创建commons-logging.properties文件来执行此操作
  • 配置commons-httpclient日志记录时要遵循的步骤是
    1. 确定要使用的基础日志框架。有很多选择,但log4jjava.util.logging可能是您的最佳选择。
    2. 设置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)。
    3. 配置基础日志记录实现(例如log4j)以忽略您不想要的消息,并输出您想要的消息。

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

答案 2 :(得分:18)

我将它放入我的log4j配置文件

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

这会将输出限制为警告级别或以上

答案 3 :(得分:16)

这适用于我的测试;

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

答案 4 :(得分:13)

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

答案 5 :(得分: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

答案 6 :(得分: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>

答案 7 :(得分:5)

在将RestAssured与JUnit一起使用时遇到此问题。对我来说,这种程序化方法有效:

id

答案 8 :(得分: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
}

答案 9 :(得分: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();

答案 10 :(得分:4)

在我的工作中,在类根路径和以下设置中添加“ logback.xml”。

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

答案 11 :(得分: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文件中时,它仍然困扰着开发人员的想法。无论如何,这可能与此线程无关。但我认为提到这个解决方案是有用的,因为我之前在搜索解决方案时,我从未提出过。希望有人会觉得这很有用。

答案 12 :(得分:3)

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

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

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

答案 13 :(得分:3)

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

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

答案 14 :(得分:2)

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

log4j.logger.org.apache=WARN

答案 15 :(得分:2)

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

答案 16 :(得分:2)

试试

org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
你的commons-logging.properties

中的

答案 17 :(得分:2)

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

答案 18 :(得分:1)

这对我有用。

    [WebMethod]
    public object getDataContacts()
    {

        SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Indigo2.Properties.Settings.Constr"].ConnectionString);

        SqlCommand cmd = new SqlCommand();

        cmd.CommandText = "SELECT [contid] ,cust.[cust_name] ,[first_name] ,[last_name] ,[email] FROM [Indigo].[dbo].[contacts] con LEFT JOIN [Indigo].[dbo].[customers] cust on con.custid = cust.custid";
        cmd.CommandType = CommandType.Text;
        cmd.Connection = con;
        con.Open();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        con.Close();
        DataSet ds = new DataSet();
        da.Fill(ds);

        object obj = new JavaScriptSerializer().DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(ds.Tables[0]));
        return obj;


    }

答案 19 :(得分: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(参考-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>

答案 20 :(得分:1)

已经有很多答案了。无论如何,我想写一些对我有用的东西,这样可以帮助任何人尝试。

我在 src/test/resources 中创建了一个 logback-test.xml,内容如下:

<configuration>
    <include resource="/org/springframework/boot/logging/logback/base.xml"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

在此之后开始构建,Junit runner 选择了上面提到的日志级别“信息”并且没有 org.apache.http 日志。

答案 21 :(得分:1)

这花了我很多年才弄明白,你需要这个:

log4j.logger.httpclient.wire=ERROR

我猜HttpClient使用&#34; httpclient.wire&#34;作为其记录器名称,而不是&#34; org.apache.commons.httpclient&#34;。

偷偷摸摸的小虫。

答案 22 :(得分: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>

答案 23 :(得分: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 - &gt;调试时不会出现Logback和默认信息; 您可以使用:

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

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

答案 24 :(得分: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以下的所有级别。

答案 25 :(得分:0)

使用:

  • Log2J 2 2.11.2
  • HttpClient 4.5.7(elasticsearch 7.0.0其余客户端)
  • 使用属性文件进行配置

一个可以添加:

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

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

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

答案 26 :(得分:0)

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

设置OkHttpClientHttpRequestFactory应解决垃圾邮件记录问题。

答案 27 :(得分:0)

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

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

答案 28 :(得分:0)

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

答案 29 :(得分:0)

对我来说,log4j prop文件中的以下行清除了所有来自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

答案 30 :(得分:0)

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

我必须在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>

答案 31 :(得分: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>