153

commons-httpclient統合テスト スイートで 3.1 を使用しています。のデフォルトのロギングHttpClientは非常にノイズが多く、オフにできないようです。ここの指示に従ってみましたが、どれも違いはありません。

ほとんどの場合、org.apache.http.wire ロガーをシャットダウンする必要があります。問題の一部は、使用しようとしているロガーのタイプがわからないことHttpClientです。私は以前にこのライブラリを使用したことがありません。log4j.properties ファイルを作成して test/resources フォルダーにドロップし、jre/lib のマスター logging.properties ファイルを変更し、さまざまなログ オプションをログ ページで指定されているように Maven に送信しようとしましたが、いずれも送信しませんでした。違いを生む。

更新:HttpClient訂正: 問題の出力は、実際には、私自身ではなく、jwebunit の使用によって発生しているようです。いずれにせよ、それは望ましくありません。

更新:これまでの試みに感謝します。以下に提案されているすべてを試しましたが、まだうまくいきません。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]"

ネットワークに出くわすすべてのこの出力により、このライブラリは使用できなくなります...つまり、オフにする方法がわかるまでです。このログ構成を読み込むために何か特別なことをする必要がありますか?

4

33 に答える 33

95

以下を含めるように更新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のパッケージ名を使用して Log4jでログ レベルを に設定すると、期待どおりに動作org.apache.commons.httpclientlog4j.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"));
于 2011-05-23T15:54:54.930 に答える
33

注: この回答の一部は、既に知っている (または知っていると思う) ことを繰り返している可能性がありますが、この質問には少し誤った情報が浮かんでいるため、最初から始めてすべてを詳しく説明します。

  • Commons HttpClient は、すべてのロギング ニーズに対して Commons-Logging を使用します。
  • Commons-Logging は完全なロギング フレームワークではなく、いくつかの既存のロギング フレームワークのラッパーです。
  • つまり、ロギング出力を制御したい場合、(ほとんどの場合) Commons-Logging 以外のライブラリを構成することになります、Commons-Logging は他のいくつかのライブラリをラップしているため、知らないうちにどのライブラリを構成するかを推測することは困難です。あなたの正確なセットアップ。
  • java.util.loggingCommons-Logging は log4j にログを記録できますが、 (JDK1.4 ロギング)にもログを記録できます。
  • Commons-Logging は賢く、あなたが既に使用しているロギング フレームワークを推測し、それにログを送信しようとします。
  • ロギング フレームワークをまだ持っておらず、1.4 以上の JRE で実行している場合 (実際にそうすべきです)、おそらくそのログ メッセージを JDK ロギング ( java.util.logging)に送信します。
  • Commons-Logging の自動検出メカニズムに依存すると、エラーが発生しやすくなります。クラスパスに追加log4j.jarするだけで、使用するロギングメカニズムが切り替わりますが、これはおそらくあなたが望むものではありません
  • Commons-Logging に対して、使用するロギング ライブラリを明示的に指定することをお勧めします。
  • これらの指示に従ってcommons-logging.propertiesファイルを作成することでこれを行うことができます
  • commons-httpclient ロギングを構成するために従う必要がある手順は次のとおりです。
    1. 使用する基になるロギング フレームワークを決定します。いくつかの選択肢がありますが、おそらくlog4j、またはjava.util.loggingあなたにとって最良の選択肢です。
    2. commons-logging プロパティ ファイルが正しいLog実装を指すように設定します。たとえば、log4j を使用するには、これをプロパティ ファイルに入れます: org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger、または JDK logging set を使用しますorg.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger。これらは、システム プロパティとして設定することもできます (-Dコマンド ラインで使用するなど)。
    3. 不要なメッセージを無視し、必要なメッセージを出力するように、基になるロギングの実装 (log4j など) を構成します。

これには多くの手順がありますが、それが必要なことです。Apache-commons の開発者は、ロギング フレームワークが既に構成されていると想定する傾向があり、自動検出によってどのフレームワークであるかを判断できます。
それが当てはまらない場合は、物事を実行するのにもう少し手間がかかる傾向があります.

于 2011-02-06T23:54:13.547 に答える
20

これは私のテストではうまくいきました。

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");
于 2011-03-25T12:09:40.110 に答える
20

これをlog4j構成ファイルに入れました

log4j.logger.org.apache.http.wire=WARN

これにより、出力が警告レベル以上に制限されます

于 2011-04-26T18:43:44.420 に答える
12

これを見つけるのに時間がかかりすぎましたが、JWebUnit にはLogbacklog4j.propertiesロギング コンポーネントがバンドルされているため、 orも使用しません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 はまだ変更中のようです。そのため、このコード サンプルは将来失敗する可能性があります。この StackOverflow questionも参照してください。

于 2012-01-20T04:00:58.430 に答える
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>
于 2011-10-03T20:32:25.707 に答える
6

簡単な方法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();
于 2012-05-17T13:10:59.653 に答える
4

あなたの log4.properties には、以下のようにorg.apache.http設定されていて、ファイルに他のロガーが設定されていませんか?

-org.apache.commons.logging.simplelog.log.org.apache.http=ERROR

また、log4j プロパティ ファイルでログ レベルが指定されていない場合はorg.apache.http、レベルが継承され log4j.rootLoggerます。したがって、log4j.rootLoggerエラーと言ってorg.apache.http、log4j.properties の設定を取り出して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
}
于 2011-02-06T19:14:17.270 に答える
3

JWebUnitでも同じ問題が発生しました。二項分布を使用する場合、Logbackがデフォルトのロガーであることに注意してください。JWebUnitでlog4jを使用するには、次の手順を実行しました。

  • ログバックjarを削除しました
  • sfl4jのlod4jブリッジライブラリを追加します--slf4j-log4j12-1.6.4.jar
  • log4j.propertiesを追加します

おそらく、Logback jarを削除する必要はありませんが、slf4jにlog4jを使用させるための追加の手順が必要になります。

于 2011-12-27T15:50:29.277 に答える
2

入れてみて

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

commons-logging.properties で

于 2013-02-02T15:29:26.630 に答える
2

同様の問題の解決策を探しているときに、この投稿にたどり着きました。ティムの答えはとても役に立ちました。Matt Baker のように、多くの設定をせずに httpClient ログを遮断したいだけです。common-logging の下にあるどのロギング実装が使用されているかわからなかったので、私の解決策は、クラスパスに log4j jar ファイルをスローして、log4j を使用することを強制することでした。log4j 構成のデフォルト設定では、common-httpclient デバッグ出力が遮断されます。もちろん、より堅牢にするために、common-logging.properties および log4j.properties ファイルを作成して、ロギング構成をさらに定義することもできます。

于 2011-04-26T22:24:07.343 に答える
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>
于 2011-10-26T18:46:27.587 に答える
1

これを理解するのに何年もかかりました。これが必要です:

log4j.logger.httpclient.wire=ERROR

HttpClient はロガー名として「org.apache.commons.httpclient」ではなく「httpclient.wire」を使用していると思います。

卑劣なバガー。

于 2012-05-01T15:04:57.083 に答える
0

解決策を探すときもここはGoogleがリードしてlog4j2くれるので、ここは使えるものです。タグ内に次のXMLコードを追加します。log4j2.xmlLoggers

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

org.apache.httpcomponents:httpclient:4.5.13と のために働いていorg.apache.logging.log4j:log4-core:2.14.1ます。

于 2021-08-15T08:33:35.563 に答える