门户网站建设管理情况自查报告,论坛网站开发外文文献,网站做app开发,佛山网站建设公司大家好#xff0c;我是蓝胖子,相信大家或多或少都有这样的经历#xff0c;当你负责的功能出现线上问题时#xff0c;领导第一时间便是找到你询问原因#xff0c;然而有时问题的根因或许不在你这儿#xff0c;只是这个功能或许依赖了第三方或者内部其他部门#xff0c;这个…大家好我是蓝胖子,相信大家或多或少都有这样的经历当你负责的功能出现线上问题时领导第一时间便是找到你询问原因然而有时问题的根因或许不在你这儿只是这个功能或许依赖了第三方或者内部其他部门这个时候快速排查问题根因就是关键给领导留个快速解决问题的印象绩效也找不到理由给你打低了。
而日志作为最简单最直接的排查问题手段就起到了至关重要的作用 关于如何打日志我谈谈我的一些感悟。
日志应该由什么组成
首先我们来思考下日志应该具有哪些维度的信息日志无非就是要记录什么时间什么地点发生了什么事情。
针对于应用程序来说就是哪台主机哪个应用服务哪种业务在某个时间点出现了什么问题。
这里要特别注意的是日志应该包含业务的上下文信息例如要记录某个用户做了支付行为你应该要记录用户的id订单号甚至可以更详细点把订单的价格购买的商品信息都记录下来以便后续排查问题时能直接通过日志找到用户的支付记录。
当然业务的上下文信息需要根据业务情况决定不同业务需要考虑下需要打印的业务信息。
打印的日志格式我还是建议json毕竟json 更容易被分析特别是如果是当用上ELK这类的日志收集框架后能很容易对日志提取字段进行分析。比如将日志中的应用服务名称字段提取出来在ELK中做聚合分析我们能分析出某段时间内究竟是哪个应用在疯狂的打日志。
甚至也可以从日志中提取业务场景字段对其进行聚合分析得出某段时间内那种业务在疯狂打印日志评估其日志打印是否合理如下图所示是在kibana上对过去15小时的日志按业务场景对日志量进行的分析。 我总结下日志的基本组成如下
{host主机名,log_time打印日志格式,app应用服务名称,action业务场景,msg描述信息, err如果有错误打印错误信息, 业务上下文信息....} 日志的作用
日志除了按上面提到的进行聚合统计分析系统日志量情况外还可以按业务维度的字段进行聚合分析比如将业务场景字段设置为登录利用它统计每天每小时登录的人数。利用日志做一些业务维度的监控。
当然日志除了去进行分析统计外更是为了解决问题对出错进行恢复让系统留下运行的痕迹而打印的。打印日志前一定要想清楚我们需要解决的问题。
举一个场景蓝胖子之前在服务中做过邮寄服务由于邮寄需要依靠第三方的接口并且整个邮寄的逻辑比较复杂会有许多邮寄过滤条件并且后续的产品功能持续有对这部分过滤逻辑进行修改如何在对第三方接口进行容错如何后续的迭代过程中对 过滤代码进行容错保证出错后能有办法恢复出错用户的邮寄就成了要思考的问题。
其实要解决这类问题最简单的办法就是将程序的运行轨迹能用日志表示出来有了日志日志被ELK此类日志收集组件收集后后续就能通过ELK对日志进行搜索下载进而恢复数据。所以蓝胖子在开始邮寄之前把人员名单记录了下来把后续邮寄过程中出错的人员,无论是第三方接口调用出错还是程序内部对数据库或者缓存的访问出错把它们的错误原因和出错时影响到的用户名单都记录了下来并且将那些由于邮寄过滤条件过滤掉的用户和过滤原因也记录了下来最后把邮寄成功的用户记录下来。
可以看到最终我只要通过日志就能找出最终邮寄成功的用户以及邮寄失败的用户整个邮寄过程就变透明了如果有邮寄失败的用户我也可以通过日志进行恢复。
那你可能会想那我干脆将程序所有接口每步操作都打上日志不就好了吗其实也是不对的。
1会让代码变得很臃肿。
2 打印的日志量也是很大影响磁盘容量以及日志分析组件收集因为多了很多无效日志。
所以下面我给出几条打印日志的建议
打日志最佳实践
☝第一条在请求第三方接口或者内部部门接口的时候你应该要对接口参数以及返回结果进行打印。比较重要的场景甚至还需要对错误情况进行告警。这样起码在接口出错时在第三方部门需要你提供参数时能及时捞出日志。
第二条 在程序对数据进行修改时记录下改动日志这也是为了让程序留下运行的痕迹有助于我们知道对数据做了哪些改动以便后续出错时能通过日志对数据进行回滚修复。甚至为了让这个原则更加容易落地我们可以修改数据库的客户端库通常这类库会提供许多埋点钩子函数我们可以实现它们让其在进行deleteupdateinsert操作时对sql进行记录记录下对数据的改动。
第三条程序出现报错时记录日志这条基本是准则不过就像前面提到的那样在记录时除了记录错误信息还需要记录下错误的上下文比如是哪个用户涉及到了哪些业务数据。
第四条可以利用日志做一些关键业务信息的监控特别是一些复杂的业务逻辑通过日志记录来让业务流程透明化。就像蓝胖子之前提到的对接邮件服务那样让邮寄过程透明化也有利于对我们程序的出错恢复。
最后 自荐一波✅ 欢迎朋友们关注我的公众号【蓝胖子的编程梦】! 学习容器知识性能监控Golang 相关编程知识