你应该打好你的日志,起码避免被甩锅

news2024/10/2 12:16:54

大家好,我是蓝胖子,相信大家或多或少都有这样的经历,当你负责的功能出现线上问题时,领导第一时间便是找到你询问原因,然而有时问题的根因或许不在你这儿,只是这个功能或许依赖了第三方或者内部其他部门,这个时候快速排查问题根因就是关键,给领导留个快速解决问题的印象,绩效也找不到理由给你打低了。

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

日志应该由什么组成

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

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

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

当然,业务的上下文信息需要根据业务情况决定,不同业务需要考虑下需要打印的业务信息。

打印的日志格式,我还是建议json,毕竟json 更容易被分析,特别是如果是当用上ELK这类的日志收集框架后,能很容易对日志提取字段进行分析。比如将日志中的应用服务名称字段提取出来,在ELK中做聚合分析,我们能分析出某段时间内,究竟是哪个应用在疯狂的打日志。

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

image.png

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

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

日志的作用

日志除了按上面提到的进行聚合统计分析系统日志量情况外,还可以按业务维度的字段进行聚合分析,比如将业务场景字段设置为登录,利用它统计每天,每小时登录的人数。利用日志做一些业务维度的监控

当然,日志除了去进行分析统计外,更是为了解决问题,对出错进行恢复,让系统留下运行的痕迹而打印的。打印日志前,一定要想清楚,我们需要解决的问题。

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

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

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

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

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

2, 打印的日志量也是很大,影响磁盘容量以及日志分析组件收集,因为多了很多无效日志。

所以,下面我给出几条打印日志的建议,

打日志最佳实践

☝🏻第一条,在请求第三方接口或者内部部门接口的时候,你应该要对接口参数以及返回结果进行打印。比较重要的场景甚至还需要对错误情况进行告警🚨。这样起码在接口出错时,在第三方部门需要你提供参数时能及时捞出日志。

第二条在程序对数据进行修改时,记录下改动日志,这也是为了让程序留下运行的痕迹,有助于我们知道对数据做了哪些改动,以便后续出错时,能通过日志对数据进行回滚修复。甚至为了让这个原则更加容易落地,我们可以修改数据库的客户端库,通常这类库会提供许多埋点钩子函数,我们可以实现它们让其在进行delete,update,insert操作时,对sql进行记录,记录下对数据的改动。

第三条,程序出现报错时记录日志,这条基本是准则,不过就像前面提到的那样,在记录时除了记录错误信息,还需要记录下错误的上下文,比如是哪个用户,涉及到了哪些业务数据。

第四条,可以利用日志做一些关键业务信息的监控,特别是一些复杂的业务逻辑,通过日志记录来让业务流程透明化。就像蓝胖子之前提到的对接邮件服务那样,让邮寄过程透明化,也有利于对我们程序的出错恢复。

最后,

自荐一波✅:

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

学习容器知识🐳,性能监控🚀,Golang🐋 相关编程知识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1505292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Github 2024-03-10php开源项目日报Top10

根据Github Trendings的统计,今日(2024-03-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次…

数据结构——算法的空间复杂度

【本节内容】 1.空间复杂度 2.常见空间复杂度 1.空间复杂度 空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用额外存储空间大小的量度。 空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算…

w7安装高版本nodejs

Win7系统可直接安装的最高nodejs版本为13.14,以为要换系统了,不过,网上找到了方法可以安装高版本 我是配置好环境变量后开始操作的(因为之前试了其他方法,没成功,环境变量就留下了) 新建变量NO…

NGINX源码安装详细配置文档

NGINX源码安装详细配置文档 一、基础Linux指令 查看nginx进程是否启动:ps -ef | grep nginx 关闭防火墙:systemctl stop firewalld 开放80端口:firewall-cmd --zonepublic --add-port80/tcp --permanent 关闭80端口:firewall-cmd …

静态路由--添加路由表,实现非直连网段的通信

建立拓扑: 路由器**只有直连网段的路由表,而对非直连并不拥有,因此要在路由器的路由表中手动添加非直连网段的路由. ** 也就是说对于AR2来说,**网段192.168.10.0**和**网段192.168.40.0**是他的直连网段。进一步说这两个网端的设备可以相互通信而网段19…

Python之Web开发中级教程----搭建Git环境三

Python之Web开发中级教程----搭建Git环境三 多人分布式使用仓库操作实例 场景:开发者A,开发者B在同一个项目协同开发,修改同一个代码文件。开发者A在Win10下,开发者B在Ubuntu下。 1、开发者A修改提交代码 从GitHub: Let’s bu…

ELF 1技术贴|在NXP源码基础上适配开发板的按键功能

本次源代码适配是在NXP i.MX6ULL EVK评估板的Linux内核源代码(特定版本号为Linux-imx_4.1.15)的基础中展开的。 首要任务集中在对功能接口引脚配置的精细调整,确保其能无缝匹配至ELF 1开发板。接下来,我们将详细阐述适配过程中关…

(南京观海微电子)——Gamma调试

1.什么是Gamma? Gamma的概念源自于CRT响应曲线,最开始是用于反映显像管的图像亮度与输入电子枪的信号电压之间,非线性关系的一个参数。对于CRT显示器而言,电子流大小影响显示的图像亮度大小,而电子流大小与输入电压间…

分割模型TransNetR的pytorch代码学习笔记

这个模型在U-net的基础上融合了Transformer模块和残差网络的原理。 论文地址:https://arxiv.org/pdf/2303.07428.pdf 具体的网络结构如下: 网络的原理还是比较简单的, 编码分支用的是预训练的resnet模块,解码分支则重新设计了。…

数据结构奇妙旅程之二叉平衡树

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

【C++庖丁解牛】实现string容器的增删查改 | string容器的基本接口使用

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 前言📖pu…

双链表()

双链表 实现一个双链表,双链表初始为空,支持 55 种操作: 在最左侧插入一个数;在最右侧插入一个数;将第 k 个插入的数删除;在第 k 个插入的数左侧插入一个数;在第 k 个插入的数右侧插入一个数 …

【LeetCode: 299. 猜数字游戏 - 模拟 + 计数】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

解决阿里云服务器开启frp服务端,内网服务器开启frp客户端却连接不上的问题

解决方法: 把阿里云自带的Alibabxxxxxxxlinux系统 换成centos 7系统!!!! 说一下我的过程和问题:由于我们内网的服务器在校外是不能连接的,因此我弄了个阿里云服务器做内网穿透,所谓…

nRF52832——GPIO端口的应用

nRF52832——GPIO端口的应用 nRF52832 GPIO 端口资源描述nRF52832 GPIO 寄存器介绍GPIO 端口状态的设置GPIO 输出设置 nRF52832 GPIO 输出应用点亮第一个 LED 灯硬件部分Keil 工程搭建 蜂鸣器驱动硬件设计程序编写测试验证 nRF52832 GPIO 输入应用GPIO 输入扫描流程机械按键输入…

基于GAN对抗网进行图像修复

一、简介 使用PyTorch实现的生成对抗网络(GAN)模型,包括编码器(Encoder)、解码器(Decoder)、生成器(ResnetGenerator)和判别器(Discriminator)。…

vue 自定义组件绑定model+弹出选择支持上下按键选择

参考地址v-modelhttps://v2.cn.vuejs.org/v2/guide/components-custom-events.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E7%9A%84-v-model 原文代码 Vue.component(base-checkbox, {model: {prop: checked,event: change},props: {checked: Boolean},template: `…

阅读最新的论文,研究趋势

我们需要时刻了解技术的发展趋势,阅读最新的论文研究。那么,怎么阅读论文最高效?最近我们使用了全新的阅读方法: 第一步,阅读最新分类好的列表 第二步,挑选感兴趣的论文,阅读其一页纸总结 第三步…

spring-cloud-openfeign 3.0.0之前版本(对应spring boot 2.4.x之前版本)feign配置加载顺序

在之前写的文章配置基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 下图为自己整理的

rk3399使用阿里推理引擎MNN使用cpu和gpu进行benchmark,OpenCL效果不佳?

视频讲解 rk3399使用阿里推理引擎MNN使用cpu和gpu进行benchmark,OpenCL效果不佳? 背景 MNN是阿里开源的推理引擎,今天测试一下在rk3399平台上的benchmark怎么样? alibaba/MNN: MNN is a blazing fast, lightweight deep learning…