2010-07-14 11 views
30

Per attivare la registrazione per beni comuni apache HttpClient in un'applicazione Java normale che ho usato:Come attivare la registrazione per beni comuni apache HttpClient su 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"); 

Ma su Android non vedo log in LogCat.

Mi manca qualcosa?

risposta

8

Ecco una soluzione (senza scavare nei dettagli)

Console:

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

Codice:

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

prova:

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

Ho provato questo nella mia app, e non vedo alcun messaggio di log forniti dal HttpClient. Funziona utilizzando HttpClient nell'attuale SDK? Ovvero, org.apache.http, vs org.apache.commons.http. Vedo il messaggio del registro di test ("hola" nell'esempio), ma nulla dalle chiamate HttpClient. – Joe

+1

con gli SDK recenti è necessario utilizzare il prefisso utilizzato nella prima risposta, "org.apache.http" anziché "httpclient", almeno questo ha funzionato per me su un dispositivo 2.1. – HefferWolf

+0

@ alex2k8 - Perché è necessario impostare le proprietà della shell adb? –

61

Ignora il mio commento precedente. Ho trovato la soluzione sulla pagina di registrazione org.apache.http. La tua risposta originale si riferiva a httpclient-3.x logging, e il codice di lavoro per le versioni più recenti proviene da 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"); 

e le proprietà:

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 differenza è nei nomi dei tag di registrazione.

+1

Grazie per questa ricerca – alex2k8

+1

Sei riuscito a far funzionare la registrazione del contesto? Ho provato ad estendere la tua soluzione con linee simili per il logger org.apache.http.impl.client, ma non vedo nulla dalle classi in quel pacchetto o subpackage. Tuttavia, ottengo la registrazione del filo e dell'intestazione. – gnuf

+0

Seriamente. Grazie per questo. –

3

Il diavolo è nei dettagli. Io corro il 2.3.3 emulatore e ottenuto che funziona con:

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

e nel adb shell

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

Così sembra che i progettisti di registro sono diverse.

3

Hai solo bisogno di utilizzare

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

e

adb shell setprop log.tag.correspondingTag VERBOSE 

uso Android questa funzione per ottenere correspondingTag dalla classe nome completo:

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

così per esempio, voglio abilitare la registrazione per la classe "org.apache.http.impl.client.DefaultRequestDirector", eseguire le seguenti operazioni:

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") 
} 

E poi in adb shell

setprop log.tag.DefaultRequestDirector VERBOSE 
Problemi correlati