web-dev-qa-db-ja.com

HttpClientロギングを無効にする

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

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

どんな助けも大歓迎です...これは私に夢中にさせています。

UPDATE:修正:問題の出力は、実際にはjwebunitのHttpClientの使用によるものであり、自分のものではないようです。どちらにしても、それは望ましくありません。

UPDATE:これまでの試みに感謝します。以下に提案するすべてを試しましたが、それでも運はありません。 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]"

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

119
Matt Baker

log4j.propertiesを更新して、以下を含めます。

log4j.logger.httpclient.wire.header=WARN
log4j.logger.httpclient.wire.content=WARN

Log4jライブラリがインストールされていない場合、HttpClient(したがってJWebUnit)はログバックを使用することに注意してください。この状況では、logback.xmlを作成または編集して以下を含めます。

<configuration>
    <logger name="org.Apache" level="WARN" />
    <logger name="httpclient" level="WARN" /> 
</configuration>

パッケージ名org.Apache.commons.httpclient in log4j.propertiesを使用して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"));
78
Sud Monkey

注:この答えの一部は、すでに知っている(または知っていると思う)ことを繰り返すかもしれませんが、この質問には誤解が少しありますので、始まり、それをすべて綴ります

  • Commons HttpClientは、ロギングのすべてのニーズにCommons-Loggingを使用します。
  • Commons-Loggingは完全なロギングフレームワークではなく、いくつかの既存のロギングフレームワークのラッパーです
  • つまり、ロギング出力を制御する場合、(ほとんど)Commons-Logging以外のライブラリを構成することになりますbut。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に使用するロギングライブラリを明示的に指定することをお勧めします
  • これを行うには、 これらの手順 に従って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ロギングセットorg.Apache.commons.logging.Log=org.Apache.commons.logging.impl.Jdk14Loggerを使用します。これらは、システムプロパティとして設定することもできます(たとえば、コマンドラインで-Dを使用)。
    3. 不要なメッセージを無視し、必要なメッセージを出力するように、基礎となるロギング実装(log4jなど)を構成します。

それは多くのステップですが、それはそれが取るものです。 Apache-commonsの開発者は、すでにロギングフレームワークが設定されていると想定しがちであり、自動検出によってそれがどれであるかを判断できます。
それがあなたに当てはまらない場合は、物事を実行するためにもう少し手間がかかる傾向があります。

26
Tim

これをlog4j設定ファイルに入れます

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

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

18
Philip Nuzhnyy

これは私のテストで機能しました。

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

Log4jの場合、次をlog4j.properties(アプリケーションのsourceディレクトリ内)に追加します。

log4j.logger.org.Apache=WARN
log4j.logger.httpclient=WARN

ログバックの場合、次のlogback.xmlがノイズを殺します:

<configuration>
    <logger name="org.Apache" level="WARN" />
    <logger name="httpclient" level="WARN" /> 
</configuration>
15
Ali Cheaito

これを見つけるのに時間がかかりすぎましたが、JWebUnitには Logback ロギングコンポーネントがバンドルされているため、log4j.propertiescommons-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の質問 も参照してください。

11
jevon

プロパティファイルではなく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>
8
barclay

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

    //...
}
5
tanacsg

あなたのlog4.propertiesで-あなたは私が下にあるようにこのセットを持っていますか、他のorg.Apache.httpロガーはファイルに設定されていませんか?

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

また、log4jプロパティファイルのorg.Apache.httpにログレベルが指定されていない場合は、log4j.rootLoggerレベルを継承します。したがって、log4j.rootLoggerをERRORに設定し、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にある必要があります。今のところ標準出力を想定しています。

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
}
4
CoolBeans

私は今かなり長い間同じ問題に悩まされてきており、最終的にこれを調べることにしました。この問題は、私のプロジェクトが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ファイルにバンドルする際に開発者の心を突き抜けていたはずのことは、まだ私を困惑させます。とにかく、それはおそらく今のところこのスレッドには関係ありません。しかし、私が見つけたこの解決策について言及することは有用であると考えました。これまでに解決策を探していたとき、私の解決策が思い浮かびませんでした。うまくいけば、誰かがこれを役に立つと思うでしょう。

4
paulito415

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

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

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

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

3
Lukasz Lacki

次の2行は私の問題を完全に解決しました。

Logger.getLogger("org.Apache.commons.httpclient").setLevel(Level.ERROR);
Logger.getLogger("httpclient").setLevel(Level.ERROR);
3
Tosha

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

2
bcxw

Apache 4.5.3の場合、すべてのApache httpクライアントロギングのレベルをWarnに移動するには、次を使用します。

log4j.logger.org.Apache=WARN
2
Adrian Elder

Log4jプロパティファイルに以下の行を追加すると、httpログが閉じられます。-log4j.logger.org.Apache.http = OFF

2
Rancho

入れてみて

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

commons-logging.propertiesで

2
Safrain

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>
1
David Pomeroy

私も同じ問題を抱えていました。テストの実行中、コンソール全体が[main] DEBUG org.Apache.http.wireでいっぱいになりました。

私のために働いた解決策は、logback-test.xmlsrc/test/resources/logback-testを作成することでした.xmlhttps://github.com/bonigarcia/webdrivermanager-examples/blob/master/src/test/resources/logback-test.xml ( ref- https://github.com/bonigarcia/webdrivermanager/issues/2

ログ情報を表示するために、ロガー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>
1
nantitv

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

log4j.logger.httpclient.wire=ERROR

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

卑劣な盗賊。

1
Adriaan Koster

私が見つけた最良の解決策は、commons-loggingが完全に使用されるのを防ぐために、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>

私の場合、xml構成を使用し、これを構成ファイルに追加します

<logger name="org.Apache.http">
    <level value="warn"/>
</logger>
0
Harun

と:

  • Log2J 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アプリケーションでテスト済み。)

0
Imifos

「log4j.logger.org.Apache.http.headers = ERROR」を試してください

0
Fracdroid

上記のすべてのソリューションを試してみましたが、役に立ちませんでした。私にとって最も近いものは、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以下のすべてのレベルが正しく記録されるようになりました。

0
aggaton

pomファイルにこれらの2つの依存関係を追加するだけです:議論を試みた後に成功しました。

<!--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->デバッグが存在しない間のログバックとデフォルト情報。次を使用できます。

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

記録する情報を定義するには:like Final Result like記録したい情報のみが表示されます。

0
Herman XU

残りのテンプレートにHttpComponentsClientHttpRequestFactoryを設定した後、このような問題が発生しました。

OkHttpClientHttpRequestFactoryを設定することで、ゴミ箱のログに関する問題を解決できます。

0
sann05