带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(4)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(4)

带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(3)https://developer.aliyun.com/article/1339987?groupCode=taobaotech


日志规约

 

  1. 应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架(SLF4J、JCL--Ja- karta Commons Logging)中的API。什么是日志框架和日志系统,请参考webx作者宝宝的文章,文章里也详细说明了为什么不能直接依赖使用日志系统而是日志框架,以及应用的pom中如何做dependencyManage- ment。说明:日志框架(SLF4J、JCL--Jakarta Commons Logging)的使用方式(推荐使用SLF4J):使用SLF4J:
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  private static final Logger logger = LoggerFactory.getLogger(Test.class);
  1. 在日志输出时,字符串变量之间的拼接使用占位符的方式。说明:因为String字符串的拼接会使用StringBuilder   的append()方式,有一定的性能损耗。使用占位符仅是替换动作,可以有效提升性能。正例:


3.

 logger.debug("Processing trade with id: {} and symbol: {}", id, symbol);

 

  1. 生产环境禁止直接使用System.outSystem.err 输出日志或使用e.printStackTrace()打印异常堆栈。说明: 标准日志输出与标准错误输出文件每次Jboss重启时才滚动,如果大量输出送往这两个文件,容易造成文件大小超过操作系统大小限制。
  2. 异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么往上抛。正例:logger.error ("inputParams:{} and errorMessage:{}", 各类参数或者对象toString(), e.getMessage(), e);
  3. 日志打印时禁止直接用JSON工具将对象转换成String。说明:如果对象里某些get方法被覆写,存在抛出异常的情况,则可能会因为打印日志而影响正常业务流程的执行。正例:打印日志时仅打印出业务相关属性值或者调用其对象的toString()方法。
  4. 谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志;如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?

 

日志规约

 

image.png建表规约

 

 

 

  1. 表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint(1表示是,0表示否),此规则同样适用于odps建表。说明:任何字段如果为非负数,必须是unsigned。注意:POJO类中的任何布尔类型的变量,都不要加is前缀,所以,需要在<resultMap>设置从is_xxx到xxx的映射关系。数据库表示是与否的值,使用tinyint类型,坚持is_xxx的命名方式是为了明确其取值含义与取值范围。正例:表达逻辑删除的字  段名is_deleted,1表示删除,0表示未删除。
  2. 表名、字段名必须使用小写字母或数字,字段命名可参考附2;禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。说明:MySQL在Windows下不区分大小写,但在Linux下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现 任何大写字母,避免节外生枝。正例:getter_admin,task_config,level3_name反例:GetterAdmin, taskConfig,level_3_name
  3. 表名不使用复数名词。说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于DO类名也是单数形式,符合表达习惯。
  4. 保留字,如desc、range、match、delayed等,参考官方保留字
  5. 唯一索引名为uk_字段名;普通索引名则为idx_字段名。说明:uk_unique key;idx_index的简称。
  6. 小数类型为decimal,禁止使用float和double。说明:在存储的时候,floatdouble 都存在精度损失的问题,很可能在比较值的时候,得到不正确的结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数并分开存储。
  7. 如果存储的字符串长度几乎相等,使用CHAR定长字符串类型。
  8. varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为TEXT,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
  9. 表必备三字段:id, gmt_create, gmt_modified。说明:其中id必为主键,类型为bigint unsigned、单表时自增、步长为1;分表时改为从TDDL  Sequence取值,确保分表之间的全局唯一。gmt_create,   gmt_modified 的类型均为date_time类型,前者现在时表示主动式创建,后者过去分词表示被动式更新。
  10. 表的命名最好是遵循“业务名称_表的作用”,避免上云梯后,再与其它业务表关联时有混淆。正例: tiger_task / tiger_reader / force_codereview
  11. 库名与应用名称尽量一致。
  12. 如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。

 

带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(5)https://developer.aliyun.com/article/1339985?groupCode=taobaotech

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
应用服务中间件 程序员 数据库
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(3)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(3)
111 0
|
JSON Java 测试技术
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(7)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(7)
115 0
|
IDE 前端开发 Java
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(6)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(6)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(6)
|
搜索推荐 JavaScript
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(1)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(1)
118 0
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(8)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(8)
|
存储 SQL 数据库
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(5)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(5)
|
存储 设计模式 中间件
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(2)
带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(2)
|
机器学习/深度学习 运维 监控
带你读《2022技术人的百宝黑皮书》——在阿里做前端程序员,我是这样规划的(3)
带你读《2022技术人的百宝黑皮书》——在阿里做前端程序员,我是这样规划的(3)
125 0
|
前端开发 程序员 TensorFlow
带你读《2022技术人的百宝黑皮书》——在阿里做前端程序员,我是这样规划的(6)
带你读《2022技术人的百宝黑皮书》——在阿里做前端程序员,我是这样规划的(6)
122 0
|
前端开发 算法 JavaScript
带你读《2022技术人的百宝黑皮书》——在阿里做前端程序员,我是这样规划的(1)
带你读《2022技术人的百宝黑皮书》——在阿里做前端程序员,我是这样规划的(1)
136 0