咱们好,我是蓝胖子,信任咱们或多或少都有这样的经历,当你担任的功能呈现线上问题时,领导第一时间便是找到你询问原因,但是有时问题的根因或许不在你这儿,仅仅这个功能或许依赖了第三方或许内部其他部分,这个时分快速排查问题根因便是要害,给领导留个快速处理问题的印象,绩效也找不到理由给你打低了。

而日志作为最简单最直接的排查问题手段,就起到了至关重要的作用, 关于怎么打日志,我谈谈我的一些感悟。

日志应该由什么组成

首先,咱们来思考下日志应该具有哪些维度的信息,日志无非便是要记载,什么时间,什么地址,发生了什么事情。

针对于应用程序来说,便是哪台主机,哪个应用服务,哪种事务,在某个时间点,呈现了什么问题

这里要特别注意的是,日志应该包含事务的上下文信息,例如,要记载某个用户做了支付行为,你应该要记载用户的id,订单号,乃至能够更详细点,把订单的价格,购买的商品信息都记载下来,以便后续排查问题时能直接经过日志找到用户的支付记载。

当然,事务的上下文信息需求根据事务状况决定,不同事务需求考虑下需求打印的事务信息。

打印的日志格局,我仍是主张json,究竟json 更简单被剖析,特别是如果是当用上ELK这类的日志搜集框架后,能很简单对日志提取字段进行剖析。比方将日志中的应用服务称号字段提取出来,在ELK中做聚合剖析,咱们能剖析出某段时间内,究竟是哪个应用在张狂的打日志。

乃至也能够从日志中提取事务场景字段,对其进行聚合剖析,得出某段时间内,那种事务在张狂打印日志,评估其日志打印是否合理,如下图所示,是在kibana上对过去15小时的日志按事务场景对日志量进行的剖析。

你应该打好你的日志,最少防止被甩锅

我总结下,日志的根本组成如下

{"host"="主机名",log_time="打印日志格局",app="应用服务称号",action="事务场景",msg="描绘信息", err="如果有过错打印过错信息",  事务上下文信息....}

日志的作用

日志除了按上面说到的进行聚合统计剖析系统日志量状况外,还能够按事务维度的字段进行聚合剖析,比方将事务场景字段设置为登录,使用它统计每天,每小时登录的人数。使用日志做一些事务维度的监控

当然,日志除了去进行剖析统计外,更是为了处理问题,对犯错进行康复,让系统留下运转的痕迹而打印的。打印日志前,一定要想清楚,咱们需求处理的问题。

举一个场景,蓝胖子之前在服务中做过邮递服务,由于邮递需求依靠第三方的接口,而且整个邮递的逻辑比较杂乱,会有许多邮递过滤条件,而且后续的产品功能持续有对这部分过滤逻辑进行修改,怎么在对第三方接口进行容错,怎么后续的迭代进程中对 过滤代码进行容错,保证犯错后能有方法康复犯错用户的邮递就成了要思考的问题。

其实要处理这类问题,最简单的方法便是将程序的运转轨迹能用日志表示出来,有了日志,日志被ELK此类日志搜集组件搜集后,后续就能经过ELK对日志进行搜索下载,进而康复数据。所以,蓝胖子在开始邮递之前,把人员名单记载了下来,把后续邮递进程中犯错的人员,无论是第三方接口调用犯错,仍是程序内部对数据库或许缓存的拜访犯错,把它们的过错原因和犯错时影响到的用户名单都记载了下来,而且将那些由于邮递过滤条件过滤掉的用户和过滤原因也记载了下来,最终,把邮递成功的用户记载下来。

能够看到,最终我只要经过日志,就能找出最终邮递成功的用户,以及邮递失败的用户,整个邮递进程就变透明了,如果有邮递失败的用户,我也能够经过日志进行康复。

那你可能会想,那我干脆将程序所有接口,每步操作都打上日志,不就好了吗,其实也是不对的。

1,会让代码变得很臃肿‍。

2, 打印的日志量也是很大,影响磁盘容量以及日志剖析组件搜集,由于多了很多无效日志。

所以,下面我给出几条打印日志的主张,

打日志最佳实践

第一条,在恳求第三方接口或许内部部分接口的时分,你应该要对接口参数以及返回成果进行打印。比较重要的场景乃至还需求对过错状况进行告警。这样最少在接口犯错时,在第三方部分需求你供给参数时能及时捞出日志。

第二条在程序对数据进行修改时,记载下改动日志,这也是为了让程序留下运转的痕迹,有助于咱们知道对数据做了哪些改动,以便后续犯错时,能经过日志对数据进行回滚修正。乃至为了让这个原则愈加简单落地,咱们能够修改数据库的客户端库,通常这类库会供给许多埋点钩子函数,咱们能够实现它们让其在进行delete,update,insert操作时,对sql进行记载,记载下对数据的改动。

第三条,程序呈现报错时记载日志,这条根本是原则,不过就像前面说到的那样,在记载时除了记载过错信息,还需求记载下过错的上下文,比方是哪个用户,触及到了哪些事务数据。

第四条,能够使用日志做一些要害事务信息的监控,特别是一些杂乱的事务逻辑,经过日志记载来让事务流程透明化。就像蓝胖子之前说到的对接邮件服务那样,让邮递进程透明化,也有利于对咱们程序的犯错康复。

最终,

自荐一波✅:

欢迎朋友们关注我的大众号:【蓝胖子的编程梦】!

学习容器知识,功能监控,Golang 相关编程知识