安装

安装:

  1. go get github.com/sirupsen/logrus

hello world

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

日志格式

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

  1. log.SetFormatter(&log.JSONFormatter{})
  1. package main
  2. import (
  3. log "github.com/sirupsen/logrus"
  4. )
  5. func initLog() {
  6. // 设置日志格式为json格式
  7. log.SetFormatter(&log.JSONFormatter{})
  8. }
  9. func main() {
  10. initLog()
  11. log.WithFields(log.Fields{
  12. "age": 12,
  13. "name": "xiaoming",
  14. "sex": 1,
  15. }).Info("小明来了")
  16. log.WithFields(log.Fields{
  17. "age": 13,
  18. "name": "xiaohong",
  19. "sex": 0,
  20. }).Error("小红来了")
  21. log.WithFields(log.Fields{
  22. "age": 14,
  23. "name": "xiaofang",
  24. "sex": 1,
  25. }).Fatal("小芳来了")
  26. }
  27. 输出:
  28. {"age":12,"level":"info","msg":"小明来了","name":"xiaoming","sex":1,"time":"2019-05-24T08:20:19+08:00"}
  29. {"age":13,"level":"error","msg":"小红来了","name":"xiaohong","sex":0,"time":"2019-05-24T08:20:19+08:00"}
  30. {"age":14,"level":"fatal","msg":"小芳来了","name":"xiaofang","sex":1,"time":"2019-05-24T08:20:19+08:00"}

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

日志级别

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

  1. PanicLevel
  2. FatalLevel
  3. ErrorLevel
  4. WarnLevel
  5. InfoLevel
  6. DebugLevel

设置日志输出级别:

  1. log.SetLevel(log.WarnLevel)

自定义输出

字段

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

  1. log.SetFormatter(&log.TextFormatter{DisableTimestamp: true})

自定义 Field 的方法如下:

  1. log.WithFields(log.Fields{
  2. "age": 14,
  3. "name": "xiaofang",
  4. "sex": 1,
  5. }).Fatal("小芳来了")

路径

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

  1. func init() {
  2. //设置输出样式,自带的只有两种样式logrus.JSONFormatter{}和logrus.TextFormatter{}
  3. logrus.SetFormatter(&logrus.JSONFormatter{})
  4. //设置output,默认为stderr,可以为任何io.Writer,比如文件*os.File
  5. file, _ := os.OpenFile("1.log", os.O_CREATE|os.O_WRONLY, 0666)
  6. log.SetOutput(file)
  7. //设置最低loglevel
  8. logrus.SetLevel(logrus.InfoLevel)
  9. }

hook机制

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

  1. type Hook interface {
  2. Levels() []Level
  3. Fire(*Entry) error
  4. }

logrus的hook原理是:在每次写入日志时拦截,修改logrus.Entry 。logrus在记录Levels()返回的日志级别的消息时,会触发HOOK, 然后按照Fire方法定义的内容,修改logrus.Entry 。logrus.Entry里面就是记录的每一条日志的内容。
所以在Hook中你需要做的就是在Fire方法中定义你想如何操作这一条日志的方法,在Levels方法中定义你想展示的日志级别。
如下是一个在所有日志中打印一个特殊字符串的Hook:
TraceIdHook

  1. package hook
  2. import (
  3. "github.com/sirupsen/logrus"
  4. )
  5. type TraceIdHook struct {
  6. TraceId string
  7. }
  8. func NewTraceIdHook(traceId string) logrus.Hook {
  9. hook := TraceIdHook{
  10. TraceId: traceId,
  11. }
  12. return &hook
  13. }
  14. func (hook *TraceIdHook) Fire(entry *logrus.Entry) error {
  15. entry.Data["traceId"] = hook.TraceId
  16. return nil
  17. }
  18. func (hook *TraceIdHook) Levels() []logrus.Level {
  19. return logrus.AllLevels
  20. }

主程序:

  1. package main
  2. import (
  3. uuid "github.com/satori/go.uuid"
  4. log "github.com/sirupsen/logrus"
  5. "webDemo/hook"
  6. )
  7. func initLog() {
  8. uuids, _ := uuid.NewV1()
  9. log.AddHook(hook.NewTraceIdHook(uuids.String() +" "))
  10. }
  11. func main() {
  12. initLog()
  13. log.WithFields(log.Fields{
  14. "age": 12,
  15. "name": "xiaoming",
  16. "sex": 1,
  17. }).Info("小明来了")
  18. log.WithFields(log.Fields{
  19. "age": 13,
  20. "name": "xiaohong",
  21. "sex": 0,
  22. }).Error("小红来了")
  23. log.WithFields(log.Fields{
  24. "age": 14,
  25. "name": "xiaofang",
  26. "sex": 1,
  27. }).Fatal("小芳来了")
  28. }

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