# 关于打日志这件事

最近在推上看到下面这张图，讲的是什么时候应该用什么log level，觉得还蛮有意思，于是想到结合自己过往的工作经验做一次解读

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1665496977967/1_rZZX3fq.png align="left")

一般情况，在打日志这件事情上，并不严格区分Developer与System operator，事实上，在笔者的工作经历中，在怎么打、应该时候应该打日志这件事，基本上都是由开发自己去完成的。

# 日志分级
## trace
>Designates finer-grained informational events than the Debug.

对debug更精细的日志级别? 抱歉，我个人表示从来没有用到过这一级别

## debug
开发调试阶段会用到，比如在开发阶段可能会有打印请求body这类诉求，通常用的较少

## info
常用日志级别，实际使用中，info是当debug用的，所以，基本上这两者区别不是特别大。比如某个操作成功打印一下，或者打印请求中的某些变量、当前操作用户等行为。
```golang
		logrus.Infof("this action sucess")
		logrus.Infof("current user is %s", userName)
```

## warn
处理http请求时，一般40x的日志级别是warn，或者是接口慢请求等

## error
这一级通常需要接告警平台，把error内容通知给开发者的。比如服务panic了这类**预期之外**的**错误 **，再比如金融服务中需要对账，如果一个人的账户余额跟流水对不上，这是大事，这可是大大的error，所以其实error是一个需要严肃对待日志级别

## fatal
这个比error更严重了吧，生产环境没有用过，能想到的适用场景可能是服务启动时，做一些上下游依赖检查，如果没有通过，就不启动？

# 总结
其实我在工作中经常发现这样几类打日志的坏习惯：
- RESTful API的出参和入参全打出来，不管有用没有，有人认为要用的时候肯定用的着
- 打印一些没有上下文的一句话日志，比如前面提到的`"this action sucess"`，这种日志没太大意义
搞清楚为什么要打印日志这件事情是非常重要的，从我的角度，日志当然是为了帮助开发者快速定位问题所在，出问题的地方是预期之外的，预期之内的笃定不会出错，可以按需要打辅助日志，无脑打日志是本人非常反对的。

我们的日志通常会写到日志文件中，日志文件可能会很大，这种时候最好做一下日志切割(比如[lumberjack](https://github.com/natefinch/lumberjack))，避免因写入日志磁盘占用过多而引起其它问题。

参考
- https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels
