【问题标题】:Disable HttpClient logging禁用 HttpClient 日志记录
【发布时间】:2011-06-22 08:56:59
【问题描述】:

我在集成测试套件中使用commons-httpclient 3.1。 HttpClient 的默认日志记录非常嘈杂,我似乎无法将其关闭。我已经尝试按照here 的说明进行操作,但它们都没有任何区别。

大多数情况下,我只需要让 org.apache.http.wire 记录器闭嘴。部分问题是我不知道HttpClient 正在尝试使用哪种类型的记录器。我以前从未使用过这个库。我尝试创建一个 log4j.properties 文件并将其放在我的 test/resources 文件夹中,修改 jre/lib 中的主 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]"

这个输出的所有东西都会让我无法使用这个库......直到我弄清楚如何关闭它。要读取此日志配置,我需要做些什么特别的事情吗?

【问题讨论】:

  • 所有遇到此问题的人:确保将-Dlog4j.debug 添加到您的VM 选项中,以确保加载正确的配置文件
  • 见stackoverflow.com/questions/1436761/…。摘录:public class Main { static { System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); } // Rest of class as before }
  • OP 解决了这个问题吗?这个确切的问题正在杀死我。
  • 解决了吗?尝试分配答案,没有运气。

标签: java logging apache-commons-httpclient jwebunit


【解决方案1】:

由于即使在搜索log4j2 解决方案时,Google 也会在此处领先,因此您可以使用以下方法。将以下XML 代码添加到log4j2.xml 的Loggers 标记中:

<logger name="org.apache.http" level="WARN"/>

为org.apache.httpcomponents:httpclient:4.5.13 和org.apache.logging.log4j:log4-core:2.14.1 工作。

【讨论】:

    【解决方案2】:

    已经有很多答案了。无论如何,我想写出对我有用的东西,这样它可以帮助任何人尝试。

    我在 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 日志。

    【讨论】:

      【解决方案3】:

      对我来说,log4j.properties 文件中的以下几行清除了来自 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
      

      【讨论】:

        【解决方案4】:

        这对我有用。

        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.header", "error");
        System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "error");
        System.setProperty("log4j.logger.org.apache.http", "error");
        System.setProperty("log4j.logger.org.apache.http.wire", "error");
        System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient", "error");
        

        【讨论】:

        • 先生,我需要把这些放在哪里?
        • @HikaruShindo 这应该作为初始化的一部分进入你的java代码
        【解决方案5】:

        在类根路径和下面的设置中添加“logback.xml”对我有用。

        <?xml version="1.0" encoding="UTF-8"?>
        <configuration>
            <logger name="org.apache" level="WARN"/>
            <logger name="httpclient" level="WARN"/>
        </configuration>
        

        【讨论】:

          【解决方案6】:

          对我来说这是非常简单的解决方案:

          我必须在我的 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>

          【讨论】:

          • 谢谢。这为我修好了。还得加&lt;dependency&gt; &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt; &lt;artifactId&gt;log4j-jcl&lt;/artifactId&gt; &lt;version&gt;${log4j.logging.version}&lt;/version&gt; &lt;/dependency&gt;
          【解决方案7】:

          试试 'log4j.logger.org.apache.http.headers=ERROR'

          【讨论】:

            【解决方案8】:

            在我的情况下,我使用 xml 配置,并将其附加到配置文件中

            <logger name="org.apache.http">
                <level value="warn"/>
            </logger>
            

            【讨论】:

              【解决方案9】:

              我也遇到了同样的问题。运行测试时,整个控制台都充满了[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>
              

              【讨论】:

                【解决方案10】:

                与:

                • Lo​​g2J 2 2.11.2
                • HttpClient 4.5.7(elasticsearch 7.0.0 休息客户端)
                • 使用属性文件进行配置

                可以添加:

                logger.httpclient.name=org.apache.http
                logger.httpclient.level=info
                

                上面示例中的“httpclient”是您选择的逻辑名称。

                (在 Java 11 OpenFX 应用程序上测试。)

                【讨论】:

                  【解决方案11】:

                  我尝试了上述所有解决方案均无济于事。对我来说最接近的一种解决方案是建议创建 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 以下的所有级别都可以正确记录。

                  【讨论】:

                    【解决方案12】:

                    我在使用带有 JUnit 的 RestAssured 时遇到了这个问题。对我来说,这种程序化方法很有效:

                    @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);
                    
                        //...
                    }
                    

                    【讨论】:

                    • 太棒了,唯一对我有用的解决方案。非常感谢。
                    • 谢谢!在测试方法开始时使用完全相同的代码,什么也没做。将它放在自己的 @Before 或 @BeforeClass 函数中效果很好。
                    • 唯一对我有用的解决方案。在 WebApplicationInitializer 中启动它。
                    • 如果您只是从主方法运行本地测试,这就是您所需要的 :) 谢谢!
                    【解决方案13】:

                    对于 apache 4.5.3,如果要将所有 apache http 客户端日志记录的级别移动到 Warn,请使用:

                    log4j.logger.org.apache=WARN
                    

                    【讨论】:

                      【解决方案14】:

                      只需在 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 和默认信息,而 Debug 将不存在; 您可以使用:

                      private static Logger log = LoggerFactory.getLogger(HuaweiAPI.class);
                      

                      定义你要记录的信息:like Final Result 像这样。只有我想记录的信息才会出现。

                      【讨论】:

                        【解决方案15】:

                        在为我的休息模板设置 HttpComponentsClientHttpRequestFactory 后,我遇到了这样的问题。

                        设置 OkHttpClientHttpRequestFactory 应该可以解决垃圾记录问题。

                        【讨论】:

                          【解决方案16】:

                          在 log4j 属性文件中添加以下行,它将关闭 http 日志:- log4j.logger.org.apache.http=OFF

                          【讨论】:

                          • 在单元测试中(如果是主要的,那么在主要的)还添加 @BeforeClass public static void BeforeClass() { PropertyConfigurator.configure("log4j.properties"); ...}log4j.properties 文件,其中单行 log4j.logger.org.apache.http=OFF 应该在根目录中(只是以上 src 文件夹)
                          【解决方案17】:

                          更新 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>
                          

                          使用 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"));
                          

                          【讨论】:

                          • 在 4.2.1 源码中,日志名称是:“org.apache.http.headers”和“org.apache.http.wire”,尽管使用它们,嘈杂的 apache 日志还是赢了似乎没有为我关闭。
                          • 谢谢!!!另外:如果您在自己的代码中的某个地方遇到此问题,您使用 httpclient 并且尚未使用 Log4j:还记得在类路径中包含 log4j jar ...
                          • 嗨,我们应该如何处理 log4j 的 xml 配置文件,谢谢。
                          【解决方案18】:

                          对于 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>
                          

                          【讨论】:

                          • 我正在使用 log4j。在日志求解器中添加前两行完全是我的问题。我的所有其他日志消息都根据我设置的级别显示。而apache日志没有。很大的帮助。谢谢。
                          • 它可能会根据您的情况而有所不同,但要禁用使用 AWS 开发工具包开箱即用的非常冗长的日志记录,这是唯一有效的方法。
                          【解决方案19】:

                          我发现的最佳解决方案是使用 maven 强制执行器插件,以防止完全使用公共日志记录。然后我添加了用于日志记录的 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>
                          

                          【讨论】:

                          • Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M2:enforce (enforce) on project gs-serving-web-content: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed
                          【解决方案20】:

                          我已经被同样的问题困扰了很长一段时间了,最​​后决定研究一下。事实证明,问题在于我的项目依赖于 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 文件中时,开发人员的想法仍然让我感到困惑。无论如何,这可能与这个线程现在无关。但我认为提及我发现的这个解决方案很有用,因为当我之前在寻找解决方案时,我的从来没有出现过。希望有人会发现这很有用。

                          【讨论】:

                          • 使用&lt;!-- https://mvnrepository.com/artifact/com.fredericboisguerin.excel/excel-reader-writer --&gt; &lt;dependency&gt; &lt;groupId&gt;com.fredericboisguerin.excel&lt;/groupId&gt; &lt;artifactId&gt;excel-reader-writer&lt;/artifactId&gt; &lt;version&gt;2.1&lt;/version&gt; &lt;/dependency&gt; 时出现类似问题。删除了依赖项,日志消失了。谢谢!
                          【解决方案21】:

                          注意:此答案中的某些内容可能会重复您已经知道(或认为您知道)的内容,但在此问题上存在一些错误信息,因此我将从头开始并拼写出来

                          • Commons HttpClient 使用 Commons-Logging 来满足其所有日志记录需求。
                          • Commons-Logging 不是一个完整的日志框架,而是几个现有日志框架的包装器
                          • 这意味着当您想要控制日志记录输出时,您(大多数情况下)最终会配置除 Commons-Logging 之外的库,但是因为 Commons-Logging 包含其他几个库,所以很难让我们在不知道您的确切设置的情况下猜测要配置哪一个。
                          • Commons-Logging 可以记录到 log4j,但也可以记录到java.util.logging(JDK1.4 记录)
                          • Commons-Logging 尝试智能并猜测您已经在使用哪个日志记录框架,并将其日志发送到该框架。
                          • 如果您还没有日志框架,并且在 1.4 或更高版本的 JRE 上运行(您确实应该这样做),那么它可能会将其日志消息发送到 JDK 日志 (java.util.logging)
                          • 依赖 Commons-Logging 的自动发现机制容易出错。简单地将log4j.jar 添加到类路径中会导致它切换它使用的日志记录机制,这可能不是你想要的
                          • 最好明确告诉 Commons-Logging 使用哪个日志库
                          • 您可以按照these instructions 创建一个commons-logging.properties 文件来执行此操作
                          • 配置 commons-httpclient 日志记录的步骤是
                            1. 确定您要使用的底层日志记录框架。有很多选择,但可能log4j 或java.util.logging 是最适合您的选择。
                            2. 设置公共日志记录属性文件以指向正确的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)。
                            3. 配置底层日志记录实现(例如 log4j)以忽略您不想要的消息,并输出您想要的消息。

                          这是很多步骤,但这就是它所需要的。 Apache-commons 的开发人员倾向于假设您已经配置了一个日志框架,并且他们可以通过自动发现来确定它是哪一个。
                          如果这对你来说不是真的,那么让事情运行起来往往需要更多的工作。

                          【讨论】:

                          • 这是非常有用的信息;我真的觉得它应该添加到这个page。你是为了这个才写的吗?
                          • 伙计,这个答案很棒,但我没能成功。我正在使用 Dropwizard,我尝试了您提到的所有内容,但无济于事:'(
                          【解决方案22】:

                          以下两行完全解决了我的问题:

                          Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.ERROR);
                          Logger.getLogger("httpclient").setLevel(Level.ERROR);
                          

                          【讨论】:

                          • 这对我也有用,但我不需要:Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.ERROR);
                          【解决方案23】:

                          试试看

                          org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
                          

                          在您的 commons-logging.properties 中

                          【讨论】:

                            【解决方案24】:

                            这适用于我的测试;

                            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");
                            

                            【讨论】:

                            • 你把它放在测试中了吗?
                            【解决方案25】:

                            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();
                            

                            【讨论】:

                            • 我应该把它放在main方法中吗?
                            • @parsecer 你可以
                            【解决方案26】:

                            这花了我很长时间才弄明白,你需要这个:

                            log4j.logger.httpclient.wire=ERROR
                            

                            我猜 HttpClient 使用“httpclient.wire”作为它的记录器名称,而不是“org.apache.commons.httpclient”。

                            鬼鬼祟祟的家伙。

                            【讨论】:

                              【解决方案27】:

                              发现这一点花了很长时间,但 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。

                              【讨论】:

                              • 你美。因为这件事,我差点杀了一只猫。这让我发疯了。
                              • 这就是我的解决方案。我认为这是因为我包含的其他库传递地包含了 logback,所以它被锁定到了这个记录器上。
                              【解决方案28】:

                              我在使用 JWebUnit 时遇到了同样的问题。请注意,如果您使用二进制分发,那么 Logback 是默认记录器。要将 log4j 与 JWebUnit 一起使用,我执行了以下步骤:

                              • 删除了 Logback jars
                              • 为 sfl4j 添加 lod4j 桥接库 - slf4j-log4j12-1.6.4.jar
                              • 添加 log4j.properties

                              可能您不必删除 Logback jar,但您需要一些额外的步骤来强制 slf4j 使用 log4j

                              【讨论】:

                              • 谢谢,我在使用 OpenRdf 时遇到了同样的问题。在我删除 logback jar 之前,此线程中的所有其他提示似乎都没有效果,现在日志非常安静。
                              【解决方案29】:

                              我在运行 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>
                              

                              【讨论】:

                                【解决方案30】:

                                我们使用 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>
                                

                                【讨论】:

                                  猜你喜欢
                                  • 2015-05-21
                                  • 1970-01-01
                                  • 2018-07-17
                                  • 2015-04-21
                                  • 2015-02-01
                                  • 2012-09-21
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多