只有光头才能变强。html
文本已收录至个人GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3yjava
记得以前写过一篇:《阿里巴巴 Java开发手册》读后感,以前自学时因为没怎么接触过打“日志”,因此《手册》中的“日志规约”我就先放一边去了。git
而以前写了一篇:在公司作的项目和本身在学校作的有什么区别?中就有提到:公司的项目不会有e.printStackTrace();
这种代码的存在。由于这打印出来的错误信息没有日期、等级等等,分析起来不方便。github
在工做中去服务器上查日志又是一个很是很是常见的操做,因此当初我又写了一篇 工做中经常使用到的Linux命令,里边就谈到了查日志时经常使用的Linux命令。数据库
想着,既然接触日志也有一段时间了,不妨在回看《手册》,看看有什么要注意的地方,因而就有了这篇笔记。服务器
之前本身自学的时候,排查问题只会写下面的代码:框架
try { // doSomething } catch (Exception e) { e.printStackTrace(); } ---------- // 查看某个数据的值时: System.out.println(xxxx);
去到公司就发现上面的代码全不见了,剩下的是:异步
LOGGER.info("begin to run Java3y:{}", id); ---- LOGGER.error("excepiton occurs when run Java3y {}, exception{}", id, e.toString());
若是使用e.printStackTrace();
的话,打印在控制的信息分析不方便:性能
而咱们将信息分等级和时间记录在服务器的磁盘上,有问题了就能够根据对应的信息去查找相关的日志(这样排查起来是十分方便的):debug
咱们再来看一下通常的日志长什么样的:
例如:如今有人来反馈某某某用户好像收不到短信,给出发送时间和用户ID,咱们就能够在日志上找出该用户在咱们系统的发送状态(例如图上的:state:81,咱们就认为是发送成功状态)
那么,问题来了,咱们在哪打日志?《手册》上其实已经给出了答案:
谨慎地记录日志。生产环境禁止输出 debug 日志;有选择地输出 info 日志;若是使
用 warn 来记录刚上线时的业务行为信息,必定要注意日志输出量的问题,避免把服务器磁盘
撑爆,并记得及时删除这些观察日志。
大量地输出无效日志,不利于系统性能提高,也不利于快速定位错误点。记录日志时请思考:这些
日志真的有人看吗?看到这条日志你能作什么?能不能给问题排查带来好处?
打日志最多见的就是用来打印出程序执行时的相关信息,用于快速定位问题和排查问题。我一开始也是这么理解的,可是其实还能够延伸一下。
我如今搞的那个系统,咱们还使用日志在系统的执行链路上打点。好比说,我如今要推送一条通知消息,通知消息其实就是下面这种:
这个过程大概是如此的:
而咱们又但愿在推送完了以后能统计出一些指标(曝光量,点击率,转化率)等等。因而乎,就须要在一些关键的位置上打一个日志(专业点叫作打点)
在整块链路都打通了之后,将这些点位(日志)收集起来,放到实时流式处理平台(storm/flink)上清洗/过滤。若是是实时须要用到的放到Redis,离线的放在Hive。
【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架
SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
门面模式我以前也写过一篇笔记:三分钟学会门面模式!
其实说白了就是但愿抽象出一层API,可以在切换具体日志框架的时候不须要大面积更改。
这个咱们能够按学JDBC的时候去理解:
不管我是接入MySQL、Oracle仍是SQL Server,但个人接口永远都是那一套,切换数据库时不须要更改个人Java API
看了一下公司的项目,采用的是SLF4J+Logback
【强制】在调用 RPC、二方包、或动态生成类的相关方法时,捕捉异常必须使用 Throwable
类来进行拦截。
以前在排查问题的时候,有个问题死活排不出来,DeBug的时候一直没进catch模块。后来我学长就说:“要不你改为Throwable试试?
try { } catch (Throwable e) { }
我就很疑问,说:“为啥要改为Throwable呢?咱们用Exception不就能够捕获全部的异常了么,Exception是Throwable的一个子类,但Exception已是包含全部的Java异常了呀”
众所周知,Throwable有两个子类:
The Throwable class is the superclass of all errors and exceptions in the Java language
在《手册》上也有对上面的规则进行说明:
说明:经过反射机制来调用方法,若是找不到方法,抛出 NoSuchMethodException。什么状况会抛出
NoSuchMethodError 呢?二方包在类冲突时,仲裁机制可能致使引入非预期的版本使类的方法签名不匹
配,或者在字节码修改框架(好比:ASM)动态建立或修改类时,修改了相应的方法签名。这些状况,即
使代码编译期是正确的,但在代码运行期时,会抛出 NoSuchMethodError。
大概的意思就是说:调用 RPC、二方包、或动态生成类的相关方法时,可能直接抛出的是Error,而catch Exception是没法捕得到到的。
想看例子的同窗能够看看这篇文章:
参考资料(阿里巴巴开发手册下载地址):
查阅资料时发现的好文:
乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,关注便可获取!
以为个人文章写得不错,点赞!