web-dev-qa-db-fra.com

Désactiver la journalisation HttpClient

J'utilise commons-httpclient 3.1 dans une suite de tests d'intégration. La journalisation par défaut de HttpClient est extrêmement bruyante et je n'arrive pas à l'éteindre. J'ai essayé de suivre les instructions ici mais aucune d'entre elles ne fait de différence. 

La plupart du temps, il me suffit de fermer le consignateur org.Apache.http.wire. Une partie du problème est que je ne sais pas quel type de consignateur HttpClient essaie d'utiliser et le problème est que je n'ai jamais utilisé cette bibliothèque auparavant. J'ai essayé de créer un fichier log4j.properties et de le déposer dans mon dossier test/resources, de modifier le fichier master logging.properties dans jre/lib et d'envoyer les différentes options de journalisation à Maven, comme indiqué sur la page de journalisation , et aucun d'eux ne fait aucune différence.

Toute aide est appréciée ... cela me rend fou.

UPDATE: Correction: il apparaît que la sortie en question provient de l'utilisation de HttpClient par jwebunit, et non de la mienne. De toute façon, ce n'est pas souhaitable.

UPDATE: Merci pour les tentatives faites jusqu'à présent. J'ai essayé tout ce qui est suggéré ci-dessous mais toujours pas de chance. J'ai un fichier commons-logging.properties dans mon dossier src/test/resources avec le contenu suivant

org.Apache.commons.logging.LogFactory=org.Apache.commons.logging.impl.Log4jFactory
log4j.configuration=log4j.properties

et un fichier log4j.properties dans le même dossier avec le contenu suivant

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

Cependant, lorsque je lance mes tests, je reçois toujours une quantité de sortie comme celle-ci:

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]"

Cette sortie pour tout ce qui tombe sur le fil rend cette bibliothèque inutilisable pour moi ... c'est jusqu'à ce que je sache comment la désactiver. Dois-je faire quelque chose de spécial pour que cette configuration de journal soit lue?

113
Matt Baker

Mettez à jour log4j.properties pour inclure:

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

Notez que si la bibliothèque Log4j n'est pas installée, HttpClient (et par conséquent JWebUnit) utilisera la consignation. Dans ce cas, créez ou éditez logback.xml pour inclure:

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

Définir le niveau de journalisation sur WARN avec Log4j en utilisant le nom du package org.Apache.commons.httpclient dans log4j.properties ne fonctionnera pas comme prévu:

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

En effet, la source de HttpClient (v3.1) utilise les noms de journal suivants:

public static Wire HEADER_WIRE = new Wire(LogFactory.getLog("httpclient.wire.header"));
public static Wire CONTENT_WIRE = new Wire(LogFactory.getLog("httpclient.wire.content"));
71
Sud Monkey

Remarque: Une partie de cette réponse pourrait répéter des choses que vous connaissez déjà (ou pensez savoir), mais il y a un peu d'informations erronées qui circulent autour de cette question. Je vais donc commencer par l'épeler. tous dehors

  • Commons HttpClient utilise Commons-Logging pour tous ses besoins de journalisation.
  • Commons-Logging n'est pas un framework de journalisation complet, mais plutôt une enveloppe autour de plusieurs frameworks de journalisation existants
  • Cela signifie que lorsque vous voulez contrôler la sortie de la journalisation, vous finissez par configurer une bibliothèque autre que Commons-Logging, mais parce que Commons-Logging enveloppe plusieurs autres bibliothèques, il est difficile pour nous de deviner lequel configurer sans connaître votre configuration exacte.
  • Commons-Logging peut se connecter à log4j, mais il peut également se connecter à Java.util.logging (journalisation JDK1.4)
  • Commons-Logging essaie d'être intelligent et de deviner quel framework de journalisation vous utilisez déjà, et envoie ses journaux à celui-ci.
  • Si vous ne possédez pas déjà de structure de journalisation et que vous utilisez un environnement JRE de version 1.4 ou supérieure (ce que vous devriez réellement être), il enverra probablement ses messages de journalisation à la journalisation du JDK (Java.util.logging).
  • S'appuyant sur le mécanisme de découverte automatique de Commons-Logging est sujet aux erreurs. Ajouter simplement log4j.jar au chemin d'accès aux classes le pousserait à changer le mécanisme de journalisation utilisé, ce qui n'est probablement pas ce que vous voulez.
  • Il est préférable que vous indiquiez explicitement à Commons-Logging quelle bibliothèque de journalisation utiliser
  • Vous pouvez le faire en créant un fichier commons-logging.properties selon ces instructions
  • Les étapes à suivre pour configurer la journalisation commons-httpclient sont
    1. Décidez quel framework de journalisation sous-jacent vous souhaitez utiliser. Il existe un grand nombre de choix, mais probablement log4j ou Java.util.logging sont les meilleures options pour vous.
    2. Configurez le fichier de propriétés commons-logging pour qu'il pointe vers la bonne implémentation Log. par exemple. Pour utiliser log4j, placez-le dans le fichier de propriétés: org.Apache.commons.logging.Log=org.Apache.commons.logging.impl.Log4JLogger, ou utilisez le jeu de journalisation JDK org.Apache.commons.logging.Log=org.Apache.commons.logging.impl.Jdk14Logger. Celles-ci peuvent également être définies en tant que propriétés système (par exemple, en utilisant -D sur la ligne de commande).
    3. Configurez l'implémentation de journalisation sous-jacente (par exemple, log4j) pour ignorer les messages que vous ne voulez pas et envoyez les messages que vous voulez.

Cela fait beaucoup d'étapes, mais c'est ce qu'il faut. Les développeurs d’Apache-commons ont tendance à penser que vous avez déjà un framework de journalisation configuré et qu’ils peuvent déterminer celui-ci par détection automatique.
Si cela n’est pas vrai pour vous, il faut alors un peu plus de travail pour faire fonctionner les choses.

26
Tim

Je mets cela dans mon fichier de configuration log4j

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

Cela limite la sortie au niveau d'avertissement ou supérieur

18
Philip Nuzhnyy

Cela a fonctionné pour mes tests;

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");
16
Daniel Magnusson

Pour log4j, ajoutez les éléments suivants à log4j.properties (dans le répertoire source de l'application):

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

Pour la consignation, le logback.xml suivant supprimera le bruit:

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

Cela a pris beaucoup trop de temps pour le savoir, mais JWebUnit est livré avec le composant Logback logging, de sorte qu'il n'utilise même pas log4j.properties ou commons-logging.properties.

Au lieu de cela, créez un fichier appelé logback.xml et placez-le dans votre dossier de code source (dans mon cas, 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 semble toujours être en cours de développement et l'API semble toujours en train de changer, de sorte que cet exemple de code peut échouer à l'avenir. Voir aussi cette question StackOverflow .

10
jevon

Nous utilisons XML plutôt qu'un fichier de propriétés pour configurer notre sortie de journalisation. Le code suivant a fonctionné pour faire taire ce bavardage.

<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

J'ai eu ce problème lors de l'utilisation de RestAssured avec JUnit. Pour moi, cette approche programmatique a fonctionné:

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

    //...
}
4
tanacsg

Dans votre log4.properties - avez-vous cet ensemble comme je le fais ci-dessous et aucun autre enregistreur org.Apache.http défini dans le fichier?

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

De même, si aucun niveau de journalisation n'est spécifié pour org.Apache.http dans votre fichier de propriétés log4j, il héritera du niveau log4j.rootLogger. Donc, si vous avez défini log4j.rootLogger sur ERROR et définissez les paramètres org.Apache.http dans votre log4j.properties, il ne devrait consigner que les messages ERROR uniquement par héritage.

METTRE À JOUR:

Créez un fichier commons-logging.properties et ajoutez-y la ligne suivante. Assurez-vous également que ce fichier est dans votre CLASSPATH.

org.Apache.commons.logging.LogFactory = org.Apache.commons.logging.impl.Log4jFactory

Ajout d'un fichier log4j complet et du code à appeler pour l'OP. Ce log4j.properties devrait être dans votre CLASSPATH. J'assume stdout pour le moment.

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

Voici du code que vous devez ajouter à votre classe pour appeler le consignateur.

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

Le même problème me préoccupe depuis un certain temps et j'ai finalement décidé de me pencher sur la question. Le problème est que mon projet dépendait de http-builder-0.5.2.jar, qui regroupait un fichier log4j.xml en lui-même. Et bien sûr, le niveau de journalisation pour org.Apache.http.wire était DEBUG! La façon dont j'ai trouvé que c'était juste pour parcourir tous les fichiers jar dans mes dépendances et faire "jar tvf" et grepping pour log4j. 

Bien que cette découverte ait abouti à la solution finale consistant à augmenter la version de ma dépendance de http-builder à 0.6, elle me laisse encore perplexe sur ce qui a dû traverser l'esprit du développeur lors de l'intégration du fichier log4j.xml dans le fichier jar. Quoi qu'il en soit, ce n'est probablement pas pertinent pour ce fil pour l'instant. Mais j’ai pensé qu’il était utile de mentionner cette solution que j’ai trouvée étant donné que lorsque j’étais à la recherche d’une solution auparavant, la mienne n’a jamais été abordée. Espérons que quelqu'un trouvera cela utile.

4
paulito415

Manière simple Log4j et HttpCLient (v3.1 dans ce cas, devrait fonctionner pour supérieur, pourrait nécessiter des changements mineurs)

Assurez-vous que toutes les dépendances sont correctes, et MD5 vos téléchargements !!!! 

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

J'ai eu le même problème avec JWebUnit. Veuillez noter que si vous utilisez une distribution binaire, Logback est un enregistreur par défaut. Pour utiliser log4j avec JWebUnit, j'ai effectué les étapes suivantes:

  • jarres de journal supprimés
  • ajout de la bibliothèque de ponts lod4j pour sfl4j - slf4j-log4j12-1.6.4.jar
  • ajouter log4j.properties

Vous n'avez probablement pas besoin de supprimer les fichiers jar Logback, mais vous aurez besoin d'une étape supplémentaire pour forcer slf4j à utiliser log4j

3
Lukasz Lacki

Les 2 lignes suivantes ont complètement résolu mon problème:

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

J'ai été amené à ce poste lorsque je cherchais une solution à un problème similaire. La réponse de Tim était très utile. comme Matt Baker, je veux juste fermer le journal httpClient sans trop de configuration. Comme nous ne savions pas quelle implémentation de journalisation sous Common-Logging était utilisée, Ma solution a été de le forcer à l'aide de log4j en lançant le fichier jar log4j dans le chemin d'accès aux classes. Le paramètre par défaut de la configuration de log4j arrête la sortie de débogage common-httpclient. Bien sûr, pour le rendre plus robuste, vous pouvez créer des fichiers common-logging.properties et log4j.properties afin de mieux définir vos configurations de journalisation.

2
bcxw

Essayez de mettre 

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

dans votre commons-logging.properties

2
Safrain

J'ai eu le même problème lors de l'exécution des tests d'intégration jwebunit. Je l'ai corrigé en excluant la connexion et en ajoutant dans slf4j-log4j12, comme suit

<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

Pour Apache 4.5.3, si vous souhaitez déplacer le niveau de tous les clients HTTP Apache se connectant vers Avertir , utilisez:

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

J'avais aussi le même problème. La console entière était remplie de [main] DEBUG org.Apache.http.wire lors de l'exécution des tests.

La solution qui a fonctionné pour moi a été la création d'un logback-test.xml src/test/resources/logback-test .xml as https://github.com/bonigarcia/webdrivermanager-examples/blob/master/src/test/resources/logback-test.xml ( ref - https://github.com/bonigarcia/webdrivermanager/issues/2 )

Pour afficher mes informations de journalisation, j'ai remplacé logger name = "io.github.bonigarcia" par mon nom de package.

<?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

Cela m'a pris énormément de temps pour comprendre une fois, vous avez besoin de ceci:

log4j.logger.httpclient.wire=ERROR

Je suppose que HttpClient utilise "httpclient.wire" comme nom de journal, et non "org.Apache.commons.httpclient".

Sournois buggers.

1
Adriaan Koster

Ajoutez les lignes ci-dessous dans le fichier de propriétés log4j et cela fermera les journaux http: 

1
Rancho

La meilleure solution que j'ai trouvée consistait à utiliser le plug-in Maven Enforcer afin d'empêcher l'utilisation de Common-Logging. Ensuite, j'ai ajouté la dépendance slf4j pour la journalisation. Alors ajoutez ce qui suit à votre pom.xml

<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>[your version here]</version>
    </dependency>

et aussi ajouter le plugin maven -forcer

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

Dans mon cas, j'utilise la configuration XML et je l'ajoute au fichier de configuration.

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

Avec:

  • Log2J 2 2.11.2
  • HttpClient 4.5.7 (client restant d'elasticsearch 7.0.0)
  • Utiliser le fichier de propriétés pour configurer

On peut ajouter:

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

Dans l'exemple ci-dessus, 'httpclient' est un nom logique que vous choisissez.

(Testé sur Java 11 application OpenFX.)

0
Imifos

Essayez 'log4j.logger.org.Apache.http.headers = ERREUR'

0
Fracdroid

J'ai essayé toutes les solutions ci-dessus en vain. La région qui m'a le plus approché est celle qui suggère de créer un fichier logback.xml. Cela a fonctionné, mais rien n'a été enregistré. Après avoir joué avec le fichier logback.xml, voici ce que j’ai trouvé

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

Maintenant, tous les niveaux inférieurs à DEBUG sont enregistrés correctement.

0
aggaton

Ajoutez simplement ces deux dépendances dans le fichier pom: J'ai essayé et réussi après avoir essayé la discussion auparavant.

<!--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 et les informations par défaut lorsque Debug ne sera pas présent; Vous pouvez utiliser:

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

pour définir les informations que vous souhaitez enregistrer: comme Résultat final comme ceci. Seules les informations que je souhaite consigner seront présentes.

0
Herman XU

J'ai rencontré un tel problème après avoir défini HttpComponentsClientHttpRequestFactory pour mon modèle de repos.

La définition de OkHttpClientHttpRequestFactory devrait résoudre le problème de la journalisation de la corbeille.

0
sann05