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

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

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

日志应该由什么组成

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

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

这里要特别注意的是🔊🔊🔊,日志应该包含业务的上下文信息,例如,要记录某个用户做了支付行为,你应该要记录用户的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.mzph.cn/news/733513.shtml

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

相关文章

【Unity InputSystem】实用指南:在PC端(鼠标与键盘)、手机端(触摸屏)、主机手柄上同步实现角色移动与跳跃功能

前引 随着Unity的不断发展,开发者对于项目的输入系统要求也日益提高。在进行多平台适配和跨平台移植时,常常需要改变输入系统,这给开发者带来了不少困扰。而Unity官方推出的InputSystem插件,则是为了解决这一问题而推出的全新输入…

Linux内存管理--系列文章壹

一、引子 作者、我在上班闲着没事的时候,看了一些关于Linux内存管理和程序装载、链接的文章,然后自己就总结出了一些东西。 本系列文章一方面将资料中的长篇大论总结到最少、以方便可以直接找到答案,一方面也是方便面试的时候可以吹牛逼。 L…

【Docker】golang使用DockerFile正确食用指南

【Docker】golang使用DockerFile正确食用指南 大家好 我是寸铁👊 总结了一篇golang使用DockerFile正确食用指南✨ 喜欢的小伙伴可以点点关注 💝 问题背景 今天寸铁想让编写好的go程序在docker上面跑,要想实现这样的效果,就需要用…

小程序 van-field label和输入框改成上下布局

在组件上面加个样式就行&#xff1a;custom-style"display:block;" <van-field label"备注说明" type"textarea" clearable title-width"100px" custom-style"display:block;" placeholder"请输入" /> …

大载重无人机基础技术,研发一款50KG负重六旋翼无人机技术及成本分析

六旋翼无人机是一种多旋翼无人机&#xff0c;具有六个旋翼&#xff0c;通常呈“X”形布局。它采用电动串列式结构&#xff0c;具有垂直起降、悬停、前飞、后飞、侧飞、俯仰、翻滚等多种飞行动作的能力。六旋翼无人机通常被用于航拍、农业植保、环境监测、地形测绘等领域。 六旋…

Day34-Linux网络管理4

Day34-Linux网络管理4 1. IP地址分类与子网划分基础1.1 什么是IP地址1.2 十进制与二进制的转换1.3 IP地址的分类1.4 私网地址和局域网地址 2. 通信类型3. 子网划分讲解3.1 为什么要划分子网&#xff1f;3.2 什么是子网划分&#xff1f;3.3 子网划分的作用&#xff1f;3.4 子网划…

云计算项目十一:构建完整的日志分析平台

检查k8s集群环境&#xff0c;master主机操作&#xff0c;确定是ready 启动harbor [rootharbor ~]# cd /usr/local/harbor [rootharbor harbor]# /usr/local/bin/docker-compose up -d 检查head插件是否启动&#xff0c;如果没有&#xff0c;需要启动 [rootes-0001 ~]# system…

如何使用Hexo搭建个人博客

文章目录 如何使用Hexo搭建个人博客环境搭建连接 Github创建 Github Pages 仓库本地安装 Hexo 博客程序安装 HexoHexo 初始化和本地预览 部署 Hexo 到 GitHub Pages开始使用发布文章网站设置更换主题常用命令 插件安装解决成功上传github但是web不更新不想上传文章处理方式链接…

Yolov8模型用torch_pruning剪枝

目录 &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; 原理 遍历所有分组 高级剪枝器 &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680…

JVM基本概念、命令、参数、GC日志总结

原文: 赵侠客 一、前言 NPE&#xff08;NullPointerException&#xff09;和OOM&#xff08;OutofMemoryError&#xff09;在JAVA程序员中扮演着重要的角色&#xff0c;它也是很多人始终摆脱不掉的梦魇&#xff0c;与NPE不同的是OOM一旦在生产环境中出现就意味着只靠代码已经无…

java集合题库详解

1. Arraylist与LinkedList区别 可以从它们的底层数据结构、效率、开销进行阐述哈 ArrayList是数组的数据结构&#xff0c;LinkedList是链表的数据结构。 随机访问的时候&#xff0c;ArrayList的效率比较高&#xff0c;因为LinkedList要移动指针&#xff0c;而ArrayList是基于索…

Java 客户端向服务端上传文件(TCP通信)

一、实验内容 编写一个客户端向服务端上传文件的程序&#xff0c;要求使用TCP通信的的知识&#xff0c;完成将本地机器输入的路径下的文件上传到D盘中名称为upload的文件夹中。并把客户端的IP地址加上count标识作为上传后文件的文件名&#xff0c;即IP&#xff08;count&#…

OpenSearch 与 Elasticsearch:哪个开源搜索引擎适合您?

当谈论到搜索引擎产品时&#xff0c;Elasticsearch 和 OpenSearch 是两个备受关注的选择。它们都以其出色的功能和灵活性而闻名&#xff0c;但在一些方面存在一些差异。在本文中&#xff0c;我们将从功能和延展性、工具与资源、价格和许可这三个角度对这两个产品进行论述。通过…

qt+opencv人脸人眼检测识别

项目运行涉及到opencv库&#xff0c;以及haarcascade_frontalface_default.xml和haarcascade_eye_tree_eyeglasses.xml。qt配置opencv可见先前文章&#xff0c;另外这两份OpenCV 中用于眼睛检测的级联分类器xml文件&#xff0c;是我在网上下载的。 把要使用到的文件都放到当前…

鸿蒙培训开发:就业市场的新热点~

金三银四在即&#xff0c;随着春节假期结束&#xff0c;各行各业纷纷复工复产&#xff0c;2024年的春季招聘市场也迎来了火爆的局面。最近发布的《2024年春招市场行情周报&#xff08;第一期&#xff09;》显示&#xff0c;尽管整体就业市场仍处于人才饱和状态&#xff0c;但华…

spring-cloud-openfeign 3.0.0(对应spring boot 2.4.x之前版本)之前版本feign整合ribbon请求流程

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

Excel 快速填充/输入内容

目录 一. Ctrl D/R 向下/右填充二. 批量输入内容 一. Ctrl D/R 向下/右填充 ⏹如下图所示&#xff0c;通过快捷键向下和向右填充数据 &#x1f914;当选中第一个单元格之后&#xff0c;可以按住Shift后&#xff0c;再选中最后一个单元格&#xff0c;可以选中第一个单元格和最…

自动驾驶技术解析与关键步骤

目录 前言1 自动驾驶主要技术流程1.1 车辆周围环境感知1.2 车辆和行人检测分析1.3 运动轨迹规划 2 关键技术概述2.1 车辆探测与图片输入2.2 行人检测2.3 运动规划2.4 电子地图2.5 轨迹预测2.6 交通灯分析2.7 故障检测 结语 前言 自动驾驶汽车作为未来交通领域的重要发展方向&a…

【Python】-入门:安装配置和IDLE的使用

Python的安装和配置 一、下载Python安装包 首先&#xff0c;你需要从Python的官方网站&#xff08;https://www.python.org/downloads/&#xff09;下载适合你操作系统的Python安装包。请注意&#xff0c;Python 2.x版本即将停止维护&#xff0c;因此推荐下载Python 3.x版本。…

【LGR-176-Div.2】[yLCPC2024] 洛谷 3 月月赛 I(A~C and G<oeis>)

[yLCPC2024] A. dx 分计算 前缀和提前处理一下区间和&#xff0c;做到O&#xff08;1&#xff09;访问就可以过。 #include <bits/stdc.h> //#define int long long #define per(i,j,k) for(int (i)(j);(i)<(k);(i)) #define rep(i,j,k) for(int (i)(j);(i)>(k);…