【问题标题】:How to enable logging for apache commons HttpClient on Android如何在 Android 上为 apache commons HttpClient 启用日志记录
【发布时间】:2011-03-15 21:04:07
【问题描述】:

为了在我使用的普通 Java 应用程序中启用 apache commons HttpClient 的日志记录:

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 中看不到日志。

我错过了什么吗?

【问题讨论】:

    标签: android apache-commons-httpclient


    【解决方案1】:

    忽略我之前的评论。我在 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
    

    区别在于日志标签名称。

    【讨论】:

    • 您是否能够让上下文日志记录正常工作?我尝试使用 org.apache.http.impl.client 记录器的类似行扩展您的解决方案,但我没有看到该包或子包中的类的任何内容。但是,我确实得到了电线和标头日志记录。
    • 说真的。谢谢你。
    • 效果很好!这绝对需要成为公认的答案。
    • @joe - 为什么需要设置 adb shell 属性?
    • 另外,要查看标题,只需要这一行:java.util.logging.Logger.getLogger("org.apache.http.headers").setLevel(java.util.logging.Level.FINEST);。我不需要设置任何 java 系统属性。
    【解决方案2】:

    你只需要使用

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

    adb shell setprop log.tag.correspondingTag VERBOSE
    

    Android使用该函数从类全名中获取对应的Tag:

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

    然后在 adb shell 中

    setprop log.tag.DefaultRequestDirector VERBOSE
    

    【讨论】:

      【解决方案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);
      

      在 adb shell 中

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

      因此,日志说明符似乎不同。

      【讨论】:

        【解决方案4】:

        这里是一个解决方案(不深入细节)

        控制台:

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

        【讨论】:

        • 我在我的应用程序中尝试了这个,但没有看到从 HttpClient 传递的任何日志消息。这是否使用当前 SDK 中的 HttpClient 工作?也就是org.apache.http,vs org.apache.commons.http。我确实看到了测试日志消息(在您的示例中为“hola”),但没有来自 HttpClient 调用。
        • 对于最近的 SDK,您需要使用第一个响应中使用的前缀“org.apache.http”而不是“httpclient”,至少这对我在 2.1 设备上有效。
        • @alex2k8 - 为什么需要设置 adb shell 属性?
        • 您是否知道是否有一种方法可以查看比在线上启用调试模式所获得的更多详细信息?喜欢底层 TCP 信息?
        猜你喜欢
        • 2014-02-28
        • 2019-04-24
        • 2020-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-07
        • 2019-06-02
        相关资源
        最近更新 更多