Mat*_*ker 123 java logging jwebunit apache-commons-httpclient
我在集成测试套件中使用commons-httpclient 3.1.HttpClient的默认日志记录非常嘈杂,我似乎无法将其关闭.我试过按照这里的说明,但没有一个有任何区别.
大多数情况下,我只需要关闭org.apache.http.wire记录器.问题的一部分是我不知道HttpClient尝试使用什么类型的记录器,大多数问题是我之前从未使用过这个库.我尝试创建一个log4j.properties文件并将其放在我的test/resources文件夹中,修改jre/lib中的master logging.properties文件,并按照日志页面上的指定将各种日志记录选项发送到Maven ,而不是它们都没有有所作为.
任何帮助表示赞赏......这让我疯狂.
更新:更正:看来有问题的输出实际上是通过jwebunit使用HttpClient而不是我自己的.无论哪种方式,这都是不可取的.
更新:感谢迄今为止的尝试.我已经尝试了下面提出的所有建议,但仍然没有运气.我在src/test/resources文件夹中有一个文件commons-logging.properties,其中包含以下内容
org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory
log4j.configuration=log4j.properties
Run Code Online (Sandbox Code Playgroud)
以及具有以下内容的同一文件夹中的文件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
Run Code Online (Sandbox Code Playgroud)
但是,当我运行我的测试时,我仍然得到一堆像这样的输出:
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]"
Run Code Online (Sandbox Code Playgroud)
对于我遇到的所有内容,这个输出使得这个库对我来说无法使用......直到我可以弄清楚如何关闭它.为了让这个日志配置读入,我需要做些什么特别的事情吗?
小智 81
更新log4j.properties包括:
log4j.logger.httpclient.wire.header=WARN
log4j.logger.httpclient.wire.content=WARN
Run Code Online (Sandbox Code Playgroud)
请注意,如果未安装Log4j库,HttpClient(以及JWebUnit)将使用logback.在这种情况下,创建或编辑logback.xml包括:
<configuration>
<logger name="org.apache" level="WARN" />
<logger name="httpclient" level="WARN" />
</configuration>
Run Code Online (Sandbox Code Playgroud)
设置日志级别来WARN使用包名的Log4j org.apache.commons.httpclient中log4j.properties 是行不通的预期:
log4j.logger.org.apache.commons.httpclient=WARN
Run Code Online (Sandbox Code Playgroud)
这是因为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"));
Run Code Online (Sandbox Code Playgroud)
Tim*_*Tim 27
注意:这个答案中的一些可能会重复你已经知道的事情(或者你认为你知道),但是在这个问题上有一些错误的信息,所以我将从一开始就把它全部拼出来
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的开发人员倾向于假设您已经配置了日志框架,他们可以通过自动发现来确定它是哪一个.
如果这对你不适用,那么让事情运转往往会有更多的工作.
Dan*_*son 18
这适用于我的测试;
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");
Run Code Online (Sandbox Code Playgroud)
Phi*_*nyy 18
我把它放到我的log4j配置文件中
log4j.logger.org.apache.http.wire=WARN
Run Code Online (Sandbox Code Playgroud)
这会将输出限制为警告级别或更高级别
Ali*_*ito 17
对于log4j,将以下内容添加到log4j.properties(在应用程序的source目录中):
log4j.logger.org.apache=WARN
log4j.logger.httpclient=WARN
Run Code Online (Sandbox Code Playgroud)
对于logback,以下logback.xml将消除噪音:
<configuration>
<logger name="org.apache" level="WARN" />
<logger name="httpclient" level="WARN" />
</configuration>
Run Code Online (Sandbox Code Playgroud)
jev*_*von 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>
Run Code Online (Sandbox Code Playgroud)
Logback看起来仍在开发中,并且API似乎仍在改变,因此此代码示例可能在将来失败.另请参阅此StackOverflow问题.
我们使用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>
Run Code Online (Sandbox Code Playgroud)
在将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);
//...
}
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
小智 5
我已经被同样的问题困扰了很长一段时间,最后决定研究这个问题。原来问题是我的项目依赖于 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 文件时,它仍然让我感到困惑。无论如何,目前这可能与该线程无关。但是我认为提及我发现的这个解决方案很有用,因为之前我在寻找解决方案时,我的从未出现过。希望有人会发现这很有用。
在您的 log4.properties 中 - 您是否像我下面那样设置了此设置,并且org.apache.http文件中没有设置其他记录器?
-org.apache.commons.logging.simplelog.log.org.apache.http=ERROR
Run Code Online (Sandbox Code Playgroud)
此外,如果您没有org.apache.http在 log4j 属性文件中指定任何日志级别,那么它将继承该 log4j.rootLogger级别。因此,如果您已log4j.rootLogger设置为 ERROR 并删除org.apache.httplog4j.properties 中的设置,则应使其仅ERROR通过继承来记录消息。
更新:
创建一个commons-logging.properties文件并向其中添加以下行。还要确保该文件位于您的 CLASSPATH 中。
org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory
添加了完整的 log4j 文件以及为 OP 调用它的代码。该 log4j.properties 应该位于您的 CLASSPATH 中。我暂时假设标准输出。
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
Run Code Online (Sandbox Code Playgroud)
以下是您需要添加到类中以调用记录器的一些代码。
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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
87214 次 |
| 最近记录: |