> 文档中心 > Android开发-差点儿被Logcat骗了,用Logcat输出一行有长度限制,用递归方式封装一个Logcat工具类

Android开发-差点儿被Logcat骗了,用Logcat输出一行有长度限制,用递归方式封装一个Logcat工具类


问题描述:

最近,调试一个程序,差点儿被一个简单的Logcat日志蒙蔽了双眼。

过程是这样的:在代码中,用Log.i(TAG, msg)来输出msg的信息。输出的结果却只输出了前面一部分,后面的字符没有输出来。

代码如下:

Log.i(TAG,"[log output]=========len:" + msg.length());Log.i(TAG,"[log output]=========data:");Log.i(TAG,msg);

输出结果如下: 

[log output]=========len:5400
[log output]=========data:
第三行:1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz
......
1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvw 

//第三行输出了4065个字符

原来是因为对msg的读写长度有限制,对于这个限制,源码是这样定义的:

在system/core/include/cutils/logger.h头文件中,有:

#define LOGGER_ENTRY_MAX_PAYLOAD    4076/* * The maximum size of a log entry which can be read from the * kernel logger driver. An attempt to read less than this amount * may result in read() returning EINVAL. */#define LOGGER_ENTRY_MAX_LEN      (5*1024)

而在logcat.cpp中,有

static void readLogLines(log_device_t* devices)

函数的定义:

static void readLogLines(log_device_t* devices){    ...... while (1) { ......     /* NOTE: driver guarantees we read exactly one full entry */     ret = read(dev->fd, entry->buf, LOGGER_ENTRY_MAX_LEN);    }    ......}

递归方式实现msg的输出:

那么,为了正确输出全部的msg,就封装了一个Logcat工具类,用递归方式实现msg的输出。

我们设定每行最多输出1024*3长度的字符。

代码如下:

    //LogUtil.java    private final static int LogUtilMaxLen = 1024*3;    public static void printMsg(String msg) { if (TextUtils.isEmpty(msg)) {     return; } if (msg.length()<=LogUtilMaxLen) {     Log.i(TAG,msg);     return; } String subStr = msg.substring(0,LogUtilMaxLen); Log.i(TAG,subStr); String nextStr = msg.substring(LogUtilMaxLen);  //递归调用 printMsg(nextStr);    }

printMsg就是递归函数。


戒烟网