2010-07-14 4 views
30

Pour activer la journalisation pour les communes apache HttpClient en application Java normale je:Comment activer la journalisation des communes apache HttpClient sur Android

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", "debug"); 
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient", "debug"); 

Mais sur Android, je ne vois pas les journaux dans LogCat.

Ai-je oublié quelque chose?

Répondre

8

est ici une solution (sans creuser dans les détails)

Console:

adb shell setprop log.tag.httpclient.wire.header VERBOSE 
adb shell setprop log.tag.httpclient.wire.content VERBOSE 

code:

java.util.logging.Logger.getLogger("httpclient.wire.header").setLevel(java.util.logging.Level.FINEST); 
java.util.logging.Logger.getLogger("httpclient.wire.content").setLevel(java.util.logging.Level.FINEST); 

Test:

java.util.logging.Logger.getLogger("httpclient.wire.content").log(java.util.logging.Level.CONFIG, "hola"); 
+1

J'ai essayé dans mon application, et je ne vois aucun message de journal délivrés du HttpClient. Est-ce que cela fonctionne en utilisant le HttpClient qui est dans le SDK actuel? C'est-à-dire, org.apache.http, vs org.apache.commons.http. Je vois le message du journal de test ("hola" dans votre exemple), mais rien des appels HttpClient. – Joe

+1

avec les SDK récents, vous devez utiliser le préfixe utilisé dans la première réponse, "org.apache.http" au lieu de "httpclient", au moins cela a fonctionné pour moi sur un périphérique 2.1. – HefferWolf

+0

@ alex2k8 - Pourquoi avez-vous besoin de définir les propriétés du shell ADB? –

61

Ignorer mon commentaire précédent. J'ai trouvé la solution sur la page de consignation org.apache.http. Votre réponse initiale faisait référence à httpclient-3.x logging, et le code de travail pour les versions récentes provient de http-components logging

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", "debug"); 
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http", "debug"); 
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http.headers", "debug"); 

et propriétés:

adb shell setprop log.tag.org.apache.http VERBOSE 
adb shell setprop log.tag.org.apache.http.wire VERBOSE 
adb shell setprop log.tag.org.apache.http.headers VERBOSE 

La différence est dans les noms de balises de journalisation.

+1

Merci pour cette recherche – alex2k8

+1

Avez-vous été en mesure d'obtenir l'enregistrement de contexte pour fonctionner? J'ai essayé d'étendre votre solution avec des lignes similaires pour le logger org.apache.http.impl.client, mais je ne vois rien des classes dans ce paquet ou sous-paquetage. Je reçois le fil et l'en-tête d'enregistrement cependant. – gnuf

+0

Sérieusement. Merci pour ça. –

3

Le diable est dans les détails. Je suis en 2.3.3 émulateur et l'avons obtenu de travailler avec:

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

et dans la coquille adb

# setprop log.tag.org.apache.http.wire VERBOSE 
# setprop log.tag.org.apache.http.headers VERBOSE 

Ainsi, il semble que les spécificateurs journaux sont différents.

3

Vous avez juste besoin d'utiliser

java.util.logging.Logger.getLogger(yourFullClassName).setLevel(java.util.logging.Level.All); 

et

adb shell setprop log.tag.correspondingTag VERBOSE 

utiliser Android cette fonction pour obtenir correspondingTag de la classe Nom complet:

public static String loggerNameToTag(String loggerName) 
    { 
    if (loggerName == null) { 
     return "null"; 
    } 

    int length = loggerName.length(); 
    if (length <= 23) { 
     return loggerName; 
    } 

    int lastPeriod = loggerName.lastIndexOf("."); 
    return length - (lastPeriod + 1) <= 23 ? loggerName.substring(lastPeriod + 1) : loggerName.substring(loggerName.length() - 23); 
    } 

donc par exemple, je veux activer la journalisation pour la classe "org.apache.http.impl.client.DefaultRequestDirector", procédez comme suit:

String clzName = "org.apache.http.impl.client.DefaultRequestDirector"; 
String newClzName = loggerNameToTag(clzName); 
System.out.println("className:" + clzName + " tagName is " + newClzName); //get tagName from class full name,and then it will be used in setprop 
Logger jdkLogger = Logger.getLogger(clzName); 
jdkLogger.setLevel(Level.ALL); 
if (jdkLogger.isLoggable(Level.FINE)) 
{ 
     jdkLogger.log(Level.FINE, "jdk log msg");  
     jdkLogger.log(Level.Fine,"tagName is") 
} 

Et puis dans adb shell

setprop log.tag.DefaultRequestDirector VERBOSE 
Questions connexes