Go日志——logrus

原创
2020/02/28 16:13
阅读数 38

安装

安装:

go get github.com/sirupsen/logrus

hello world

package main
import log "github.com/sirupsen/logrus"
func main() {
    log.Info("我是一条日志")
    log.WithFields(log.Fields{"key":"value"}).Info("我要打印了")
}
输出:
time="2019-05-24T08:13:47+08:00" level=info msg="我是一条日志"
time="2019-05-24T08:13:47+08:00" level=info msg="我要打印了" key=value

日志格式

将日志输出格式设置为JSON格式:

log.SetFormatter(&log.JSONFormatter{})
package main
import (
  log "github.com/sirupsen/logrus"
)
func initLog() {
  // 设置日志格式为json格式
  log.SetFormatter(&log.JSONFormatter{})
}
func main() {
  initLog()
  log.WithFields(log.Fields{
    "age": 12,
    "name":   "xiaoming",
    "sex": 1,
  }).Info("小明来了")
  log.WithFields(log.Fields{
    "age": 13,
    "name":   "xiaohong",
    "sex": 0,
  }).Error("小红来了")
  log.WithFields(log.Fields{
    "age": 14,
    "name":   "xiaofang",
    "sex": 1,
  }).Fatal("小芳来了")
}
输出:
{"age":12,"level":"info","msg":"小明来了","name":"xiaoming","sex":1,"time":"2019-05-24T08:20:19+08:00"}
{"age":13,"level":"error","msg":"小红来了","name":"xiaohong","sex":0,"time":"2019-05-24T08:20:19+08:00"}
{"age":14,"level":"fatal","msg":"小芳来了","name":"xiaofang","sex":1,"time":"2019-05-24T08:20:19+08:00"}

看到这里输出的日志格式与上面的区别,这里是json格式,上面是纯文本。

日志级别

logrus 提供 6 档日志级别,分别是:

设置日志输出级别:

自定义输出

字段

logrus 默认的日志输出有 time、level 和 msg 3个 Field,其中 time 可以不显示,方法如下:

自定义 Field 的方法如下:

路径

logrus默认日志输出为stderr,你可以修改为任何的io.Writer。比如os.File文件流。

hook机制

上面说过logrus是一个支持可插拔,结构化的日志框架,可插拔的特性就在于它的hook机制。一些功能需要用户自己通过hook机制去实现定制化的开发。比如说在log4j中常见的日志按天按小时做切分的功能官方并没有提供支持,你可以通过hook机制实现它。

Hook接口定义如下:

logrus的hook原理是:在每次写入日志时拦截,修改logrus.Entry 。logrus在记录Levels()返回的日志级别的消息时,会触发HOOK, 然后按照Fire方法定义的内容,修改logrus.Entry 。logrus.Entry里面就是记录的每一条日志的内容。

所以在Hook中你需要做的就是在Fire方法中定义你想如何操作这一条日志的方法,在Levels方法中定义你想展示的日志级别。

如下是一个在所有日志中打印一个特殊字符串的Hook:

TraceIdHook

主程序:

该hook会在日志中打印出一个uuid字符串。

本文同步分享在 博客“羊羽”(other)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享

作者的其它热门文章

加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部