一个优秀的软件系统一定会实时保存系统运行过程中产生的异常或非异常性数据,用于记录系统运行过程产生的各种行为,作为日后发现问题、跟踪问题并解决问题的一个很重要的依据。一般以输出文件的形式保存,同时也可以选择性的在控台打印。日志处理,可谓是任何软件开发过程中必不可少的一个环节。
在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));
}
```
at libcore.io.IoBridge.open(IoBridge.java:438)
... 10 more。关键我想看调用栈这里的more