论日志的重要性


日志已经成为我的除了代码外的第二个神器了!也许代码和日志,是软件的双子星座!

代码的重要性,我想无需多言。

但是日志的重要性,其实很多人并没意识到。

当然,很多人的神器可能是gdb、windbg、lsof、strace等等调试工具。

说实话,这些工具,我会简单使用。

有时我会想,可能我太依赖于日志了,导致对这些工具不熟。

但是有时想,如果能把一种工具用到极致,未尝不好。

能解决问题是正道!

而日志不仅仅是解决问题!

让我认识到日志的重要性,还是09年进去的一家数字电视公司。

当时还是菜鸟级,只是经常看到同事解决问题,首先看日志,通过VPN共享。

感觉效率非常棒!

没多久去了一家安防公司,这家公司动不动就出差!

去现场解决问题!

奇怪的是,很少有人讨论日志。

后面我自己负责重构了两个产品,一个工具和一个服务器。

从第一个工具开始,我就着手日志的设计!

效果让我觉得很好!

到后来的服务器,我对自己要求更高!

日志的文件大小、级别、打印频率等等严格控制,

而且必须提炼出关键字!

每每出问题,先看error级别,warning级别,再查关键字!

整个流程非常清晰的摆在你的面前。

现场和调试超过80%的问题能得以解决

即使不能解决的,比如说越界,基本上也能找到非常重要的线索。

没有问题的时候,我会经常琢磨日志:是否太频繁,是否合理,是否描述可以更简洁。

代码review的时候,我会检查关键步骤和异常情况是否有对应的日志。

所以,当时我就得出了其软件具备“可维护性”!

其实,在平时的调试和测试,也经常协助其他同事发现问题。

比如配置、安装和部署等一些错误。

因为关键配置和关键步骤同样有对应的日志!

所以日志就像一张网一样,覆盖了所有代码。

所以有代码的地方,一定有对应的日志;

所以但是,日志和代码一样,必须得体!

必须符合一定的原则。

原则一:不能太频繁、但又不能没有!

太频繁会影响性能,如果投射到控制台上,会疯狂的刷屏;

如果做高性能服务器,性能会明显下降。

有不少人是这样:不是没有日志,而是一堆无用的日志。

也有人重要的、想要的日志看不到。

所以我们为了符合这个条件,经常想尽办法!

比如:调整日志的间隔、或者加上条件判断。

原则二:级别必须恰当,和Bug级别一样!

每一个级别必须有对应的意义,不能随意设置;

如果出现error、warning一定是有严重的问题。

而Info一些重要或者关键的信息;

而debug、trace则是更细致的打印,为了更详细的查找问题。

还是那家数字电视,我依然记得其trace级别又分成好些层次,或者根据模块划分!

系统正常运行时,必须是info级别,调试时改变级别必须调整回去。

原则三:关键字设计!

除了级别外,必须要有关键字。

因为级别的过滤,不一定形成流程,不一定看清轮廓。

但是关键字的设计就可以。

比如说磁盘的检查和管理,关键字为"disk check"。

先通过级别过滤大致哪里(哪个模块)除了问题,比如磁盘检查。

那么磁盘检查的具体哪一步呢,是读还是写还是配置出了问题?

再通过上述关键字过滤:

各个级别的日志都来了,每一步的参数都能体现出来了,error是在流程的哪一步,前后具体做了什么等等

非常清晰的展现出来。

所以非常容易的分析到问题。

所以,最终提出总的要求是:

长时间Info级别运行,

单个文件不能超过50M,日志个数固定13,但能至少覆盖一个月!

而且能解决至少80%的现场问题!

最终的效果就是:基本上不需要出差!增效降本!

所以我是不是也可以说,日志让其他工具黯然失色,因为日志具备更好的可维护性、可预测性、可控制性和整体性!

ps:  案例:下图是从众多的日志中截取下来,重点分析的一段日志!