软件设计之——深入理解日志系统

每个软件都有自己的日志系统,每种语言都有自己的日志框架/模块,随着互联网和大数据的蓬勃发展,分布式的日志系统,以及日志分析系统也应用的越来越广泛,越来越成熟。

这里讨论的日志设计,主要关注日志的内容,而不是日志框架/模块的实现和使用。日志的内容就是,软件应该在什么地方?使用什么等级?输出什么信息?看似简单,里面却有大学问。我看过输出信息一团乱麻、零碎混乱的日志,也看到过逻辑清晰、工整条理的日志。好的日志文件令人神清气爽,事半功倍;差的日志文件则是雪上加霜、火上浇油,要人命!可见,想做好并不简单!

因此,如何设计一个可用的、良好的日志系统呢?

1 谁在使用日志

有一个问题,可能很多开发人员并没有认真思考过,就是日志到底是给谁用的?用户,运维,开发人员,软件学习爱好者?当然,答案是全部。
这里写图片描述

这里写图片描述

不同的角色,有不同的视角,在不同的阶段,有不同的需求,那么日志就应该提供不同的帮助。在做日志模块的内容设计时,也应该站在不同的角度去考虑,要思维清晰,哪些信息给用户看,哪些给运维人员看,哪些给程序员看。要讲究轻重主次,不是说详细就一定好,给客户看调用栈的信息有意义吗?
这里写图片描述

2 日志的等级

开发过一些系统,大体的感受是这样的:刚开始的时候,大家都相对比较讲究,日志的等级、内容、位置都会去思考、选择。但是随着时间不断的延伸,功能不断的扩展,日志逐渐变的混乱,最终沦落为乱麻一片!

日志通常有多个等级,等级并不单单指“详细程度”,还关系到适用场景,服务对象,目的功能等。

ERROR: 准确!Matter life or death!

是错误信息——包括错误的类型,错误的内容,位置和场景,是否可恢复,等等等等。只有当错误会影响到系统的正常运行时,才应该作为错误日志输出;就好像是医院体检后,确诊了,就是HIV阳性,铁定没跑了,自求多福吧,做决定吧!这才是“错误”的意思。

WARN: 提个醒

扫描二维码关注公众号,回复: 864886 查看本文章

是提醒信息,要留心,要关注,只是目前还正常。私生活太糜烂了,提醒你一下,自己反省反省,再任性下去后果自负哦!

INFO: 简洁!Who? When? Where? Do 了 what?

系统的基本运行过程,运行状态,每逢大事mark一下,捡重要的、关键的记,别太唠叨,老板们很忙没工夫认真看!

DEBUG: 详细!Details of process!

系统运行过程与状态的细节信息,可用于调试。类似于警察审讯嫌疑犯,从昨天晚上八点到今天早上十点半,老实交代,每分钟都说说清楚了;DEBUG的目的就是要破案!

TRACE: 细致入微!Details of structure and content!

系统结构与内容的细节信息,这个就更详细了,比如一些关键对象的内容,函数调用参数、结果,等等吧!就是要给软件拍个片,五脏六腑,七经八脉,都dump出来看看;不光要审讯,还要验血,验指纹,验DNA!

这里把日志系统跟业务跟踪系统分开了,但是有时候,当系统规模不大时,日志系统也会承担起业务跟踪、业务分析,甚至资源统计的功能!

3 日志使用的几种场景

1) 开发过程中:

日志是一种友好、强大的记录软件运行时内部结构和状态的工具,是调试利器,当然每种语言都会提供专门的调试工具,比如c/c++ gdb,java 的 jdb 等等。但是涉及到业务逻辑,并发,交互等情况时,还是日志更轻巧、便捷!我一般是在对“陌生”代码(比如开源软件)学习时,才会用gdb等调试工具,强大但笨重,更适合梳理代码结构,而不是功能或业务结构!

2) 测试过程中:

在进行功能测试时,通过debug或trace信息,就像看监控回放一样,让犯罪分子无处遁行!

3) 软件学习时:

学习软件时,包括软件的架构设计、业务功能、代码逻辑,日志总能提供很多线索、很多帮助。记得很久以前,看某个开源系统的代码,部署完以后,直接打开trace跑一边,系统的整体结构及内容,一目了然,再结合设计文档,很快就没明白了!就那一刻,让我深刻的记住,好的日志系统,原来是这么的神奇啊!

4) 正常运行:

一定不要开着 debug 跑系统,没有意义!前提是,ERROR信息要准确、规范,客户只关系生死问题,再多的信息对他们也没有意义!

4 最佳实践

1

猜你喜欢

转载自blog.csdn.net/antony1776/article/details/78009977