web项目开发写接口时,为什么需要在关键位置打印日志-2022新项目
一、业务场景
最近在开发新功能,新功能主要就是写app的首页查询接口,接口比较多有十几个,首页会有各种查询,新增操作比较少。由于用户量
比较大,据说并发量不小,所以首页的很多查询都做了缓存处理,用来提升查询效率。这次写的接口还是比较复杂,需要进行数据的各种处理,
比如排序,过滤,各种其他业务的处理。并且调用的时候,不是自己项目调用,而是提供给其他项目组调用,需要进行联合调试。
二、需求分析
项目的大致调用情况如下:

自己所在的项目组属于项目B这个位置,数据首先从项目A过来,然后在项目B这里存储、加工处理后,在给项目C提供调用,最后返回
给APP.这其中还是省略了各种网关拦截之类的操作。总之APP想拿到项目B的数据,经过的流程会比较多,如果任意一个环节出现问题,都有
可能导致手机APP获取不到数据。因此在写调用接口的时候,打印日志就很有必要了,主要作用就是用于排查问题。如果出现问题之后,排查
问题最简单、快捷的方式就是通过日志来定位问题。由于项目的限制,生产环境的数据库是看不了的,只能通过日志来进行排查问题。
三、解决方案
那写接口的时候,需要打印哪些日志呢?
.a.第一个地方就是请求参数的日志,请求一个接口时,参数信息有哪些,这个是在排查问题的时候,首先要看的关键信息。可以查看请求的参数
对不对,是不是符合接口的要求等等。
.b.第二个需要打印日志信息的地方就是获取的数据信息,比如某一个接口请求时,返回的数据信息。如果信息信息比较多,则只需要打印返回的
数据量信息即可,比如返回多少条,或者打印其中一条数据信息。数据处理的时候,一般都是统一处理,如果某一条数据没问题,那其他数据也
不会有问题。在比如新增数据的时候,将新增数据返回的ID打印在日志中,非常方便排查问题。
.c.第三个需要打印的就是关键位置的操作,比如从缓存中获取数据时的key信息,需要打印到日志中;获取的一些关键的缓存数据也需要打印在
日志中,可以排查缓存中的数据是否正确。自己在进行数据过滤之前会打印一下数据总数,数据返回前会打印一下数据的总数,看看是否正常。
在进行过滤操作的时候,如果有明显异常的操作,也会打印错误日志。
.d.异常信息需要打印在日志中,将异常信息打印在日志中,非常有助于排查具体问题,到底是哪些原因引起的异常等等。
.e.一些比较耗时的操作或者是非常重要的操作,添加一个操作时间统计,便于排查、分析某个操作所花的时间是多久,是否影响程序的正常执行等等。
上面就是自己在开发中打印日志的一些操作,有更好建议的小伙伴欢迎留言讨论。
2022-10-23.
记录最近几次真实问题排查的情形。
情形一:测试人员在测试系统性能的时候,发现有两个接口的性能不达标,让我们开发人员去排查是什么原因导致的。自己拿到接口信息之后,立即去
排查问题,因为这两个接口都是自己写的,对于接口里面的逻辑还是比较清楚的。问题是出在将我们的系统迁移到一个新的服务器上去之后,查询才变
得非常缓慢,有几次请求差不多大概20S的时间,虽然有些夸张,但这也是事实。
首先能够想到的就是查看日志,可是自己没权限查询新服务器的日志,只能等待负责人去进行查看日志信息。不久之后,负责人发了几张日志的截图
丢在群里面,从打印的日志信息来看,自己写的代码打印的日志还不足以排查当前遇到的问题。这就很尴尬,没办法只能继续添加打印的日志,然后重新
部署后去查看日志信息。在这个接口中,调用了多个方法来处理数据,比如A->B->C->D等等,首先获取数据,可能是从缓存中取的,也可能是查询数据库的。
其次是数据过滤,再次是数据处理,最后一步是数据转换。由于自己只打印了少量日志,不能准确的判断出问题是出在哪里。改进后,在这四个方法后面
都添加了关键位置的日志打印信息,就可以知道每一个方法执行时所花的时间大概是多少。重新部署后,再次测试,果然发现问题,问题就出在数据过滤
的时候,执行时间太久导致出现问题。找准问题后,自己也知道怎么去优化代码,从哪里下手,花了约一个小时之后,问题解决。
自己从这次吸取到的经验教训就是,关键位置一定需要打印日志,这非常有助于排查各种BUG,不然之后这些地方的日志也需要重新补上,这样才能
较为准确的去定位错误信息,才能更好的判断是什么原因导致的问题。问题找到后,修复问题相对来说就会轻松一些。
web项目开发写接口时,为什么需要在关键位置打印日志-2022新项目的更多相关文章
- 学web前端开发写给新手的建议,超实用!
01 前面的话 如今我们使用的互联网,客户端与服务器端的交互无时无刻不在发生.比如我们在浏览器打开网页,浏览器就是客户端,将网页数据发过来的也就是服务器.其实服务器,并没有什么特别的,也就是一台昼夜不 ...
- 项目开发中Maven的单向依赖-2022新项目
一.业务场景 工作多年,在真实的项目开发中经常会遇到将一个项目拆分成多个工程的情况,比如将一个真实的项目拆分成controller层,service层, dao层,common公共服务层等等.这样拆分 ...
- Java异步记录日志-2022新项目
一.业务场景 web项目开发中,经常会有的一个操作是记录请求日志,比如记录请求的IP地址,记录请求的路径,记录请求的参数等等. 每个系统都会根据自己的需要来记录一些请求相关的日志.一般会将记录的日志信 ...
- redis缓存恢复-2022新项目
一.业务场景 Web项目开发中,为了加快数据处理的的效率,大量的使用了各种缓存,缓存技术主要使用的是redis.导致出现的小小的 问题是对redis缓存形成了一个比较强的依赖,并且有的数据暂时是没有同 ...
- mybatis-拦截器实际应用-替换表名-2022新项目
一.业务场景 考虑到新项目中部分与业务数据相关的表在后期数据量会比较大,架构师在最开始设计项目中与业务数据相关的表时,就已经考虑使用分表来 进行处理,给业务数据相关的每张表都添加统一批次的后缀,查询这 ...
- Light项目---实现后端接口时遇见的一些问题
ImproperlyConfigured: WSGI application 'lightapi.wsgi.application' could not be loaded; 在moddleware中 ...
- 在php中写接口时 对json格式的转换 简单的方法
方法 一 方法二 可以通过urlencode();遍历出来
- .NET项目开发—浅谈面向接口编程、可测试性、单元测试、迭代重构(项目小结)
阅读目录: 1.开篇介绍 2.迭代测试.重构(强制性面向接口编程,要求代码具有可测试性) 2.1.面向接口编程的两个设计误区 2.1.1.接口的依赖倒置 2.1.2.接口对实体的抽象 2.2.迭代单元 ...
- git实战-多分支开发-2022新项目
现在开发中大多数公司中都在使用Git这个代码版本管理工具,几乎可以说是已经成为标配,刚入职不久的这家新公司也不例外. 去公司没多久,开始搭建项目,然后创建开发分支,有多少个后端人员就创建多少个开发分支 ...
- postgresql使用group by进行数据去重-2022新项目
一.业务场景 数据去重是web开发中经常会遇到的方式之一,数据库操作中有一个关键字distinct主要就是用来做这件事,用来进行去重. 比如进行统计查询的时候,可以这样写 select count(d ...
随机推荐
- STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡
1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 ...
- LeetCode刷题日记 2020/03/25
力扣刷题继续! 题目:计算三维形体表面积 题干 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i ...
- SpringCloud-03-Nacos配置管理
Nacos配置管理 原理图: 1.统一配置管理 ① 在Nacos中添加配置信息 ② 在弹出表单中填写配置信息 ③ 配置获取的步骤*(原理) ④ 引入Nacos的配置管理客户端依赖 <!--nac ...
- 图解Java原理
1:强制类型转换数据溢出 2:顺序结构的流程图 3:单if语句的流程图 4:标准if-else语句的流程图 5:扩展if-else语句的流程图 6:for循环流程图
- MarkDown文件插入图片(绝对\相对路径\调整图像大小位置)
1. 插入网络图片(有效网络连接) Markdown中插入图片的语法为,图片路径可以直接写入图片有效链接网址即可: 方法1: 方法2:<img src=&quo ...
- 2.列表--《Python编程:从入门到实践》
2.1 列表 列表由一系列按特定顺序排列的元素组成.在Python中,用方括号([])来表示列表,并用逗号来分隔其中的元素. bicycles = ['trek', 'cannondale', ' ...
- NOI 2021 补全记录
来补题了昂. D1T1 轻重边 对于原树进行重链剖分,使用一颗线段树维护每一条重边是否时"重边",然后对于轻边,在父亲出维护最后一次通过 \(1\) 操作清空"重边&qu ...
- SQLite 入门教程
不是 MySQL 用不起,而是 SQLite 更有性价比,绝大多数的 Web 应用 SQLite 都可以满足. SQLite 是一个用 C 语言编写的开源.轻量级.快速.独立且高可靠性的 SQL 数据 ...
- win32-UpdateLayeredWindow
创建半透明的窗口,以及在窗口上绘制不透明的文本 方法: 创建Bitmap具有PixelFormat32bppPARGB像素格式的GDI + 对象. 创建一个Graphics对象以绘制该Bitmap对象 ...
- [BUUCTF][Web][极客大挑战 2019]Secret File 1
打开靶机对应的url 右键查看网页源代码,查看到一个访问路径 /Archive_room.php 构造url访问一下 http://3bfaebad-fdfa-4226-ae0a-551f0228be ...