美文网首页android学习之路Android探索之旅
Android 终于知道Log显示不全的原因了

Android 终于知道Log显示不全的原因了

作者: 亦枫 | 来源:发表于2016-07-27 20:29 被阅读4530次

    一个优秀的软件系统一定会实时保存系统运行过程中产生的异常或非异常性数据,用于记录系统运行过程产生的各种行为,作为日后发现问题、跟踪问题并解决问题的一个很重要的依据。一般以输出文件的形式保存,同时也可以选择性的在控台打印。日志处理,可谓是任何软件开发过程中必不可少的一个环节。

    在Android应用开发阶段,我们常常会使用系统提供的日志打印功能选择性地在Logcat控制台上打印一些数据信息,便于更加直观地调试跟踪应用运行的一个状态,常见如客户端与服务器通讯过程中涉及到的URL链接、request请求参数和response响应结果等。

    但如果打印的message过长,比如接口响应结果过大,将会导致Logcat控台数据显示不全。自打使用Log以来经常遇到这个问题,之前也是没太在意,毕竟message太长的情况也是少见,偶尔遇到这种情况就通过Debug工具跟踪调试,复制对应response信息到bejson等其他辅助工具上格式化浏览,多少还是有点不方便。

    后来经过查询才得知,Android系统的单条日志打印长度是有限的,在底层Logger驱动程序的一个类Logger.h头文件中有如下两行代码:

    #define LOGGER_ENTRY_MAX_LEN        (4*1024)  
    #define LOGGER_ENTRY_MAX_PAYLOAD    \\  
        (LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry))  
    

    可以看出,系统显示单条Log信息的长度是固定的,为4*1024个字符长度!Logcat使用的liblog资源包也提到,使用Log打印的message有可能被log内核驱动缩短:

    The message may have been truncated by the kernel log driver.
    

    了解了其中的长度限制,就好办了。我们可以对Message做个长度判断,采取分段打印的办法输出日志信息,比如这样做:

    if(xml.length() > 4000) {
     for(int i=0;i<xml.length();i+=4000){
        if(i+4000<xml.length())
            Log.i("rescounter"+i,xml.substring(i, i+4000));
         else
            Log.i("rescounter"+i,xml.substring(i, xml.length()));
        }
    } else
        Log.i("resinfo",xml);
    }
    

    参考地址:

    相关文章

      网友评论

      • 二石兄:标题有歧义,不过达到了吸引眼球的目的(开玩笑)。

        未细读,对开头的文字、结尾的代码块反馈些建议:

        1. 同时也可以选择性的在控(制)台打印
        2. 评论排版功能太弱,markdown 排版希望别介意。

        ```
        int lenLimit = 4000, endPos;
        if(xml.length() < lenLimit) {
        Log.i("resinfo", xml);
        return;
        }

        for(int i = 0, len = xml.length(); i < len; i += lenLimit) {
        endPos = (i + lenLimit) < len ? (i + lenLimit) : len;
        Log.i("rescounter" + i, xml.substring(i, endPos));
        }
        ```
        亦枫:@俊杰li 👍,谢谢交流
      • 捡淑:6
        奔跑的小野兔:这头像可以看一天
        亦枫:@捡淑 :blush:
      • Rainbow冰糖葫芦娃:发生crash时,错误栈太长的话 log也会显示不全,这个有没有办法解决?
        亦枫:@Rainbow冰糖葫芦娃 这个就不清楚了,网上查查吧
        Rainbow冰糖葫芦娃:@亦枫 adb logcat 打出来的栈没有这么多啊。到了几行之后就会显示
        at libcore.io.IoBridge.open(IoBridge.java:438)
        ... 10 more。关键我想看调用栈这里的more
        亦枫:@Rainbow冰糖葫芦娃 行数够用了吧,貌似有5000行吧

      本文标题:Android 终于知道Log显示不全的原因了

      本文链接:https://www.haomeiwen.com/subject/qvoojttx.html