2010-07-14 80 views
30

要啓用我用普通的Java應用程序日誌的Apache Commons的HttpClient:如何啓用日誌記錄的Apache Commons的HttpClient 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"); 

但在Android上我沒有看到logcat的日誌。

我錯過了一些東西嗎?

回答

8

這裏是一個溶液(不挖掘到細節)

控制檯:

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

代碼:

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

測試:

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

我想這在我的應用程序,和我沒有看到從HttpClient的交付的任何日誌消息。這是否使用當前SDK中的HttpClient工作?也就是說,org.apache.http與org.apache.commons.http。 我看到測試日誌消息(在您的示例中爲「hola」),但沒有任何來自HttpClient的調用。 – Joe 2010-07-21 18:46:21

+1

與最近的SDK你需要使用第一個響應中使用的前綴,「org.apache.http」,而不是「httpclient」,至少這在我的2.1設備上工作。 – HefferWolf 2011-06-14 12:16:10

+0

@ alex2k8 - 爲什麼你需要設置adb shell的屬性? – 2014-02-18 10:14:49

61

忽略我之前的評論。我在org.apache.http日誌頁面上找到了解決方案。你原來的答案指的是httpclient-3.x logging,以及最新版本的工作代碼來自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"); 

和屬性:

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 

所不同的是在日誌標記名稱。

+1

感謝您的研究 – alex2k8 2010-07-21 23:39:20

+1

您是否能夠使上下文記錄工作?我嘗試用org.apache.http.impl.client記錄器的類似行擴展您的解決方案,但是我沒有看到該包或子包中類的任何內容。然而,我確實得到了導線和頭部記錄。 – gnuf 2011-05-11 16:49:44

+0

說真的。這次真是萬分感謝。 – 2013-01-18 01:16:44

3

魔鬼在細節中。我運行2.3.3仿真器,得到它一起工作:

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

,並在亞行外殼

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

這樣看來日誌說明符是不同的。

3

你只需要使用

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

adb shell setprop log.tag.correspondingTag VERBOSE 

的Android使用此函數從類全名獲得correspondingTag:

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

因此,例如,我想啓用「org.apache.http.impl.client.DefaultRequestDirector」類的日誌記錄,請執行以下操作:

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

然後在亞行外殼

setprop log.tag.DefaultRequestDirector VERBOSE 
相關問題