golang|【golang】源码层面学习日志框架logrus 01

下载logrus

go get github.com/sirupsen/logrus
基本使用 日志级别 通过查看logrus.go文件发现logrus一共有7个日志级别
golang|【golang】源码层面学习日志框架logrus 01
文章图片

打印 新建一个main.go分别打印这几种级别的日志
golang|【golang】源码层面学习日志框架logrus 01
文章图片

运行结果:
golang|【golang】源码层面学习日志框架logrus 01
文章图片

发现和我们预期不符合,接下来就通过源码看看为什么会这样子。
初探源码 golang|【golang】源码层面学习日志框架logrus 01
文章图片

随便进入其中一个方法,可以发现它调用了std.Trace,接下来就看下这个std是什么
golang|【golang】源码层面学习日志框架logrus 01
文章图片

发现std=New(),再看看New()是什么
golang|【golang】源码层面学习日志框架logrus 01
文章图片

可以看到New为我们返回了一个默认的Logger对象,也就是说直接通过包名.Info这样子打印日志,其实用的是logrus里默认的一个Logger对象(这也就意味着我们后面可以自定义logger对象)。在这个new里,我们看到了一个关键的地方Level:InfoLevel。发现默认的logger打印级别是info,这也就意味着info以下的级别日志是不打印的,这也就解释了为什么刚刚输出那里没有trace和debug信息。
接下来我们继续深入,看看这个日记级别是在哪里判断的。我们从logrus.Info()入手,不断的Ctrl+左键进入,最后发现了这么一段代码
golang|【golang】源码层面学习日志框架logrus 01
文章图片

也就是logrus.Info()最后会变成调用Loger对象里的Log()方法,并将InfoLevel常数传入,直觉告诉我们接下来的级别判断就在这个方法里面。
golang|【golang】源码层面学习日志框架logrus 01
文章图片

golang|【golang】源码层面学习日志框架logrus 01
文章图片

不出所料,在这里判断了日志级别,所以这就是为什么低于info级别的日志不会输出。
还有一个问题 【golang|【golang】源码层面学习日志框架logrus 01】上面解释了为什么trace和debug没显示,但是我们发现panic也没显示,程序在打印完fatal后就直接结束了。
我们点入logrus.Fatal()看看发生了什么
golang|【golang】源码层面学习日志框架logrus 01
文章图片

我们看到了关键代码
也就是这个Fatal在打印完之后,会调用Logger里面的Exit方法
golang|【golang】源码层面学习日志框架logrus 01
文章图片

golang|【golang】源码层面学习日志框架logrus 01
文章图片

我们发现它调用了ExitFunc方法,这个ExitFunc是不是很熟悉,其实之前我们在看New()源码的时候就看到了
golang|【golang】源码层面学习日志框架logrus 01
文章图片

可以看到默认的Logger对象里传的就是系统的退出方法,这也就是为什么我们打印完fatal后程序就结束了

    推荐阅读