禁用HttpClient日志logging
我在集成testing套件中使用commons-httpclient 3.1。 HttpClient的默认日志logging非常嘈杂,我似乎无法closures它。 我试过按照这里的说明,但没有一个有所作为。
大多数情况下,我只需要让org.apache.http.wirelogging器闭嘴。 部分问题是我不知道HttpClient试图使用什么types的logging器,大部分的问题是我从来没有使用过这个库。 我试图创build一个log4j.properties文件,并将其放在我的testing/资源文件夹中,修改jre / lib中的master logging.properties文件,并将各种日志logging选项发送到Maven,如日志页上指定的,有什么区别。
任何帮助表示赞赏…这使我疯狂。
更新:一个更正:看起来问题的输出实际上源于jwebunit使用HttpClient,而不是我自己的。 无论哪种方式,这是不可取的。
更新:感谢迄今的尝试。 我已经尝试了以下build议,但仍然没有运气。 我有一个文件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
但是,当我运行我的testing时,我仍然得到一堆像这样的输出:
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]"
这个输出是为了让这个库对我来说是不可用的,直到我能想出如何closures它。 有什么特别的我需要做的,以获得这个日志configuration读入?
更新log4j.properties
以包含:
log4j.logger.httpclient.wire.header=WARN log4j.logger.httpclient.wire.content=WARN
请注意,如果未安装Log4j库,则HttpClient(因此将使用JWebUnit)将使用logback。 在这种情况下,创build或编辑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"));
注意:这个答案中的一些可能会重复你已经知道的事情(或者认为你知道的事情),但是这个问题上有一些错误的信息,所以我要从头开始,拼出来
- Commons HttpClient使用Commons-Logging来满足所有的日志需求。
- Commons-Logging不是一个完整的日志框架,而是一些现有日志框架的封装
- 这意味着,当你想控制日志logging输出时,你(主要是)最终configuration一个库, 而不是Commons-Logging, 但是因为Commons-Logging包装了其他几个库,所以我们很难猜测哪一个configuration不知道你准确的设置。
- Commons-Logging可以login到log4j,但也可以login到
java.util.logging
(JDK1.4日志logging) - Commons-Logging试图很聪明,并猜测你正在使用哪个日志框架,并将日志发送给它。
- 如果你还没有一个日志框架,并且运行在1.4或者更高版本的JRE上(你确实应该是这样),那么它可能会把它的日志消息发送到JDK logging(
java.util.logging
) - 依赖Commons-Logging的自动发现机制很容易出错。 简单地将
log4j.jar
添加到类path将导致它切换使用哪种日志logging机制,这可能不是你想要的 - 您最好明确告诉Commons-Logging使用哪个日志库
- 您可以按照这些说明创build
commons-logging.properties
文件来完成此操作 - 你想要遵循的步骤来configurationcommons-httpclient日志logging
- 决定要使用哪个基础日志logging框架。 有很多select,但可能
log4j
或java.util.logging
是最好的select。 - 设置公共日志logging属性文件以指向正确的
Log
实现。 例如要使用log4j,把它放到属性文件中:org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
,或者使用JDK日志logging设置org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
。 这些也可以设置为系统属性(例如在命令行中使用-D
)。 - configuration底层日志logging实现(例如log4j)忽略不需要的消息,并输出您想要的消息。
- 决定要使用哪个基础日志logging框架。 有很多select,但可能
这是很多步骤,但这就是要做的。 Apache-commons的开发人员往往认为你已经configuration了一个日志框架,他们可以通过自动发现来确定它是哪一个。
如果这不是真的,那么让事情继续下去往往是更多的工作。
我把这个到我的log4jconfiguration文件
log4j.logger.org.apache.http.wire=WARN
这将输出限制在警告级别或更高级别
这对我的testing有效;
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>
我们使用XML而不是一个属性文件来configuration我们的日志输出。 下面的代码工作沉默这个喋喋不休。
<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日志logging组件捆绑在一起,所以它甚至不会使用log4j.properties
或commons-logging.properties
。
相反,创build一个名为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问题 。
一段时间以来,我一直在困扰同样的问题,最后决定研究这个问题。 事实certificate,问题是我的项目依赖于http-builder-0.5.2.jar,它捆绑了一个log4j.xml文件。 果然,org.apache.http.wire的日志级别是DEBUG! 我发现它只是通过我的依赖关系中的所有jar文件,并做“jar tvf”和gre4 log4j。
虽然这个发现导致了最终的解决scheme,把我的http-builder dependency的版本提高到了0.6,但是仍然困扰着我将log4j.xml文件绑定到jar文件时必须经过开发人员的头脑。 无论如何,这可能与此线程现在不相关。 但是我认为提及这个解决scheme是有用的,因为在我之前寻找解决scheme的时候,我从来没有出现过。 希望有人会觉得这有用。
在你的log4.properties – 你有没有这样的设置,如下所示,没有其他的org.apache.http
logging器设置在文件中?
-org.apache.commons.logging.simplelog.log.org.apache.http=ERROR
另外,如果在log4j属性文件中没有为org.apache.http
指定任何日志级别,则它将inheritancelog4j.rootLogger
级别。 所以,如果你有log4j.rootLogger
设置让我们说错误,并取出你log4j.properties中的org.apache.http
设置,应该使它只能通过inheritanceloggingERROR
消息。
更新:
创build一个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
这里有一些你需要添加到你的类来调用logging器的代码。
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 }
我有与JWebUnit相同的问题。 请注意,如果您使用二进制分发,那么Logback是一个默认的logging器。 使用JWebUnit的log4j我执行以下步骤:
- 删除Logbackjar子
- 为sfl4j添加lod4j桥接库 – slf4j-log4j12-1.6.4.jar
- 添加log4j.properties
可能你不必删除Logback jar,但是你需要一些额外的步骤来强制slf4j使用log4j
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();
以下两行完全解决了我的问题:
Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.ERROR); Logger.getLogger("httpclient").setLevel(Level.ERROR);
当我search类似问题的解决scheme时,我被引导到这个职位。 Tim的回答非常有帮助。 像Matt Baker,我只是想closureshttpClient日志而没有太多configuration。 由于我们不确定使用common-logging下的哪个日志logging实现, 我的解决scheme是通过在类path中引入log4j jar文件来强制使用log4j。 log4jconfiguration的默认设置closurescommon-httpclientdebugging输出。 当然,为了使它更健壮,你可以创buildcommon-logging.properties和log4j.properties文件来进一步定义你的日志configuration。
运行jwebunit集成testing时,我遇到了同样的问题。 我通过排除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”作为它的logging器名称,而不是“org.apache.commons.httpclient”。
鬼鬼祟祟的臭虫
试试吧
org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
在你的commons-logging.properties
在log4j属性文件中添加以下行,并closureshttp日志: – log4j.logger.org.apache.http = OFF
我发现最好的解决scheme是使用maven执行者插件,以防止公共日志被完全使用。 然后,我添加了slf4j依赖日志logging。 因此,将以下内容添加到您的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>
为我的rest模板设置HttpComponentsClientHttpRequestFactory后,我遇到了这样的问题。
设置OkHttpClientHttpRequestFactory应该解决垃圾日志问题。