【Java后台开发规范】--- 日志的输出
文章目录
- 前言
- 其他类型的规范
- 日志输出
- 过多日志
- 重复打印
- 批量打印
- 日志中带方法
- 讲故事
- 日志跟踪
- 其他基本要求
前言
做Java开发的,大多数可能都有看过阿里的Java后台开发手册,里面有关于Java后台开发规范的一些内容,基本覆盖了一些通用、普适的规范,但大多数都讲的比较简洁,本文主要会用更多的案例来对一些规范进行解释,以及结合自己的经验做补充!
其他类型的规范
【Java后台开发规范】— 不简单的命名
【Java后台开发规范】— 长函数、长参数
【Java后台开发规范】— 线程与并发
【Java后台开发规范】— 圈复杂度
【Java后台开发规范】— 设计原则
【Java后台开发规范】— Null值处理
【Java后台开发规范】— 异常的处理
日志输出
关于日志方面的规范其实并不多,也没那么重要,毕竟日志打印这个行为很简单,很单纯,阿里开发手册上有两条关于日志的强制性要求,一个是要求日志文件至少保留15天,一个是有关敏感信息、安全等相关记录的,根据国家法律要求至少保留六个月,日志要保留这么长时间,那自然对于日志的管理就很重要,所以很自然的就有对于日志的命名、分类、日期、拆分等就有了一系列的要求,对于这些我们就不过多说明了。
过多日志
有一些人,可能是为了问题排查方便,50行的代码里有一半都是在打印日志,好像已经养成了一种习惯,在任何方面调用前后都要用日志记录一下方法的入参、出参,我们知道打印日志是存在一定的性能消耗的,可能100ms的方法,有50ms都是因为打印日志造成的。其次增加了日志的存储成本。
打印了日志,又抛出了异常,会造成重复打印两次日志。
try{// ...
}catch(Exception e){log.error("xxxx",e);throw new MyException(e);
}
重复打印
add方法调用方和被调用方都打印了相同的内容
public void method() {log.info("方法method执行开始");int a = 1, b = 2;log.info("调用add方法,入参:{},{}", a, b);int c = add(a, b);log.info("add方法返回:{}", c);log.info("方法method执行结束");
}
private int add(int a, int b) {log.info("方法add执行开始,入参:{},{}", a, b);int c = a + b;log.info("add方法返回:{}", c);return c;
}
map打印的时候已经包含了str1 ,str2的内容
public static void methodA() {Map<String, String> map = new HashMap<>();String str1 = "1";String str2 = "2";map.put("a", str1);map.put("b", str2);log.info("str1:{},str2:{}", str1, str2);log.info("map:{}", map);
}
可以合一条打印的,没必要打印三次
public static void methodB() {String str1 = "1";String str2 = "2";String str3 = "3";log.info("str1:{}", str1);log.info("str2:{}", str2);log.info("str3:{}", str3);
}
批量打印
在循环体内打印日志
public static void methodC() {for (int i = 0; i < 100; i++) {log.info("循环内打印日志: " + i);}
}
打印大集合数据
public static void methodD() {int[] arr = new int[1000];Arrays.fill(arr, 1);log.info(Arrays.toString(arr));
}
日志中带方法
不要把map或者对象转成String,直接用toString方法输出即可,JSON转String本身就有一定的性能消耗。
public static void methodE() {Map<String, String> map = new HashMap<>();map.put("a", "1");map.put("b", "2");map.put("c", "3");log.info("没必要把map或者对象通过JSON转成String再打印: {}" , JSON.toJSONString(map));
}
注意不要因为日志输出而引起报错
public static void methodE() {User user = null;log.info("调用user中的任何方法都会出现空指针异常: {}", user.toString());log.info("直接打印user即可: {}", user);
}
讲故事
这个问题典型的表现就是把各种代码逻辑都以日志的形式呈现了出来。
private static void method1(String name) {User user = new User();log.info("把user对象的name设置成:{}", name);user.setName(name);log.info("当name等于小王时,执行methodA,否则执行methodB");if (Objects.equals("小王", name)) {methodA();} else {methodB();}
}
日志跟踪
为了方便日志跟踪,最少给日志配上时间戳、级别、线程名,或者其他能够有效识别的信息。
比如配置上traceId和spanId方便跟踪。
<pattern>%date %level [%X{traceId}/%X{spanId}] [%thread] %logger{10} [%file:%line] %msg%n</pattern>
线程名XNIO-2一看就知道是web服务undertow开启的。
其他基本要求
1、请按照正确的日志级别进行输出,debug、info、warn、error应该要区分清楚。
2、使用占位符的方式输出日志,占位符比使用String拼接要高效。
3、日志输出尽量使用英文,可以有效的减少日志存储大小,也更加符合国际化标准。
以下两条来自阿里规范中的说明
4、大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?
5、注意日志输出的级别,error 级别只记录系统逻辑出错、异常或者重要的错误信息。
6、不要直接使用日志系统的(log4j、logback)API,请使用日志框架SLF4J中的API。
【Java后台开发规范】--- 日志的输出相关推荐
- 【Java后台开发规范】--- 圈复杂度
文章目录 前言 其他类型的规范 圈复杂度 提炼方法 if.else 卫语句 去else 策略模式 switch 循环嵌套 其他建议 前言 做Java开发的,大多数可能都有看过阿里的Java后台开发手册 ...
- java+bizx文件_14.Teambiz后台开发规范
IBM GDC DL Teambiz后台开发规范 (2012年3月9日修订版) 撰写:何杨 2012年3月9日 1. 包的命名 包名应全由小写单词组成,如com.dalpha.common.gui,c ...
- (001) java后台开发之流程初识
java 后台开发流程 这篇文章为了奠基一下被我打入冷宫两个月左右的iOS开发,因为之前由于iOS项目停止的原因,被调至后台开发,两个月中也学习到了很多关于Java.sql.js.jsp的内容,感谢我 ...
- 面经:阿里Java后台开发
点击"蓝字"关注我们获得资讯/干货/内推 最近原来实习时候的Boss联系我,说他跳槽到了阿里,问我有没有兴趣面一个Java后台开发岗位. 考虑到我只工作了一年,现在去阿里肯定 ...
- 阿里Java后台开发是怎么面试的
最近原来实习时候的Boss联系我,说他跳槽到了阿里,问我有没有兴趣面一个Java后台开发岗位. 考虑到我只工作了一年,现在去阿里肯定要降薪,因此也没有太强烈的意愿.但出于提升自我的角度考虑,参加了面试 ...
- 用IDEA进行Java后台开发(一)
想尝试着进行java后台开发,发现能找到的完整工程教程很多都是用eclipse开发的,于是照着搭了一套开发环境,也简单的写了一个测试代码,由于好几年没有使用eclipse了,快捷键实在用的费劲,遂找到 ...
- 用IDEA进行Java后台开发(三)
在上一篇用IDEA进行Java后台开发(二)中我们已经可以成功的调用我们所写的接口,并且做了一些简单的逻辑处理, 由于后台开发离不开数据,所以这篇将进行Servlet于MySQL数据库链接和简单的调用 ...
- 用IDEA进行Java后台开发(二)
这篇博客接上一篇,用IDEA进行Java后台开发(一) 上一篇我们已经将工程创建完成了,下面我们将创建一个Servlet,然后本地启动tomcat后调用接口,返回helloWorld,过程如下: 1. ...
- 面试经验:阿里Java后台开发
最近原来实习时候的Boss联系我,说他跳槽到了阿里,问我有没有兴趣面一个Java后台开发岗位. 考虑到我只工作了一年,现在去阿里肯定要降薪,因此也没有太强烈的意愿.但出于提升自我的角度考虑,参加了面试 ...
- eclipse java代码某一行需要修改注释_看看这些Java代码开发规范吧!你好,我好,大家好!...
作为一名开发人员,当你接手他人的项目时,且当你阅读他人的代码时,是有没有遇到脑袋充血,感觉Java要把你"送走"的感觉呢?我们在用Java开发技术进行开发前,一定要牢牢恪守Java ...
最新文章
- android 短信验证码的实现
- 关于 #!/bin/bash脚本头文件的类型说明
- OpenStack云计算口袋书-第一章-开始OpenStack之旅(一)
- rust 案例_理解Rust的引用与借用
- linux下epoll如何实现高效处理
- 变压器相邻公交站 候车人提心吊胆[图]
- ios 中是否每一个对象(尤其是在使用多线程时),都要判断一下对象是否为nil,以防止程序闪退?...
- 3-2-ServletConfig
- Real Application Cluster 10g安装与配置(下)
- MATLAB 读取txt文件(importdata函数)
- C++线程中的几类锁
- 基于 koajs 的前后端分离实践
- 19-离线词典生成原理、图像描述子用BoW转化为BoW向量和FeatureVe
- 车辆控制-稳态误差分析-前馈
- 深信服超融合HCI初级笔试题目(三套)
- Python3 __dict__与dir()区别,对象中私有属性的访问
- 领导让谈入职公司的感受
- 达内微软mta证书有用吗_mta证书值得拿吗 怎么样才能拿到mta证书
- 三种最流行的商业模式解析:让顾客感觉占便宜,你才能赚更多钱
- 敏捷测试 之 借力DSL
热门文章
- vue全局引入字体并使用
- wincc控件包下载_WinCC中使用控件.pdf
- 两台redhat7虚拟机配置ssh免密访问
- 在UI设计中用什么样的字体?
- nas共享服务器怎么同步文件,如何轻松在两个NAS之间文件同步?
- 工业相机在全息成像中的应用
- axure后台示例_技巧分享:Axure后台组件制作的全过程
- 人工智能生物学深度解析,附源代码
- 刹车盘的噪音测试软件,某车型盘式制动器尖叫噪声分析及改进
- Cmake编译 OPENCV_DNN_CUDA 报错: CMake Error at modules/dnn/CMakeLists.txt:39 (message):