无路是在开发、测试、亦或者调试有一好的日志,都会事半功倍。本节我来学习一下 go 语言明星日志库
logrus。相关链接如下所示
github: https://github.com/sirupsen/logrus
pkg: https://pkg.go.dev/logur.dev/adapter/logrus
Logrus 简介
Logrus 是 Go 语言结构化的 logger,与标准库 logger 完全 API 兼容。
它有以下特点:
- 完全兼容标准日志库,拥有七种日志级别:
Trace
,Debug
,Info
,Warning
,Error
,Fatal
andPanic
。 - 可选的日志输出格式,内置了两种日志格式 JSONFormater 和 TextFormatter,还可以自定义日志格式
- Field 机制,通过 Filed 机制进行结构化的日志记录
- 可扩展的 Hook 机制,允许使用者通过 Hook 的方式将日志分发到任意地方,如本地文件系统,logstash,elasticsearch
或者 mq 等,或者通过 Hook 定义日志内容和格式等 - 线程安全
logrus 的安装
logrus 安装也非常的简单,直接使用go get
即可,安装命令如下所示
1 | go get -v -u logur.dev/adapter/logrus |
其中
-v
为显示包安装信息
-u
为安装最新版
logrus 的使用
介绍的包的使用,或许可以从几个维度,初始化、基本使用、骚操作及拓展。源于包使用,但不限于包使用
初始化
logrus 相关于初始化的方面,一共有三种方式。基于New()
、Logger
、不操作
直接使用
直接使用相对来说更便捷,更清亮。也是相对来说性能最高的,但不足也显而易言,那就是不能有更自由的操作了,如设置
log Level、Hook、Format 等等。
1 | logrus.Trace("trace msg") |
当然根据默认的规则会忽略掉一些输出信息
使用 New 初始化于定制
相对直接使用,使用 New 初始化,拥有更多的操作空间。
首先声明一个全局变量log
,代码如下所示
1 | var log = logrus.New() |
常规情况下对于日志的定制主要在以下几个方面
- 日志可见等级
- 日志格式配置
- 执行调用信息
- 日志另存为
日志可见等级
相关源码如下
1 | const ( |
简而言之,登记越高(数字越大),显示的等级越全。如 6 显示所有的日志,0 只显示Panic
设置可见等级之需要在log.SetLevel()
*(log 为var log = logrus.New()
而来)*设置整形(6-0)即可。
日志格式化配置
日志格式化主要分为文本格式化、JSON 格式化、自定义格式化或第三方插件格式化
如下
1 | // log.SetFormatter(&logrus.TextFormatter{ |
格式 JSON 化
1 | // log.SetFormatter(&logrus.JSONFormatter{}) |
https://github.com/sirupsen/logrus#formatters
写入文件夹 SetOutput
O_RDONLY:只读模式(read-only)
O_WRONLY:只写模式(write-only)
O_RDWR:读写模式(read-write)
O_APPEND:追加模式(append)
O_CREATE:文件不存在就创建(create a new file if none exists.)
O_EXCL:与 O_CREATE 一起用,构成一个新建文件的功能,它要求文件必须不存在(used with O_CREATE, file must
not exist)
O_SYNC:同步方式打开,即不使用缓存,直接写入硬盘 O_TRUNC:打开并清空文件
示例代码如下
1 | func init(){ |
log.SetReportCaller()
: 显示调用关系,开启这个模式会增加性能开销(成本在 20% 到 40% 之间)。
Hook
logrus 通过实现 Hook
接口扩展 hook 机制,可以根据需求将日志分发到任意的存储介质, 比如 es, mq
或者监控报警系统,及时获取异常日志。可以说极大的提高了日志系统的可扩展性。
1 | type Hook interface { |
具体 Hook 示列可参考 https://github.com/sirupsen/logrus/blob/master/hooks/syslog/README.md
referer
https://blog.csdn.net/wangzhezhilu001/article/details/95363789
https://blog.csdn.net/sserf/article/details/103388133