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?
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"));
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
Java.util.logging
(journalisation JDK1.4)Java.util.logging
).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.commons-logging.properties
selon ces instructionslog4j
ou Java.util.logging
sont les meilleures options pour vous.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).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.
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
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");
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>
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 .
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>
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);
//...
}
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
}
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.
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();
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:
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
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);
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.
Essayez de mettre
org.Apache.commons.logging.Log=org.Apache.commons.logging.impl.NoOpLog
dans votre commons-logging.properties
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>
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
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>
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.
Ajoutez les lignes ci-dessous dans le fichier de propriétés log4j et cela fermera les journaux http:
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>
Avec:
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.)
Essayez 'log4j.logger.org.Apache.http.headers = ERREUR'
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.
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.
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.