日志相关的规范
1 痛点
2 为什么写日志
2-1 监控
反应系统的运行状态
2-2 问题排查
了解运行过程,异常位置等
3 系统日志的级别
- error:错误日志,指比较严重的错误,对正常业务有影响,需要运维配置监控的;
- warn:警告日志,一般的错误,对业务影响不大,但是需要开发关注;
- info:信息日志,记录排查问题的关键信息,如调用时间、出参入参等等;
- debug:用于开发DEBUG的,关键逻辑里面的运行时数据;
- trace:最详细的信息,一般这些信息只记录到日志文件中。
4 日志占位符
异常信息,不要用占位符
占位符填充的时候其实取的就是toString方法,
log.warn("some err happen{}",e);这个会丢堆栈信息
那么如果直接调用 异常的toString就会导致异常的堆栈信息丢失,
从而加大我们排查问题的难度
可以直接加在末尾,不用占位符
比如这样
log.warn("some err happen",e);
5 日志的保存
阿里巴巴java开发手册中明确的强制
要求我们至少保存15天日志,
对于用户的敏感操作和 重要的日志,需要6个月的保存时间
6 多服务日志追踪
在分布式应用中,
用户的一个请求会调用若干个服务完成,
这些服务可能还是嵌套调用的,
因此完成一个请求的日志并 不在一个应用的日志文件,
而是分散在不同服务器上不同应用节点的日志文件中。
我们通过一个traceId就可以拿到整个链路中的日 志信息,
对我们的日志排查特别方便。
调用链标识格式:
唯一字符串(trace ID) +调用层级(span ID)
7 在什么地方打日志
当你碰到if...else或者switch这样的分支时,
要在分支的首行打印日志,用来确定进入了哪个分支
方法的入参,返回值处
方法调用第三方和接收第三方的返回值处
8 日志级别低时候,进行级别开关判断
对于trace/debug这些比较低的日志级别,必须进行日志级别的开关判断。
User user = new User (666L, "公众号", "捡田螺的小男孩");
if ( log.isDebugEnabled()) {
log.debug("userId is: {}", user.getId());
}
如果配置的日志级别是warn的话,上述日志不会打印,
但是会执行字符串拼接操作,如果symbol
是对象, 还会执行toString()
方法,浪费了系统资源,执行了上述操作,最终日志却没有打印,因此建议加日志开关判断。
9 禁止在线上开debug
禁止在线上环境开启debug,这一点非常重要。
因为一般系统的debug日志会很多,并且各种框架中也大量使用 debug的日志,线上开启debug不久可能会打满磁盘,影响业务系统的正常运行。
我对任何唾手而得,快速,出自本能,即兴,含混的事物没有信心。我相信缓慢,平和,细水长流的力量,踏实,冷静。我不相信缺乏自律精神和不自我建设,不努力,可以得到个人或集体的解放。