之前 MCO fb 群组教人 debug 的时候无意中想到, 如果有一个命令,能收集所有常见的错误关键字来秒 grep 会超级有用。
不管你是 /var/log, 还是 logcat, 还是什么鬼程序的 log, 都能轻易看出错误的地方, 这些错误的地方值得关注为啥会错误, 而不是迷失在大量无意义的正常 log。
即便有些错误对程序来说是正常输出,我个人觉得仍然值得关心干啥会有错误字眼。而且有杀过没放过,看多好过遗漏。错误的 log 不是非常多,花不了太多时间, 而且很多是重复性的源自于同一个程序错误, 只要解决该程序问题就能大量减少该错误信息。
我知道 dmesg 可以分类, 譬如 `dmesg --facility=kern --level=emerg,alert,crit,err`。但是仍然不能说正常 log 没有值得关注的错误信息。而且我目标应付是任何程序的 log (当然不可能完美,有些字眼对某些程序或许重要/不重要而遗漏,这种情况下可以加上 -v 稍微检查是否有遗漏, 或添加排除该程序不重要的字眼)。
命令代码和往后的详情更新,请浏览 https://github.com/limkokhole/Catch-Err-All
你可以看到 (?<! b|dia)log(?![a-z]), 表示我要看到有 log 关键字的 line, 但是又不想包括 blog, dialog,logic, login 这些常见字眼。前面是 `?<!` , 后面是 `?<`, 区别只是前面多了一个 `<`。要添加的时候,先检查现成有没有才修改 (比如我要 exclude "dialog",我找到现成已有 "log", 那就在 "log" 那里 extend, 而不是加新的 `| |` )。
你可能会问有 "impossible" 为何没有常见的 "not possible", 因为 "not" 已拥有自己的 `| |`。所以不需要重复加 "not possible", "not able", "not found" 之类的 | |, 省很多。想一下,有 `not `的 log 是不是很多都是跟错误(或值得关注)有关系的?就是这么个玩法。block 也是同理,有 lock 了不需要 block。改的时候要小心, 譬如 dump 是包括 core.?dump 的哦。err 可能比较常改, 所以最好分 errno 和 interrupt 出来。
还有一些比较主观的讲究, 比如 disabling, revoking ... 我觉得没那么重要,重要的是 disabled, revoked, 所以我才放 disable 而不是 disabl。还有 pause 不是很重要,毕竟只是暂停,并非如 stop 或 cancel 那么重要。放太多会很 noise 所以要取舍。
最后第二个 `\?` 是黑人问号 ?, 如果问号 ? 在 log 是正常的就要拿掉或修改。此命令主要就是 universal template,不是直接用就完美,但起码有个起点让你稍微修改就搞掂。
最后则是常见的感叹号 "!", 排除常见的 `[ !` shell 格式和 `<! `html tag 以减少噪音, 不过仍然得保留常用来表达某些事物不等同而出错的 `!=` 符号。
有时你想了解上下文,可以加类似 -C 5 的 grep 选项或最后的 ' 前放多一个 `|` (不需要值) 即可显示全部不过仍然有搜索颜色看。
效果截图: