2010-07-14 17 views
30

Para habilitar el registro de apache commons HttpClient en aplicación Java normales utilicé:Cómo habilitar el registro de apache commons HttpClient en 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"); 

Pero en android no veo registros en LogCat.

¿Me falta algo?

Respuesta

8

Aquí es una solución (sin cavar en detalles)

Consola:

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

Código:

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

prueba:

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

He intentado esto en mi aplicación, y no estoy viendo los mensajes de registro entregados desde el HttpClient. ¿Funciona esto usando HttpClient que está en el SDK actual? Es decir, org.apache.http, vs org.apache.commons.http. Veo el mensaje de registro de prueba ("hola" en su ejemplo), pero nada de las llamadas de HttpClient. – Joe

+1

con los SDK recientes que necesita usar el prefijo utilizado en la primera respuesta, "org.apache.http" en lugar de "httpclient", al menos esto funcionó para mí en un dispositivo 2.1. – HefferWolf

+0

@ alex2k8 - ¿Por qué necesita establecer las propiedades del shell adb? –

61

Ignore mi comentario anterior. Encontré la solución en la página de registro de org.apache.http. Su respuesta original se refería a httpclient-3.x logging, y el código de trabajo para las versiones recientes proviene 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"); 

y propiedades:

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 diferencia está en los nombres de las etiquetas de registro.

+1

Gracias por esta investigación – alex2k8

+1

¿Ha podido obtener el registro de contexto para trabajar? Intenté extender su solución con líneas similares para el registrador org.apache.http.impl.client, pero no veo nada de las clases en ese paquete o subpaquete. Sin embargo, obtengo el registro del cable y el encabezado. – gnuf

+0

En serio. Gracias por esto. –

3

El diablo está en los detalles. Estoy ejecutando el emulador 2.3.3 y lo consiguió trabajar 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); 

y en el adb shell

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

Por lo tanto, parece que los especificadores de registro son diferentes.

3

sólo tiene que utilizar

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

y

adb shell setprop log.tag.correspondingTag VERBOSE 

uso androide esta función para obtener correspondingTag de la clase nombre 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); 
    } 

así por ejemplo, quiero habilite el registro para la clase "org.apache.http.impl.client.DefaultRequestDirector", haga lo siguiente a continuación:

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

Y luego, en adb shell

setprop log.tag.DefaultRequestDirector VERBOSE 
Cuestiones relacionadas