Effective Debug Logging (part 4)
这是这个系列的第四部分,也是最åŽä¸€éƒ¨åˆ†ï¼Œæˆ‘们将讨论如何有效的分æžè°ƒè¯•æ—¥å¿—,并给出一些典型的日志分æžæ–¹æ³•å’Œç»éªŒã€‚
如何分æžè°ƒè¯•æ—¥å¿—
当支æŒäººå‘˜æˆ–者开å‘人员拿到调试日志时,通常的分æžæ–¹æ³•æ˜¯å…ˆæ‰¾åˆ°ç”¨æˆ·é‡åˆ°çš„问题所对应的日志,从这里出å‘,进行跟踪,并分æžå‡ºçŽ°è¿™ç§é—®é¢˜çš„åŽŸå› ã€‚åœ¨è¿™ä¸ªè¿‡ç¨‹å½“ä¸ï¼Œå˜åœ¨ä¸‰ä¸ªå¿…è¦çš„æ¥éª¤ï¼šå‘现问题所对应的日志,跟踪,分æžåŽŸå› ,这也是分æžè°ƒè¯•æ—¥å¿—的一般方法。
在整个过程当ä¸ï¼Œå‘现问题所对应的日志所在往往会消耗大é‡çš„时间。主è¦åŽŸå› 之一是分æžäººå‘˜æ‹¿åˆ°çš„日志往往是最低调试级别的,往往日志的æ¡ç›®éžå¸¸å·¨å¤§ï¼Œè€Œä¸”å¯èƒ½ä¸åŒ
的模å—ã€ä¸åŒçš„线程的调试日志混æ‚在一起,导致难于分æžã€‚å› æ¤å¯¹äºŽå¦‚æ¤å¤§é‡æ—¥å¿—,通过必è¦çš„辅助工具支æŒèƒ½å¤Ÿå¤§å¤§çš„æ高效率。
第一ç§è¾…åŠ©å·¥å…·æ˜¯æ—¥å¿—è¿‡æ»¤å’Œåˆ‡åˆ†å·¥å…·ã€‚æ ¹æ®æ—¥å¿—的所属的ä¸åŒæ¨¡å—ã€çº§åˆ«ï¼Œæˆ–è€…æ ¹æ®çº¿ç¨‹æˆ–日志的相关性键值,对日志进行过滤和切分,将其划分æˆå¤šä¸ªå°çš„相关的日志模å—,将æžå¤§çš„方便进行分æžã€‚è¿™ç§å·¥å…·å¯ä»¥ç”¨è„šæœ¬å®žçŽ°ï¼Œæˆ–者用grep过滤,甚至直接使用编辑器的查找功能(如ultraedit的“列出所有行â€åŠŸèƒ½ï¼‰ï¼Œé€šå¸¸å°†åœ¨å¾ˆå¤šæ—¶å€™å°±è¶³å¤Ÿäº†ï¼Œå› æ¤ä¸åšç»†è‡´çš„讨论。
Tip 23ï¼šä½¿ç”¨åˆ‡åˆ†å’Œè¿‡æ»¤å·¥å…·å°†æ—¥å¿—æ ¹æ®ç›¸å…³æ€§åˆ’分æˆå¤šä¸ªå°çš„日志模å—进行分æžã€‚
有的时候问题å¯èƒ½å‡ºçŽ°åœ¨ä¸åŒå系统之间的交互之上,或者对于æŸä¸€ä¸ªå¯¹è±¡çš„æ“作会跨越多个å系统,而ä¸åŒçš„å系统的日志文件å¯èƒ½å…·æœ‰ä¸åŒçš„文件å‰
ç¼€ã€‚å› æ¤ï¼Œå¿…è¦æ—¶å¯ä»¥ç”¨æ—¥å¿—组åˆå·¥å…·å°†å¤šä¸ªå系统的日志组åˆä¹‹åŽï¼Œå†ç»è¿‡æ—¥å¿—切分工具进行切分。这ç§æ“作通常就需è¦ä¸¤ä¸ªå系统之间ä¿æŒä¸€å®šçš„æ—¥å¿—æ ¼å¼çš„规
约,以便工具å¯ä»¥å®¹æ˜“çš„æ‰¾åˆ°ç›¸å…³æ€§çš„é”®å€¼å¹¶æ ¹æ®è¿™ä¸ªé”®å€¼è¿›è¡Œç»„åˆã€‚
Tip 24:当需è¦è·¨è¶Šå系统进行跟踪时,å¯ä»¥ä½¿ç”¨æ—¥å¿—组åˆå·¥å…·å°†æ—¥å¿—组åˆä¹‹åŽå†è¿›è¡Œåˆ‡åˆ†ã€‚
对于划分好的å模å—的分æžå°±æ˜¯å‘挥人类洞察力的时候了,人类的智慧就应该用在这ç§åœ°æ–¹:)。而一旦通过æŸç§æ–¹å¼å‘现了问题所对应的日志,接下æ¥çš„工作就相对简å•äº†ã€‚而一旦å‘现了问题所在,我们建议将这ç§é—®é¢˜æ‰€å¯¹åº”的日志抽å–出æ¥é€‚当的模å¼ï¼Œå¹¶å°†è¿‡ç¨‹æˆ–ç»“æžœåŠ ä»¥è®°å½•ï¼Œç”¨å¯è¿è¡Œçš„脚本或需è¦æ‰‹åŠ¨æ“作的æ¡æ–‡éƒ½å¯ä»¥ã€‚è¿™æ ·æœªæ¥å°±å¯ä»¥æ ¹æ®è¿™äº›ç§¯ç´¯ï¼Œå¿«é€Ÿçš„确定已知问题。
Tip 25:å°è¯•å°†å·²çŸ¥é—®é¢˜çš„日志模å¼åŠ 以记录,以便å¯ä»¥åœ¨é—®é¢˜åˆ°æ¥æ—¶å®¹æ˜“的确定是å¦æ˜¯å·²çŸ¥é—®é¢˜ã€‚
对于æŸäº›ç‰¹å®šçš„问题,我们已ç»æœ‰äº†ç›¸åº”的日志模å¼ã€‚
第一类问题是程åºå´©æºƒï¼Œè¿™ç§æƒ…况很容易通过分æžPIDå˜åŠ¨ä¹‹å‰çš„æ—¥å¿—æŸ¥å‡ºåŽŸå› ï¼Œå› æ¤ï¼Œç”¨æŸç§å·¥å…·å¿«é€Ÿçš„定ä½PIDå˜åŠ¨çš„地方,并查找附近的特å¾å—符串,å³å¯çŸ¥é“是å¦å‘生了崩溃。
Tip 26:使用工具定ä½PIDå˜åŠ¨çš„ä½ç½®å¹¶æŸ¥æ‰¾ç‰¹å¾å—符串,å¯ä»¥æ£€æµ‹åˆ°ç¨‹åºçš„崩溃。
第一类问题是性能问题或æ»é”。这也是Tip
18çš„æ¥æºã€‚我们å¯ä»¥é€šè¿‡æ±‚出æ“作开始之å‰å’Œç»“æŸä¹‹åŽçš„两æ¡æ—¥å¿—之间的时间差值æ¥å¾—到这个æ“作æŒç»çš„时间,或者识别这些æ“作是å¦å®Œæˆï¼Œæ˜¯å¦é™·
å…¥äº†æ— é™ç‰å¾…或超时ç‰ç‰ã€‚è¿™ç§æ¨¡å¼å¾ˆå®¹æ˜“通过自动化工具æ¥æ‰¾åˆ°ã€‚而对于性能问题,å¯ä»¥é€šè¿‡å·¥å…·åˆ†æžæ—¥å¿—,统计其ä¸æœ€è€—时的一些æ“作,并对其进行统计å¦åˆ†æžï¼Œå¯¹äºŽå®žé™…用户环境当ä¸çš„性能瓶颈也å¯ä»¥æœ‰å¾ˆå¥½çš„预测,对于将æ¥çš„设计和改进也是éžå¸¸é‡è¦çš„资料。
Tip 27:通过分æžæ—¥å¿—之间的时间差,å¯ä»¥æ£€æµ‹æ€§èƒ½é—®é¢˜æˆ–æ»é”。
å¦ä¸€ç§é—®é¢˜æ˜¯å†…å˜æˆ–资æºçš„泄æ¼ã€‚虽然这ç§é—®é¢˜å¯èƒ½ä¸æ˜¯å¯ä»¥ä»…仅通过调试日志解决的。但是在有的时候,唯一能够用æ¥è°ƒè¯•å†…å˜æ³„æ¼çš„åªæœ‰è°ƒè¯•æ—¥å¿—ï¼Œå› æ¤å…ˆä»Ž
调试日志当ä¸åˆ†æžï¼Œæœ‰æ—¶ä¹Ÿèƒ½å¤Ÿå‘现一些问题,至少å¯ä»¥æŽ’除掉一些å¯èƒ½ã€‚å¦‚æžœæ ¹æ®Tip
19çš„å»ºè®®ï¼Œåœ¨å¯¹è±¡çš„æž„é€ ã€æ‹·è´ã€æžæž„çš„æ—¶å€™éƒ½åŠ ä¸Šäº†å¿…è¦çš„日志,那么通过简å•çš„脚本扫æ所有的相关的日志项å³å¯çŸ¥é“是å¦æ‰€æœ‰çš„对象都得到了æ£ç¡®çš„æžæž„
了。如果需è¦å¯¹äºŽå†…å˜æ³„æ¼é—®é¢˜è¿›è¡Œæ›´å¤šçš„分æžï¼Œä¹Ÿå¯ä»¥å»ºç«‹ä¸€ç§æœºåˆ¶ï¼Œåœ¨æ—¥å¿—当ä¸è®°å½•æ‰€æœ‰çš„内å˜åˆ†é…和释放的æ“ä½œï¼Œå¹¶åŠ ä»¥åˆ†æžã€‚
Tip 28:通过分æžæ—¥å¿—当ä¸èµ„æºåˆ†é…和释放的é…对情况,å¯ä»¥ç”¨æ¥æ£€æµ‹å†…å˜æˆ–资æºæ³„æ¼ã€‚
在å‘现了问题之åŽï¼ŒæŽ¥ä¸‹æ¥çš„å°±æ˜¯æ ¹æ®æ—¥å¿—进行程åºæ‰§è¡Œè·¯å¾„的跟踪。由于å¯èƒ½éœ€è¦ç»è¿‡å¤æ‚的程åºæ‰§è¡Œè·¯å¾„æ‰èƒ½å¤Ÿå‡ºçŽ°é—®é¢˜ï¼Œå®Œå…¨çš„手动跟踪是一件éžå¸¸æ¶ˆè€—人力物力的事情。由于在日志当ä¸çš„记录了代ç 文件和行数,以åŠå‡½æ•°å,这ç§åŠ¨ä½œä¹Ÿå¯ä»¥ä¸€å®šç¨‹åº¦ä¸Šé€šè¿‡å·¥å…·è‡ªåŠ¨åŒ–寻找下é¢çš„æ‰§è¡Œè·¯å¾„ï¼ŒåŠ å¿«è·Ÿè¸ªçš„é€Ÿåº¦ã€‚
Tip 29:使用自动化工具æ¥è¾…助路径跟踪。
虽然我们一直在强调辅助工具的é‡è¦æ€§ï¼Œä½†æ›´é‡è¦çš„还是日志的清晰程度和分æžäººå‘˜çš„è€å¿ƒä»¥åŠæ´žå¯ŸåŠ›ï¼Œè€Œè¿™ç§æ´žå¯ŸåŠ›å¾€å¾€éœ€è¦é€šè¿‡ç»éªŒçš„积累æ‰èƒ½èŽ·å¾—。工具åªèƒ½å¤Ÿç”¨æ¥è¾…助查找已知问题和给出建议,人的努力æ‰æ˜¯å‘现问题ã€è§£å†³é—®é¢˜çš„最终关键。
Tip 30:工具åªæ˜¯è¾…助,人的è€å¿ƒã€æ´žå¯ŸåŠ›å’Œç»éªŒæ‰æ˜¯åˆ†æžæ—¥å¿—的最é‡è¦èµ„本。
总结
至æ¤ï¼Œè¿™ä¸ªå››ä¸ªéƒ¨åˆ†çš„æ–‡ç« å‘Šä¸€æ®µè½ã€‚æˆ‘å†™è¿™ç¯‡ä¸ªç³»åˆ—æ–‡ç« çš„ç›®çš„åœ¨äºŽå¸Œæœ›èƒ½å¤Ÿæ€»ç»“å’Œåˆ†äº«æœ‰å…³è°ƒè¯•æ—¥å¿—ç»éªŒï¼Œå¹¶ä¸ºæŽ¥ä¸‹æ¥çš„工作当ä¸å¯¹äºŽè°ƒè¯•æ—¥å¿—的书写ã€å¤„ç†çš„æ ‡å‡†åŒ–ä½œä¸€äº›æ€è€ƒã€‚这些虽然都ç»éªŒï¼Œä½†æ¯•ç«Ÿæ˜¯ä¸€å®¶ä¹‹è¨€ï¼Œéš¾å…ç‹éš˜ç”šè‡³é”™è¯¯ï¼Œå¸Œæœ›æœ‰æ›´å¤šçš„人å¯ä»¥å‚与讨论,给出更多的建议和分享更多的ç»éªŒã€‚