我在集成测试套件中使用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]"
这个输出的所有内容都让这个库对我无法使用......直到我能弄清楚如何关闭它。我需要做些什么特别的事情才能读入这个日志配置?
答案 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)
注意:这个答案中的一些可能会重复你已经知道的事情(或者你认为你知道),但是在这个问题上有一些错误的信息,所以我将从头开始并拼写出所有
java.util.logging
(JDK1.4日志记录)java.util.logging
)log4j.jar
添加到类路径会导致它切换它使用的日志记录机制,这可能不是你想要的commons-logging.properties
文件来执行此操作
log4j
或java.util.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
)。这是很多步骤,但这就是需要的。 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.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。
答案 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,但是你需要一些额外的步骤来强制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)
使用:
一个可以添加:
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>