NSLog日誌輸出不全問題分析與解決方案

採用NSLog打印超長的字符串,可能出現日誌沒有打印完全,後面一部分丟失了。
開始以爲是和異步一致一起打印時被異步日誌線程強行插入,結果找了半天沒有找到,說明它根本沒有打印出來。
出問題的日誌打印代碼:NSLog(@"3加密前:%@", data);,怎麼看這個代碼沒有任何問題,打印(NSLog(@"data.length:%d", data.length);)出的這個字符串長度是比較長:data.length:7353。我懷疑是系統這個打印函數是有內存限制,超過它的長度就直接截取扔掉了後面的字符。
分析它最大能支持多長的字符串:加[ { "openType" : "03", "openTime" : "1564651163", "uid" : "3130303030393539" }, { "openType" : "03", "openTime" : "1564651170", "uid" : "3130303030393539" }, { "openType" : "03", "openTime" : "1564651176", "uid" : "3130303030393539" }, { "openType" : "03", "openTime" : "1564651182", "uid" : "3130303030393539" }, { "openType" : "03", "openTime" : "1564651188", "uid" : "3130303030393539" }, { "openType" : "03", "openTime" : "1564651194", "uid" : "3130303030393539" }, { "openType" : "03", "openTime" : "1564651200", "uid" : "3130303030393539" }, { "openType" : "03", "openTime" : "1564651206", "uid" : "3130303030393539" }, { "openType" : "03", "openTime" : "1564651212", "uid" : "3130303030393539" }, { "openType" : "03", "openTime" : "1564651218", "uid" : "3130303030393539" }, { "openType" : "03", "ope,它實際只有1021個包含空格漢字的字符。難道它真的只能打印這麼一點字符串嗎?
我直接對這個字符串打印:NSLog(@"%@", data);。結果直接把這7353個字符全部打印出來了。可以看到它不是隻打印這1021個漢字和字符這麼點內容,應該可以打印很多。
難道是因爲拼接的同時進行打印纔有這個限制,我測試這種情況:NSLog(@"testdata%@", data);,結果仍是可以把這7353個字符全部打印出來。可以看出推測不完全對。
然後我試一下再外面拼接字符串,直接對字符串進行打印:

                str = [NSString stringWithFormat:@"加%@", data];
                NSLog(@"%@", str);

結果和不行,也把這7353個字符全部打印出來。可以看出推測不完全對。
比對他們的不同發現了規律:在打印是拼接字符串,並且裏面的常量字符串裏有中文,纔會出現打印的字符串很短,超過最大的長度字符串後面的部分被扔掉。那麼找到的問題的所在,那來研究下這個最大長度是多少呢?
由於發現打印的最大的字符串最大是1021個字符,包含一個漢字,很可能和1021個字符有關,就對字符串進行截取測試。測試發現:在一箇中文常量的情況下,和一個1020個字符的字符串拼接沒有問題,但是和1021個字符的字符串拼接後打印少了最後一個字符。
總結:
當直接打印一個長字符串,只要不是超級長,一般沒有問題。當加入輸出信息,並且有常量中文時,和變量字符串拼接時,當他們的字符數和超過1021時,後面的字符串打印不出來(測試的場景是:一箇中文字符和和不含有非漢字json字符串。若中文多,他們的總和是否爲1021,沒有進一步研究)。
開發環境有效的重置NSLog的方法,這種方案我提倡,這個已經原來的mac的控制檯打印函數,而是採用的linux操作系統日誌函數進行替換了原來的函數了:

#ifndef __OPTIMIZE__
    //這裏執行的是debug模式下,打印日誌,當前行
    #define NSLog(...) printf("%s %s 第%d行: %s\n",__TIME__, __PRETTY_FUNCTION__ ,__LINE__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String]);
#else
        //這裏執行的是release模式下,不打印日誌
    #define NSLog(...)
#endif

推薦解決方案:
先把要打印的所有字符串拼接爲一個字符串,然後一次打印。

解決方案:
先把要打印的所有字符串拼接爲一個字符串,然後一次打印。至於直接重置NSLog:#define NSLog(format, ...) printf("TIME:%s FILE:%s(%d行) FUNCTION:%s \n %s\n\n",__TIME__, [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, __PRETTY_FUNCTION__, [[NSString stringWithFormat:(format), ##__VA_ARGS__] UTF8String])我不提倡。
測試代碼:

                NSLog(@"data.length:%d", data.length);
                NSString *str = [NSString stringWithFormat:@"%@", [data substringToIndex:1022]];
                NSLog(@"加%@", str);
                NSLog(@"str.length:%d", str.length);
                str = [NSString stringWithFormat:@"%@", [data substringToIndex:1021]];
                NSLog(@"加%@", str);
                str = [NSString stringWithFormat:@"加%@", [data substringToIndex:1021]];
                NSLog(@"%@", str);
                NSLog(@"str.length:%d", str.length);
                str = [NSString stringWithFormat:@"%@", [data substringToIndex:1020]];
                NSLog(@"加%@", str);
                str = [NSString stringWithFormat:@"加%@", [data substringToIndex:1020]];
                NSLog(@"%@", str);
                NSLog(@"str.length:%d", str.length);
//                str = [NSString stringWithFormat:@"3加密前:data:%@", data];
                NSLog(@"3加密前:%@", data);

打印的日誌,大家可以對照進行分析:

2019-08-02 16:11:54.297359+0800 ELock[1447:400407] data.length:7353
2019-08-02 16:11:54.297597+0800 ELock[1447:400407] 加[	   {	     "openType" : "03",	     "openTime" : "1564651163",	     "uid" : "3130303030393539"   },	   {	     "openType" : "03",	     "openTime" : "1564651170",	     "uid" : "3130303030393539"   },	   {	     "openType" : "03",	     "openTime" : "1564651176",	     "uid" : "3130303030393539"   },	   {	     "openType" : "03",	     "openTime" : "1564651182",	     "uid" : "3130303030393539"   },	   {	     "openType" : "03",	     "openTime" : "1564651188",	     "uid" : "3130303030393539"   },	   {	     "openType" : "03",	     "openTime" : "1564651194",	     "uid" : "3130303030393539"   },	   {	     "openType" : "03",	     "openTime" : "1564651200",	     "uid" : "3130303030393539"   },	   {	     "openType" : "03",	     "openTime" : "1564651206",	     "uid" : "3130303030393539"   },	   {	     "openType" : "03",	     "openTime" : "1564651212",	     "uid" : "3130303030393539"   },	   {	     "openType" : "03",	     "openTime" : "1564651218",	     "uid" : "3130303030393539"   },	   {	     "openType" : "03",	     "ope
2019-08-02 16:11:54.461804+0800 ELock[1447:400407] str.length:1022
2019-08-02 16:11:54.461982+0800 ELock[1447:400407] 加[	   {	     "openType" : "03",	     "openTime" : "1564651163",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651170",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651176",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651182",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651188",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651194",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651200",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651206",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651212",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651218",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "ope
2019-08-02 16:11:54.473584+0800 ELock[1447:400407] 加[	   {	     "openType" : "03",	     "openTime" : "1564651163",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651170",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651176",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651182",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651188",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651194",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651200",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651206",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651212",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651218",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "open
2019-08-02 16:11:54.475564+0800 ELock[1447:400407] str.length:1022
2019-08-02 16:11:54.475860+0800 ELock[1447:400407] 加[	   {	     "openType" : "03",	     "openTime" : "1564651163",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651170",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651176",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651182",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651188",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651194",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651200",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651206",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651212",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651218",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "ope
2019-08-02 16:11:54.477939+0800 ELock[1447:400407] 加[	   {	     "openType" : "03",	     "openTime" : "1564651163",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651170",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651176",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651182",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651188",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651194",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651200",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651206",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651212",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "openTime" : "1564651218",	     "uid" : "3420303038763539"   },	   {	     "openType" : "03",	     "ope
2019-08-02 16:11:54.480312+0800 ELock[1447:400407] str.length:1021
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章