笔记阿里巴巴日志&异常规范

Posted 韩旭051

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记阿里巴巴日志&异常规范相关的知识,希望对你有一定的参考价值。

【笔记】阿里巴巴日志&异常规范


阿里规范里写的很清楚了 本来想写两句 笔记 发现人家写的就很不错
我也就不 添油加醋了

总结一下

日志规范

  1. 用现成的框架 酸辣粉SLF4J
  2. 日志至少存15天 有按周出现的异常
  3. 命名规范. 错误日志 业务日志分开写
  4. 控制输出级别 用替换不用字符串拼接节省资源
  5. 配置 additivity=false 避免重复打日志浪费空间
  6. 异常带着 案发现场信息 和 异常堆栈信息一起抛
  7. 输出无效日志 方案定位 拖慢系统
  8. warn 记录用户输入错误 error 只记录系统逻辑出错 异常

异常规范

  1. 空指针异常自己先检查
  2. 异常不能做条件控制
  3. 大段代码不要try-catch
  4. 捕获异常要处理
  5. try 事务代码 catch 异常后 手动回滚
  6. finally 关闭 对象 (JDK7 以上 用 try-with-resources)
  7. finally 别return
  8. 捕获异常必须完全匹配或是抛出异常的父类 否则接不住会有意外
  9. 方法可以返回 null 考虑到远程调用失败 序列化失败 运行时异常
  10. 防止NPE
  11. 区分异常 不要抛 Exception 或者 Throwable 推荐自定义
  12. 对外 api 必须使用错误码 对内抛异常
  13. 避免出现重复代码 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);

  1. 【强制】避免重复打印日志,浪费磁盘空间,务必在log4j.xml中设置additivity=false。
    正例: 6. 【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws往上抛出。
    正例:
    logger.error(各类参数或者对象toString + “_” + e.getMessage(), e);
    【推荐】谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志;如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。
    说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?
    【推荐】可以使用warn日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。如非必要,请不要在此场景打出error级别,避免频繁报警。
    说明:注意日志输出的级别,error级别只记录系统逻辑出错、异常或者重要的错误信息。
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

阿里巴巴异常规范

异常是发生在程序执行过程中阻碍程序正常执行的错误事件,当一个程序出现错误时,可能的情况有如下3种:

  1. 语法错误 代码的格式错了,某个字母输错了
  2. 运行时错误 空指针异常,数组越界,除数为零等
  3. 逻辑错误 运行结果与预想的结果不一样,这是一种很难调试的错误
  • Java中的异常处理机制主要处理运行时错误

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。

  • 抛出异常
    当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异
    常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
  • 捕获异常
    在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler),进行处理。

(一)异常处理

  1. 【强制】Java 类库中定义的可以通过预检查方式规避的 RuntimeException异常不应该通过 catch 的方式来处理,比如:NullPointerExceptionIndexOutOfBoundsException 等等。

    说明:无法通过预检查的异常除外,比如,在解析字符串形式的数字时,不得不通过 catch NumberFormatException 来实现。

    正例:if (obj != null) {...}

    反例:try { obj.method(); } catch (NullPointerException e) {…}

  2. 【强制】异常不要用来做流程控制,条件控制。

    说明:异常设计的初衷是解决程序运行中的各种意外情况,且异常的处理效率比条件判断方式 要低很多。

  3. 【强制】catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。 对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。

    说明:对大段代码进行try-catch,使程序无法根据不同的异常做出正确的应激反应,也不利 于定位问题,这是一种不负责任的表现。

    正例:用户注册的场景中,如果用户输入非法字符,或用户名称已存在,或用户输入密码过于 简单,在程序上作出分门别类的判断,并提示给用户。

  4. 【强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请 将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的 内容。

  5. 【强制】有 try 块放到了事务代码中,catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。

  6. 【强制】finally 块必须对资源对象、流对象进行关闭,有异常也要做 try-catch。 说明:如果 JDK7 及以上,可以使用 try-with-resources 方式。

  7. 【强制】不要在 finally 块中使用 return

说明:finally 块中的 return 返回后方法结束执行,不会再执行try块中的 return 语句。

  1. 【推荐】可以使用 warn 日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适 从。如非必要,请不要在此场景打出 error 级别,避免频繁报警。

    说明:注意日志输出的级别,error 级别只记录系统逻辑出错、异常或者重要的错误信息。

  2. 【推荐】尽量用英文来描述日志错误信息,如果日志中的错误信息用英文描述不清楚的话使用 中文描述即可,否则容易产生歧义。国际化团队或海外部署的服务器由于字符集问题,【强制】 使用全英文来注释和描述日志错误信息。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上是关于笔记阿里巴巴日志&异常规范的主要内容,如果未能解决你的问题,请参考以下文章

阿里开发手册规范(JAVA)

阿里巴巴Java开发手册正确学习姿势是怎样的?刷新代码规范认知

点评阿里JAVA手册之异常日志(异常处理 日志规约 )

阿里Java开发手冊之编程规约

日志打印规范

日志打印规范