在開(kāi)發(fā)中我們常常會(huì)打Log來(lái)調(diào)試程序押搪,但有時(shí)候打印的信息長(zhǎng)度非常長(zhǎng)窖梁,比如我們想打Log查看接口返回的json數(shù)據(jù)瞪慧,而這個(gè)json數(shù)據(jù)非常大時(shí)恐锣,這時(shí)Logcat會(huì)出現(xiàn)打印不全的情況茅主。
原因
Android系統(tǒng)對(duì)日志長(zhǎng)度有限制的,最大長(zhǎng)度為4K(注意是字符串的長(zhǎng)度)土榴,超過(guò)這個(gè)范圍的自動(dòng)截?cái)嗑饕Γ跃蜁?huì)出現(xiàn)打印不全的情況。
從Android內(nèi)核源碼來(lái)看玷禽,在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赫段,即日志的最大長(zhǎng)度為4k。
知道了問(wèn)題的原因矢赁,下面來(lái)看看怎么解決糯笙。
解決辦法
既然一次只能打印4K長(zhǎng)度的信息,那很容易想到將待打印的信息拆分成一個(gè)個(gè)信息段撩银,然后分別打印即可给涕。
我在實(shí)際測(cè)試時(shí)發(fā)現(xiàn),日志的最大長(zhǎng)度其實(shí)是略小于4*1024的,為了保險(xiǎn)起見(jiàn)够庙,我們?cè)O(shè)置每一段日志長(zhǎng)度segmentSize = 3*1024恭应。如果待打印的字符串信息長(zhǎng)度小于等于segmentSize,則直接打印即可耘眨;如果大于segmentSize則將日志信息截?cái)酁橐欢我欢畏謩e打印昼榛。
代碼如下:
public class LogUtil {
/**
* 截?cái)噍敵鋈罩? * @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 ) {// 長(zhǎng)度小于等于限制直接打印
Log.e(tag, msg);
}else {
while (msg.length() > segmentSize ) {// 循環(huán)分段打印日志
String logContent = msg.substring(0, segmentSize );
msg = msg.replace(logContent, "");
Log.e(tag, logContent);
}
Log.e(tag, msg);// 打印剩余日志
}
}
}