笔记阿里巴巴日志&异常规范
Posted 韩旭051
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记阿里巴巴日志&异常规范相关的知识,希望对你有一定的参考价值。
【笔记】阿里巴巴日志&异常规范
阿里规范里写的很清楚了 本来想写两句 笔记 发现人家写的就很不错
我也就不 添油加醋了
总结一下
日志规范
- 用现成的框架 酸辣粉SLF4J
- 日志至少存15天 有按周出现的异常
- 命名规范. 错误日志 业务日志分开写
- 控制输出级别 用替换不用字符串拼接节省资源
- 配置 additivity=false 避免重复打日志浪费空间
- 异常带着 案发现场信息 和 异常堆栈信息一起抛
- 输出无效日志 方案定位 拖慢系统
- warn 记录用户输入错误 error 只记录系统逻辑出错 异常
异常规范
- 空指针异常自己先检查
- 异常不能做条件控制
- 大段代码不要try-catch
- 捕获异常要处理
- try 事务代码 catch 异常后 手动回滚
- finally 关闭 对象 (JDK7 以上 用 try-with-resources)
- finally 别return
- 捕获异常必须完全匹配或是抛出异常的父类 否则接不住会有意外
- 方法可以返回 null 考虑到远程调用失败 序列化失败 运行时异常
- 防止NPE
- 区分异常 不要抛 Exception 或者 Throwable 推荐自定义
- 对外 api 必须使用错误码 对内抛异常
- 避免出现重复代码 DRY 抽取共性方法 抽象公共类 进行组件化
前面说了不添油加醋 我还是又自己编了点。。。
阿里巴巴日志规范
(二) 日志规约
【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Abc.class);
【强制】日志文件推荐至少保存15天,因为有些异常具备以“周”为频次发生的特点。
【强制】应用中的扩展日志(如打点、临时监控、访问日志等)命名方式:appName_logType_logName.log。logType:日志类型,推荐分类有stats/monitor/visit等;logName:日志描述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。
正例:mppserver应用中单独监控时区转换异常,如:
mppserver_monitor_timeZoneConvert.log
说明:推荐对日志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。
【强制】对trace/debug/info级别的日志输出,必须使用条件输出形式或者使用占位符的方式。
说明:logger.debug("Processing trade with id: " + id + " and symbol: " + symbol); 如果日志级别是warn,上述日志不会打印,但是会执行字符串拼接操作,如果symbol是对象,会执行toString()方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。
正例:
(条件)
if (logger.isDebugEnabled()) {
logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
}
正例:
(占位符)
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
- 【强制】避免重复打印日志,浪费磁盘空间,务必在log4j.xml中设置additivity=false。
正例: 6. 【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws往上抛出。
正例:
logger.error(各类参数或者对象toString + “_” + e.getMessage(), e);
【推荐】谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志;如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。
说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?
【推荐】可以使用warn日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。如非必要,请不要在此场景打出error级别,避免频繁报警。
说明:注意日志输出的级别,error级别只记录系统逻辑出错、异常或者重要的错误信息。
阿里巴巴异常规范
异常是发生在程序执行过程中阻碍程序正常执行的错误事件,当一个程序出现错误时,可能的情况有如下3种:
- 语法错误 代码的格式错了,某个字母输错了
- 运行时错误 空指针异常,数组越界,除数为零等
- 逻辑错误 运行结果与预想的结果不一样,这是一种很难调试的错误
- Java中的异常处理机制主要处理运行时错误
在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。
- 抛出异常
当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异
常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。 - 捕获异常
在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler),进行处理。
(一)异常处理
-
【强制】
Java
类库中定义的可以通过预检查方式规避的RuntimeException
异常不应该通过catch
的方式来处理,比如:NullPointerException
,IndexOutOfBoundsException
等等。说明:无法通过预检查的异常除外,比如,在解析字符串形式的数字时,不得不通过
catch NumberFormatException
来实现。正例:
if (obj != null) {...}
反例:
try { obj.method(); } catch (NullPointerException e) {…}
-
【强制】异常不要用来做流程控制,条件控制。
说明:异常设计的初衷是解决程序运行中的各种意外情况,且异常的处理效率比条件判断方式 要低很多。
-
【强制】
catch
时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。 对于非稳定代码的catch
尽可能进行区分异常类型,再做对应的异常处理。说明:对大段代码进行
try-catch
,使程序无法根据不同的异常做出正确的应激反应,也不利 于定位问题,这是一种不负责任的表现。正例:用户注册的场景中,如果用户输入非法字符,或用户名称已存在,或用户输入密码过于 简单,在程序上作出分门别类的判断,并提示给用户。
-
【强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请 将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的 内容。
-
【强制】有
try
块放到了事务代码中,catch
异常后,如果需要回滚事务,一定要注意手动回滚事务。 -
【强制】
finally
块必须对资源对象、流对象进行关闭,有异常也要做try-catch
。 说明:如果JDK7
及以上,可以使用try-with-resources
方式。 -
【强制】不要在
finally
块中使用return
。
说明:
finally
块中的return
返回后方法结束执行,不会再执行try
块中的 return 语句。
-
【推荐】可以使用
warn
日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适 从。如非必要,请不要在此场景打出error
级别,避免频繁报警。说明:注意日志输出的级别,
error
级别只记录系统逻辑出错、异常或者重要的错误信息。 -
【推荐】尽量用英文来描述日志错误信息,如果日志中的错误信息用英文描述不清楚的话使用 中文描述即可,否则容易产生歧义。国际化团队或海外部署的服务器由于字符集问题,【强制】 使用全英文来注释和描述日志错误信息。
以上是关于笔记阿里巴巴日志&异常规范的主要内容,如果未能解决你的问题,请参考以下文章