前言
目前正在出一个阿里巴巴Java开发手册
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
在日常开发中,好的编码习惯和代码规范有助于提高代码可读性
,提升团队协作效率
,还利于维护与扩展
,在某些情况下还有利于优化性能
。今天就带着大家一起学习下手册中的内容,学习下Java
开发中的编码规范。
好了, 废话不多说直接开整吧~
日志规约
【强制】
应用中不可直接使用日志系统(Log4j、Logback
)中的API
,而应依赖使用日志框架(SLF4J、JCL--Jakarta Commons Logging
)中的API
,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 说明:日志框架(SLF4J、JCL--Jakarta Commons Logging
)的使用方式(推荐使用SLF4J
) 使用SLF4J
:
java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Test.class);
使用 JCL:
java
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
private static final Log log = LogFactory.getLog(Test.class);
-
【强制】
所有日志文件至少保存15
天,因为有些异常具备以"周"为频次发生的特点。对于当天日志,以应用名.log
来保存,保存在/home/admin/应用名/logs/
目录下,过往日志格式为:{logname}.log.{保存日期}
,日期格式:yyyy-MM-dd
说明:以mppserver
应用为例,日志保存在/home/admin/mppserver/logs/mppserver.log
,历史日志名称为mppserver.log.2016-08-01
-
【强制】
应用中的扩展日志(如打点、临时监控、访问日志等)命名方式:appName_logType_logName.log
。logType:日志类型
,如stats/monitor/access
等;logName:日志描
述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。 说明:推荐对日志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。
正例:
mppserver
应用中单独监控时区转换异常,如:mppserver_monitor_timeZoneConvert.log
【强制】
在日志输出时,字符串变量之间的拼接使用占位符的方式。 说明:因为String
字符串的拼接会使用StringBuilder
的append()
方式,有一定的性能损耗。使用占位符仅是替换动作,可以有效提升性能。 正例:
java
logger.debug("Processing trade with id: {} and symbol: {}", id, symbol);
【强制】
对于trace/debug/info
级别的日志输出,必须进行日志级别的开关判断。 说明:虽然在debug(参数)
的方法体内第一行代码isDisabled(Level.DEBUG_INT)
为真时(Slf4j
的常见实现Log4j
和Logback
),就直接return
,但是参数可能会进行字符串拼接运算。此外,如果debug(getName())
这种参数内有getName()
方法调用,无谓浪费方法调用的开销。
正例:
java
// 如果判断为真,那么可以输出 trace 和 debug 级别的日志
if (logger.isDebugEnabled()) {
logger.debug("Current ID is: {} and name is: {}", id, getName());
}
【强制】
避免重复打印日志,浪费磁盘空间,务必在log4j.xml
中设置additivity=false
。 正例:
xml
<logger name="com.taobao.dubbo.config" additivity="false">
【强制】
生产环境禁止直接使用System.out
或System.err
输出日志或使用e.printStackTrace()
打印异常堆栈。
说明:标准日志输出与标准错误输出文件每次 Jboss 重启时才滚动,如果大量输出送往这两个文件,容易造成文件大小超过操作系统大小限制
【强制】
异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws
往上抛出。
正例:
java
logger.error(各类参数或者对象 toString() + "_" + e.getMessage(), e);
【强制】
日志打印时禁止直接用JSON
工具将对象转换成String
。 说明:如果对象里某些 get 方法被重写,存在抛出异常的情况,则可能会因为打印日志而影响正常业务流程的执行。
正例:打印日志时仅打印出业务相关属性值或者调用其对象的 toString()
方法
10.【推荐】
谨慎地记录日志。生产环境禁止输出 debug
日志;有选择地输出 info
日志;如果使用warn
来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。
说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?
11.【推荐】
可以使用 warn
日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。如非必要,请不要在此场景打出 error
级别,避免频繁报警。 说明:注意日志输出的级别,error
级别只记录系统逻辑出错、异常或者重要的错误信息。
12.【推荐】
尽量用英文来描述日志错误信息,如果日志中的错误信息用英文描述不清楚的话使用中文描述即可,否则容易产生歧义。 说明:国际化团队或海外部署的服务器由于字符集问题,使用全英文来注释和描述日志错误信息。
结束语
本系列到此就结束了,给大家推荐一款idea插件Alibaba Java Coding Guidelines
,这个插件能够自动检查代码规范,大家可以去尝试一下~
本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注
鼓励一下呗~
阿里巴巴Java开发手册相关文章
- 一起来学阿里巴巴Java开发手册(一)
- 一起来学阿里巴巴Java开发手册(二)
- 一起来学阿里巴巴Java开发手册(三)
- 一起来学阿里巴巴Java开发手册(四)
- 一起来学阿里巴巴Java开发手册(五)
- 一起来学阿里巴巴Java开发手册(六)
- 一起来学阿里巴巴Java开发手册(七)
- 一起来学阿里巴巴Java开发手册(八)
MybatisPlus教程相关文章
往期Nginx教程相关文章
往期Docker教程相关文章
往前Shell脚本编程相关文章
- 一起来学Shell脚本编程(一)
- 一起来学Shell脚本编程(二)
- 一起来学Shell脚本编程(三)
- 一起来学Shell脚本编程(四)
- 一起来学Shell脚本编程(五)
- 一起来学Shell脚本编程(六)
- 一起来学Shell脚本编程(七)
往期Linux相关文章
- 一起来学Linux命令(一)
- 一起来学Linux命令(二)
- 一起来学Linux命令(三)
- 一起来学Linux命令(四)
- 一起来学Linux命令(五)
- 一起来学Linux命令(六)
- 一起来学Linux命令(七)
- 一起来学Linux命令(八)
- 一起来学Linux命令(九)
- 一起来学Linux命令(十)
往期面试题相关文章
- 查漏补缺第一期(Redis相关)
- 查漏补缺第二期(synchronized & 锁升级)
- 查漏补缺第三期(分布式事务相关)
- 查漏补缺第四期(Mysql相关)
- 查漏补缺第五期(HashMap & ConcurrentHashMap)
- 查漏补缺第六期(京东一面)
- 查漏补缺第七期(美团到店一面)
- 查漏补缺第八期(阿里一面)
- 查漏补缺第九期(阿里二面)
- 查漏补缺第十期(网易实习一面)
- 查漏补缺第十一期(网易实习二面)
- 查漏补缺第十二期(网易实习三面)
- 查漏补缺第十三期(滴滴实习一面)
- 查漏补缺第十四期(滴滴实习二面)
- 查漏补缺第十五期(华为一面)
- 查漏补缺第十六期(华为二面)
- 查漏补缺第十七期(华为三面)
- 查漏补缺第十八期(你了解class文件吗)
项目源码(源码已更新 欢迎star⭐️)
往期设计模式相关文章
- 一起来学设计模式之认识设计模式
- 一起来学设计模式之单例模式
- 一起来学设计模式之工厂模式
- 一起来学设计模式之建造者模式
- 一起来学设计模式之原型模式
- 一起来学设计模式之适配器模式
- 一起来学设计模式之桥接模式
- 一起来学设计模式之组合模式
- 一起来学设计模式之装饰器模式
- 一起来学设计模式之外观模式
- 一起来学设计模式之享元模式
- 一起来学设计模式之代理模式
- 一起来学设计模式之责任链模式
- 一起来学设计模式之命令模式
- 一起来学设计模式之解释器模式
- 一起来学设计模式之迭代器模式
- 一起来学设计模式之中介者模式
- 一起来学设计模式之备忘录模式
- 一起来学设计模式之观察者模式
- 一起来学设计模式之状态模式
- 一起来学设计模式之策略模式
- 一起来学设计模式之模板方法模式
- 一起来学设计模式之访问者模式
- 一起来学设计模式之依赖注入模式
设计模式项目源码(源码已更新 欢迎star⭐️)
Kafka 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看