系统异常日志处理的思考
一、问题及解决思路
1.错误码问题
后端在编写代码,遇到异常处理时,常常纠结于错误码code的设置以及错误信息msg的处理。
尤其在多人协作时常常遗忘之前定义的错误码、错误信息,从而导致重复定义错误码。
因此错误码规则的合理设置,尤其重要。
参考《阿里巴巴编码规约泰山版》以下简称《阿里规约》
**强制 **错误码的制定原则:快速溯源、简单易记、沟通标准化。
说明: 错误码想得过于完美和复杂,就像康熙字典中的生僻字一样,用词似乎精准,但是字典不容易随身 携带并且简单易懂。
正例:错误码回答的问题是谁的错?错在哪?
1)错误码必须能够快速知晓错误来源,可快速判断是谁的问 题。
2)错误码易于记忆和比对(代码中容易 equals)。
3)错误码能够脱离文档和系统平台达到线下轻量 化地自由沟通的目的。
2.错误信息及前端提示问题
通常我们定义的错误信息不应直接返回至前端展示。例如:用户ID不存在或未传入正确token。此类信息应适合后端开发定位排查问题,而不应直接返回给用户。
而且,错误码通常与错误信息一一对应,例如,(40001,“资源不存在”)。
此时我们输出特定资源提示时,非常不灵活。例如,“用户不存在”,“商品不存在”,其本质都是"资源不存在"。
如果增加错误码,个人觉得显得冗余,而且极容易重复定义错误码。
但,若只记录"资源不存在",对于问题的定位、追溯将会有一定的困难。
在阅读《阿里规约》-异常日志章节时,看到“ **堆栈(stack_trace)、错误信息(error_message)、错误码(error_code)、提示信息(user_tip) 是一个有效关联并互相转义的和谐整体,但是请勿互相越俎代庖。 **”
因此感觉到仅用错误码 + 错误信息来处理异常,确实无法不够使用,无法自由定义给用户反馈的提示。
因此,将堆栈信息、错误信息、错误码、提示信息、区分开来,会更加清晰,明白。
二、服务异常处理实践
- 错误码定义规范
错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号。
说明:错误产生来源分为 A/B/C,
A 表示错误来源于用户,比如参数错误,用户安装版本过低,用户支付 超时等问题;
B 表示错误来源于当前系统,往往是业务逻辑出错,或程序健壮性差等问题;
C 表示错误来源 于第三方服务,比如 CDN 服务出错,消息投递超时等问题;
四位数字编号从 0001 到 9999,大类之间的 步长间距预留 100,错误码列表:参考见附件《阿里规约》。
示例:
错误码 | 中文描述 | 说明 |
---|---|---|
00000 | 一切OK | 正确执行的返回 |
A0001 | 用户端错误 | 一级宏观错误 |
A0100 | 用户注册错误 | 二级宏观错误码 |
A0101 | 用户未同意隐私协议 | |
B0001 | 系统执行出错 | 一级宏观错误码 |
B0100 | 系统执行超时 | 二级宏观错误码 |
B0101 | 系统订单处理超时 | |
C0001 | 调用第三方服务出错 | 一级宏观错误码 |
C0100 | 中间件服务出错 | 二级宏观错误码 |
public enum CodeEnum {RESOURCE_CODE("B0001","资源不存在");···getter......setter...
}
- Resultful响应定义
public class ResultResponse{private String code;private String msg;private Object data;...construct method......getter......setter...public static ResultResponse custom(String code,String tip,Object data){return new ResultResponse(code,tip,data);}
}
- 自定义异常
public class CustomException extends RuntimeException{//错误码private String code; //错误信息private String msg;//用户提示信息private String tip;public CustomException(String code,String msg,String tip){super(msg);this.code = code;this.msg = msg;this.tip = tip;}
}
- 异常统一处理
@RestControllerAdvice
public class CustomExceptionHandler {@ExceptionHandler(value = CustomException.class)public HttpResponse<String> handleCustomException(CustomException e) {//将tip 返回给前端return ResultResponse.custom(e.getCode(), e.getTip(),null);}
}
- 异常示例
public void checkParam(String id){User user = userService.getById(id);if(null == user){//tip可与msg相同,也可依据实际需求修改throw new CustomException(RESOURCE_CODE.getCode(),RESOURCE_CODE.getMsg(),"未查询到该用户");}
}
- 用户响应示例
{"code":"B0001","msg":"未查询到该用户","data":null
}
附件:阿里巴巴编码规约泰山版下载
泰山版.pdf
系统异常日志处理的思考相关推荐
- 带你了解zabbix整合ELK收集系统异常日志触发告警~
今天来了解一下关于ELK的"L"-Logstash,没错,就是这个神奇小组件,我们都知道,它是ELK不可缺少的组件,完成了输入(input),过滤(fileter),output( ...
- 关于系统异常设计的再思考
2019独角兽企业重金招聘Python工程师标准>>> 1.是否需要已检测异常 <Clean Code>一书对已检测异常是持完全否定态度的.事实上,有很多人是不认可已检测 ...
- linux 关机 日志,centos7 异常关机了,怎么查看系统的异常日志?
centos7 异常关机了,怎么查看系统的异常日志? crash中也没有dump的文件. 这是messages日志: Feb 26 11:14:03 moon systemd-logind: Remo ...
- linux 内核日志等级,Linux系统中日志级别详情
日志信息分类 1.等级由低到高:debug 2.区别: debug 级别最低,可以随意的使用于任何觉得有利于在调试时更详细的了解系统运行状态的东东: info 重要,输出信息:用来反馈系统的当前状态 ...
- 无异常日志,就不能排查问题了???
众所周知,日志是排查问题的重要手段.关于日志设计,以及怎么根据从[用户报障]环节开始到秒级定位问题这个我们下一期说(绝非套路),这一期,主要讲一下,在没有异常日志的情况下,如何定位问题.没有日志当真能 ...
- asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程...
最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...
- 系统操作日志设计(二)
上一篇<系统操作日志设计>,已基本介绍了为什么要系统操作日志和设计系统操作日志部分内容,如不清楚系统操作日志的请点这里. :) 通了解<系统操作日志设计>,已基本明确我们不能通 ...
- logger异常日志要点总结
Logger异常日志,企业项目中非常重要的一步,在系统调试.出错时,能够快速排查,修复.以下是关于异常日志使用的关键点. 1.真正有意义的Logger 一些用户异常信息,是返回到View层显示给用户看 ...
- 获得系统异常的详细信息
在.net中有一个非常重要的namespace System.Diagnostics,在这个namespace中我们可以与系统进程.事件日志和性能计数器进行交互(MSDN). 在他的下 ...
- linux系统各种日志存储路径和详细介绍
Linux常见的日志文件详述如下 1./var/log/boot.log(自检过程) 2./var/log/cron (crontab守护进程crond所派生的子进程的动作) 3./var/log/m ...
最新文章
- intel最新的服务器芯片,Intel最新服务器CPU 芯片组Roadmap
- 分割 bisenetv2笔记
- 人工智能、物联网和大数据如何拯救蜜蜂
- kafka架构、亿级数据如何优化GC
- SAP云平台webIDE UI5应用的Application Status菜单实现细节
- 3_V1-类和对象 -- 默认成员函数
- Linux信号signal的介绍和示例
- TDD、BDD、ATDD、DDD 软件开发模式
- ActiveMQ(14):Destination(目的地)高级特性
- 大屏样式(全屏禁止滚动)
- Android小项目合集(经典教程)包含十五个Android开发应用实例
- 「 硬核分享」 ❤️ QQ连连看自动消除外挂完整源码❤️「 复制即用」
- 使用itext到处PDF,使用PDF模板导出PDF文件
- 计算机磁盘管理没有打开方式,Win10系统双击磁盘和文件夹打不开提示没有与之关联的程序怎么办...
- 手机抢红包助手深陷作弊指责 部分外挂植入木马
- 穆迪分析专家贡献IFRS 9和CECL新书
- MPC模型预测控制及在Matlab中实现函数定义
- 安卓打开cbr文件_什么是CBR和CBZ文件,为什么将它们用于漫画?
- 魔戒 4维bfs搜索
- Q learning--强化学习系列文章3