我在集成测试套件中使用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]"
对于我遇到的所有内容,这个输出使得这个库对我来说无法使用......直到我可以弄清楚如何关闭它。为了让这个日志配置读入,我需要做些什么特别的事情吗?
更新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"));
简单的方法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();
我已经被同样的问题困扰了很长一段时间,最后决定调查一下。原来问题是我的项目依赖于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文件中时,它仍然困扰着开发人员的想法。无论如何,这可能与此线程无关。但我认为提到这个解决方案是有用的,因为我之前在搜索解决方案时,我从未提出过。希望有人会觉得这很有用。
我和JWebUnit有同样的问题。请注意,如果使用二进制分发,则Logback是默认记录器。要将log4j与JWebUnit一起使用,我执行了以下步骤:
可能你不必删除Logback jar,但你需要一些额外的步骤来强制slf4j使用log4j
以下两行完全解决了我的问题:
Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.ERROR);
Logger.getLogger("httpclient").setLevel(Level.ERROR);
在寻找类似问题的解决方案时,我被引导到这篇文章。蒂姆的回答非常有帮助。像Matt Baker一样,我只是想在没有太多配置的情况下关闭httpClient日志。由于我们不确定使用common-logging下面的日志记录实现,我的解决方案是通过在类路径中抛出log4j jar文件来强制使用log4j。 log4j配置的默认设置会关闭common-httpclient调试输出。当然,为了使其更加健壮,您可以创建common-logging.properties和log4j.properties文件以进一步定义日志记录配置。
试用
org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
在你的commons-logging.properties中
在log4j属性文件中添加以下行,它将关闭http日志: - log4j.logger.org.apache.http = OFF
对于apache 4.5.3,如果要将所有apache http客户端日志记录的级别移动到Warn,请使用:
log4j.logger.org.apache=WARN
运行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>
这花了我很多年才弄清楚,你需要这个:
log4j.logger.httpclient.wire=ERROR
我想HttpClient使用“httpclient.wire”作为其记录器名称,而不是“org.apache.commons.httpclient”。
偷偷摸摸的小虫。
注意:这个答案中的一些可能会重复你已经知道的事情(或者你认为你知道),但是在这个问题上有一些错误的信息,所以我将从一开始就把它全部拼出来
java.util.logging
(JDK1.4日志记录)java.util.logging
)log4j.jar
添加到类路径中会导致它切换它使用的日志记录机制,这可能不是你想要的commons-logging.properties
创建these instructions文件来完成此操作log4j
或java.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的开发人员倾向于假设您已经配置了日志框架,他们可以通过自动发现来确定它是哪一个。 如果这对你不适用,那么让事情运转往往会有更多的工作。
我也遇到了同样的问题。在运行测试时,整个控制台充满了[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>
我发现的最佳解决方案是使用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>
在为我的其余模板设置HttpComponentsClientHttpRequestFactory后,我遇到了这样的问题。
设置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>
Commons-Logging - > Logback和默认Info,而Debug不存在;您可以使用:
private static Logger log = LoggerFactory.getLogger(HuaweiAPI.class);
定义您要记录的信息:像Final Result这样。只有我想要记录的信息才会出现。
我尝试了以上所有解决方案都无济于事。对我来说最接近的一个建议是建议创建一个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以下的所有级别都会正确记录。
附:
可以添加:
logger.httpclient.name=org.apache.http
logger.httpclient.level=info
上面示例中的“httpclient”是您选择的逻辑名称。
(在Java 11 OpenFX应用程序上测试过。)
在我的情况下,我使用xml配置,并将其附加到配置文件
<logger name="org.apache.http">
<level value="warn"/>
</logger>
试试'log4j.logger.org.apache.http.headers = ERROR'
我把它放到我的log4j配置文件中
log4j.logger.org.apache.http.wire=WARN
这会将输出限制为警告级别或更高级别
这适用于我的测试;
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.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>
发现这一点花了太长时间,但JWebUnit与Logback日志记录组件捆绑在一起,所以它甚至不会使用log4j.properties
或commons-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。
我们使用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>
我在使用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);
//...
}
在你的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
}