Android中Logcat日志打印不全解决办法

在开发中我们常常会打Log来调试程序,但有时候打印的信息长度非常长,比如我们想打Log查看接口返回的json数据,而这个json数据非常大时,这时Logcat会出现打印不全的情况。

原因

Android系统对日志长度有限制的,最大长度为4K(注意是字符串的长度),超过这个范围的自动截断,所以就会出现打印不全的情况。

从Android内核源码来看,在logger.h头文件中有以下宏定义:

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

可以看到第一行定义了LOGGER_ENTRY_MAX_LEN为4*1024,即日志的最大长度为4k。

知道了问题的原因,下面来看看怎么解决。

解决办法

既然一次只能打印4K长度的信息,那很容易想到将待打印的信息拆分成一个个信息段,然后分别打印即可。

我在实际测试时发现,日志的最大长度其实是略小于4*1024的,为了保险起见,我们设置每一段日志长度segmentSize = 3*1024。如果待打印的字符串信息长度小于等于segmentSize,则直接打印即可;如果大于segmentSize则将日志信息截断为一段一段分别打印。

代码如下:

public class LogUtil {
    /**
     * 截断输出日志
     * @param msg
     */
    public static void e(String tag, String msg) {
        if (tag == null || tag.length() == 0 
                || msg == null || msg.length() == 0)
            return;

        int segmentSize = 3 * 1024;
        long length = msg.length();
        if (length <= segmentSize ) {// 长度小于等于限制直接打印
             Log.e(tag, msg);
        }else {
            while (msg.length() > segmentSize ) {// 循环分段打印日志
                String logContent = msg.substring(0, segmentSize );
                msg = msg.replace(logContent, "");
                Log.e(tag, logContent);
            }
            Log.e(tag, msg);// 打印剩余日志    
        }
    }
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,408评论 19 139
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 10,481评论 1 13
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 10,434评论 0 6
  • 今天的主题是随便写,那我也随便侃几句了。 天气闷热,心情跟天气一样烦躁。再加上拦路抢劫般的一场官司,而且我们又...
    someway阅读 1,709评论 0 3
  • 总是急于达成一些事情 急于让某个人喜欢自己 急于去走一段路 急于去看一本书 却忘了正是这急于的过程 富裕我的才是最...
    菀卿阅读 1,092评论 0 0