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

下载logrus

go get github.com/sirupsen/logrus

基本使用

日志级别

通过查看logrus.go文件发现logrus一共有7个日志级别
【golang】源码层面学习日志框架logrus 01_第1张图片

打印

新建一个main.go分别打印这几种级别的日志
【golang】源码层面学习日志框架logrus 01_第2张图片
运行结果:
【golang】源码层面学习日志框架logrus 01_第3张图片
发现和我们预期不符合,接下来就通过源码看看为什么会这样子。

初探源码

【golang】源码层面学习日志框架logrus 01_第4张图片
随便进入其中一个方法,可以发现它调用了std.Trace,接下来就看下这个std是什么
【golang】源码层面学习日志框架logrus 01_第5张图片
发现std=New(),再看看New()是什么
【golang】源码层面学习日志框架logrus 01_第6张图片
可以看到New为我们返回了一个默认的Logger对象,也就是说直接通过包名.Info这样子打印日志,其实用的是logrus里默认的一个Logger对象(这也就意味着我们后面可以自定义logger对象)。在这个new里,我们看到了一个关键的地方Level:InfoLevel。发现默认的logger打印级别是info,这也就意味着info以下的级别日志是不打印的,这也就解释了为什么刚刚输出那里没有trace和debug信息。
接下来我们继续深入,看看这个日记级别是在哪里判断的。我们从logrus.Info()入手,不断的Ctrl+左键进入,最后发现了这么一段代码
在这里插入图片描述
也就是logrus.Info()最后会变成调用Loger对象里的Log()方法,并将InfoLevel常数传入,直觉告诉我们接下来的级别判断就在这个方法里面。
【golang】源码层面学习日志框架logrus 01_第7张图片
在这里插入图片描述

不出所料,在这里判断了日志级别,所以这就是为什么低于info级别的日志不会输出。

还有一个问题

上面解释了为什么trace和debug没显示,但是我们发现panic也没显示,程序在打印完fatal后就直接结束了。
我们点入logrus.Fatal()看看发生了什么
【golang】源码层面学习日志框架logrus 01_第8张图片
我们看到了关键代码
也就是这个Fatal在打印完之后,会调用Logger里面的Exit方法
【golang】源码层面学习日志框架logrus 01_第9张图片
【golang】源码层面学习日志框架logrus 01_第10张图片
我们发现它调用了ExitFunc方法,这个ExitFunc是不是很熟悉,其实之前我们在看New()源码的时候就看到了
【golang】源码层面学习日志框架logrus 01_第11张图片
可以看到默认的Logger对象里传的就是系统的退出方法,这也就是为什么我们打印完fatal后程序就结束了

你可能感兴趣的:(golang,golang,学习)