下载logrus
go get github.com/sirupsen/logrus
基本使用
日志级别
通过查看logrus.go文件发现logrus一共有7个日志级别
打印
新建一个main.go分别打印这几种级别的日志
运行结果:
发现和我们预期不符合,接下来就通过源码看看为什么会这样子。
初探源码
随便进入其中一个方法,可以发现它调用了std.Trace,接下来就看下这个std是什么
发现std=New(),再看看New()是什么
可以看到New为我们返回了一个默认的Logger对象,也就是说直接通过包名.Info这样子打印日志,其实用的是logrus里默认的一个Logger对象(这也就意味着我们后面可以自定义logger对象)。在这个new里,我们看到了一个关键的地方Level:InfoLevel。发现默认的logger打印级别是info,这也就意味着info以下的级别日志是不打印的,这也就解释了为什么刚刚输出那里没有trace和debug信息。
接下来我们继续深入,看看这个日记级别是在哪里判断的。我们从logrus.Info()入手,不断的Ctrl+左键进入,最后发现了这么一段代码
也就是logrus.Info()最后会变成调用Loger对象里的Log()方法,并将InfoLevel常数传入,直觉告诉我们接下来的级别判断就在这个方法里面。
不出所料,在这里判断了日志级别,所以这就是为什么低于info级别的日志不会输出。
还有一个问题
上面解释了为什么trace和debug没显示,但是我们发现panic也没显示,程序在打印完fatal后就直接结束了。
我们点入logrus.Fatal()看看发生了什么
我们看到了关键代码
也就是这个Fatal在打印完之后,会调用Logger里面的Exit方法
我们发现它调用了ExitFunc方法,这个ExitFunc是不是很熟悉,其实之前我们在看New()源码的时候就看到了
可以看到默认的Logger对象里传的就是系统的退出方法,这也就是为什么我们打印完fatal后程序就结束了