给出的答案是人们回答他们甚至不理解的问题的好例子。他们只是重复他们在糟糕的文档中听到或读到的内容,比如来自 Apache HTTP 客户端的文档。比如:
<logger name="org.apache.commons.httpclient">
<level value="warn"/>
</logger>
如果Apache HTTP客户端的文档是正确的应该做什么。在这种情况下,这个问题的发布者会自己解决问题。给出如此糟糕的答案是一种侮辱。
问题是,虽然文档说:
每个类都有自己的日志,根据类的完全限定名称命名。
例如,类 HttpClient 有一个名为 org.apache.commons.httpclient.HttpClient 的日志。
由于所有类都遵循此约定,因此可以为
所有类都使用名为 org.apache.commons.httpclient 的单个日志。
这根本不是真的。
比给出答案更好的是展示如何自己找到它。要找到解决方案,您必须首先在日志中启用位置以查看日志发生的位置。然后日志将显示如下一行:
2013-02-07 15:33:02,369 DEBUG [Some thread name] org.apache.commons.httpclient.Wire.wire(Wire.java:84) - << "[\r]"
这表明日志记录发生在类 Wire.java 中,第 84 行。然后您可以在您喜欢的 IDE 中打开源代码,您将看到以下内容:
80 if (buffer.length() > 0) {
81 buffer.append("\"");
82 buffer.insert(0, "\"");
83 buffer.insert(0, header);
84 log.debug(buffer.toString()); // Log is happening here
85 }
日志变量保存记录器。转到此变量接收其值的地方:
52 /** Log for any wire messages. */
53 private Log log;
54
55 private Wire(Log log) {
56 this.log = log;
57 }
您现在要做的就是在第 56 行设置一个断点并在调试器中运行您的应用程序。当它在第 56 行停止时,读取日志值。因为它是一个 Log 类型的对象,所以打开它看看它的“name”属性。您将看到名称“httpclient”。显然,Apache 的文档是错误的。
现在您可以使用以下方法禁用此记录器:
<logger name="httpclient">
<level value="warn"/>
</logger>
结论是: