日志相关的规范

1 痛点

2 为什么写日志

2-1 监控

反应系统的运行状态

2-2 问题排查

了解运行过程,异常位置等

3 系统日志的级别

image

  • 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不久可能会打满磁盘,影响业务系统的正常运行。

posted @ 2021-12-27 19:32  姚狗蛋  阅读(202)  评论(0编辑  收藏  举报