一個(gè)優(yōu)秀的軟件系統(tǒng)一定會(huì)實(shí)時(shí)保存系統(tǒng)運(yùn)行過程中產(chǎn)生的異常或非異常性數(shù)據(jù)疙剑,用于記錄系統(tǒng)運(yùn)行過程產(chǎn)生的各種行為先煎,作為日后發(fā)現(xiàn)問題椭岩、跟蹤問題并解決問題的一個(gè)很重要的依據(jù)茅逮。一般以輸出文件的形式保存,同時(shí)也可以選擇性的在控臺(tái)打印判哥。日志處理献雅,可謂是任何軟件開發(fā)過程中必不可少的一個(gè)環(huán)節(jié)。
在Android應(yīng)用開發(fā)階段塌计,我們常常會(huì)使用系統(tǒng)提供的日志打印功能選擇性地在Logcat控制臺(tái)上打印一些數(shù)據(jù)信息惩琉,便于更加直觀地調(diào)試跟蹤應(yīng)用運(yùn)行的一個(gè)狀態(tài),常見如客戶端與服務(wù)器通訊過程中涉及到的URL鏈接夺荒、request請(qǐng)求參數(shù)和response響應(yīng)結(jié)果等瞒渠。
但如果打印的message過長,比如接口響應(yīng)結(jié)果過大技扼,將會(huì)導(dǎo)致Logcat控臺(tái)數(shù)據(jù)顯示不全伍玖。自打使用Log以來經(jīng)常遇到這個(gè)問題,之前也是沒太在意剿吻,畢竟message太長的情況也是少見窍箍,偶爾遇到這種情況就通過Debug工具跟蹤調(diào)試,復(fù)制對(duì)應(yīng)response信息到bejson等其他輔助工具上格式化瀏覽丽旅,多少還是有點(diǎn)不方便椰棘。
后來經(jīng)過查詢才得知,Android系統(tǒng)的單條日志打印長度是有限的榄笙,在底層Logger驅(qū)動(dòng)程序的一個(gè)類Logger.h
頭文件中有如下兩行代碼:
#define LOGGER_ENTRY_MAX_LEN (4*1024)
#define LOGGER_ENTRY_MAX_PAYLOAD \\
(LOGGER_ENTRY_MAX_LEN - sizeof(struct logger_entry))
可以看出邪狞,系統(tǒng)顯示單條Log信息的長度是固定的,為4*1024個(gè)字符長度茅撞!Logcat使用的liblog資源包也提到帆卓,使用Log打印的message有可能被log內(nèi)核驅(qū)動(dòng)縮短:
The message may have been truncated by the kernel log driver.
了解了其中的長度限制巨朦,就好辦了。我們可以對(duì)Message做個(gè)長度判斷剑令,采取分段打印的辦法輸出日志信息糊啡,比如這樣做:
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);
}
參考地址: