论日志的重要性
日志已经成为我的除了代码外的第二个神器了!也许代码和日志,是软件的双子星座!
代码的重要性,我想无需多言。
但是日志的重要性,其实很多人并没意识到。
当然,很多人的神器可能是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: 案例:下图是从众多的日志中截取下来,重点分析的一段日志!