go日志库logrus的安装及快速使用

 更新时间:2022年08月04日 09:01:44   作者:王者之峰  
这篇文章主要为大家介绍了go日志库logrus的安装及快速使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

安装简介

Logrus是Go的结构化日志记录器,与标准的日志记录器库完全API兼容。

go get安装的logrus库

 go get github.com/sirupsen/logrus

快速使用

package main
import (
   log "github.com/sirupsen/logrus"
)
func main() {
   log.SetLevel(log.TraceLevel)
   log.Trace("trace")
   log.Debug("debug")
   log.Info("info")
   log.Warn("warn")
   log.Error("error")
   log.Fatal("fatal")
   log.Panic("panic")
}

输出:

TRAC[0000] trace                                        
DEBU[0000] debug                                        
INFO[0000] info                                         
WARN[0000] warn                                         
ERRO[0000] error                                        
FATA[0000] fatal                                        
exit status 1

可以看到panic没有输出,因为fatal会导致goroutine直接退出。

支持的日志级别

logrus支持多种日志级别,下面从小到大:

  • Panic:记录日志,然后panic
  • Fatal:致命错误,输出日志后,程序退出
  • Error:错误
  • Warn:警告
  • Info:关键信息
  • Debug:调试信息
  • Trace:很细粒度的信息,一般用不到。

可以看到Trace级别最大,Panic最小。默认的级别为Info,高于这个级别的日志不会输出。

日期

可以看到上面的日志没有时间,可以指定日志格式:

package main
import (
   log "github.com/sirupsen/logrus"
)
func main() {
   log.SetLevel(log.TraceLevel)
   log.SetFormatter(&log.TextFormatter{
      FullTimestamp:   true,
      TimestampFormat: "2022-07-17 00:00:00.000",
   })
   log.Trace("trace")
   log.Debug("debug")
   log.Info("info")
   log.Warn("warn")
   log.Error("error")
   log.Fatal("fatal")
   log.Panic("panic")
}

精确到毫秒。

输出:

TRAC[171717+08-77 00:00:00.628] trace                                        
DEBU[171717+08-77 00:00:00.629] debug                                        
INFO[171717+08-77 00:00:00.629] info                                         
WARN[171717+08-77 00:00:00.629] warn                                         
ERRO[171717+08-77 00:00:00.629] error                                        
FATA[171717+08-77 00:00:00.629] fatal                                        
exit status 1

打印调用位置

在进行定位的时候需要知道是那行代码调用的log.SetReportCaller(true)

package main
import (
   log "github.com/sirupsen/logrus"
)
func main() {
   log.SetLevel(log.TraceLevel)
   log.SetReportCaller(true)
   log.SetFormatter(&log.TextFormatter{
      FullTimestamp:   true,
      TimestampFormat: "2022-07-17 00:00:00.000",
   })
   log.Trace("trace")
   log.Debug("debug")
   log.Info("info")
   log.Warn("warn")
   log.Error("error")
   log.Fatal("fatal")
   log.Panic("panic")
}

输出:

TRAC[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:14 main.main() trace                                        
DEBU[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:15 main.main() debug                                        
INFO[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:16 main.main() info                                         
WARN[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:17 main.main() warn                                         
ERRO[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:18 main.main() error                                        
FATA[171717+08-77 00:00:00.019]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:19 main.main() fatal                                        
exit status 1

添加字段

定位问题需要知道具体是那个数据调用的,可以借助于log.WithFieldlog.WithFieldslog.WithField内部调用的也是log.WithFields,参数底层使用map[string]interface{}数据结构保存:

package main
import (
   log "github.com/sirupsen/logrus"
   "os"
)
func main() {
   log.SetLevel(log.TraceLevel)
   log.SetReportCaller(true)
   log.SetFormatter(&log.TextFormatter{
      FullTimestamp:   true,
      TimestampFormat: "2022-07-17 00:00:00.000",
   })
   id := os.Args[1]
   mylog := log.WithField("id", id)
   mylog.Trace("trace")
   mylog.Debug("debug")
   mylog.Info("info")
   mylog.Warn("warn")
   mylog.Error("error")
   mylog.Fatal("fatal")
   mylog.Panic("panic")
}

输出:

➜  StudyProject go run  src/log/my_log.go 123
TRAC[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:22 main.main() trace                                         id=123
DEBU[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:23 main.main() debug                                         id=123
INFO[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:24 main.main() info                                          id=123
WARN[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:25 main.main() warn                                          id=123
ERRO[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:26 main.main() error                                         id=123
FATA[171717+08-77 00:00:00.665]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:27 main.main() fatal                                         id=123
exit status 1

给字段值加引号

配置ForceQuotetrue

package main
import (
   log "github.com/sirupsen/logrus"
   "os"
)
func main() {
   log.SetLevel(log.TraceLevel)
   log.SetReportCaller(true)
   log.SetFormatter(&log.TextFormatter{
      FullTimestamp:   true,
      TimestampFormat: "2022-07-17 00:00:00.000",
      ForceQuote:      true,
   })
   id := os.Args[1]
   mylog := log.WithField("id", id)
   mylog.Trace("trace")
   mylog.Debug("debug")
   mylog.Info("info")
   mylog.Warn("warn")
   mylog.Error("error")
   mylog.Fatal("fatal")
   mylog.Panic("panic")
}

输出:

➜  StudyProject go run  src/log/my_log.go 123
TRAC[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:22 main.main() trace                                         id="123"
DEBU[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:23 main.main() debug                                         id="123"
INFO[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:24 main.main() info                                          id="123"
WARN[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:25 main.main() warn                                          id="123"
ERRO[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:26 main.main() error                                         id="123"
FATA[171717+08-77 00:00:00.427]/Users/wanghaifeng/GolandProjects/StudyProject/src/log/my_log.go:27 main.main() fatal                                         id="123"
exit status 1

设置钩子

每条日志在输出前都会执行钩子的特定方法,相当于全局拦截,可以方便做一些扩展,比如添加字段channel表明日志是那个应用输出的、增加tranceid方便对问题的跟踪、输出日志文件等。

设置channel

package hooks
import log "github.com/sirupsen/logrus"
type ChannelHook struct {
   ChannelName string
}
func (h ChannelHook) Levels() []log.Level {
   return log.AllLevels
}
func (h ChannelHook) Fire(entry *log.Entry) error {
   entry.Data["channel"] = h.ChannelName
   return nil
}
package main
import (
   logs "StudyProject/src/log/hooks"
   log "github.com/sirupsen/logrus"
)
func main() {
   log.AddHook(logs.ChannelHook{
      ChannelName: "web",
   })
   log.Info("info")
}

输出:

INFO[0000] info                                          channel=web

输出日志

可以利用logrus的hook自己写入文件,但是指定单个文件收集的时间范围、保存的时间logrus并不支持,笔者目前的项目使用的是file-rotatelogs,但是作者已经不更新和维护,所以这里就不使用它来展示,有在考虑使用goframe的glog替换。

笔者这里就写个简单例子演示如何利用logrus的hook去写文件并且把控制台的打印干掉:

package hooks
import (
   log "github.com/sirupsen/logrus"
   "io/ioutil"
)
//
//FileHook
//  @Description: 文件hook
//
type FileHook struct {
   //
   //  FileName
   //  @Description:  文件名
   //
   FileName string
}
func (h FileHook) Levels() []log.Level {
   return log.AllLevels
}
func (h FileHook) Fire(entry *log.Entry) error {
   fomat := &log.TextFormatter{
      FullTimestamp:   true,
      TimestampFormat: "2022-07-17 00:00:00.000",
   }
   //  从entry从获得日志内容
   msg, err := fomat.Format(entry)
   if err != nil {
      return err
   }
   err = ioutil.WriteFile(h.FileName, msg, 0644)
   if err != nil {
      return err
   }
   return nil
}
package main
import (
   logs "StudyProject/src/log/hooks"
   log "github.com/sirupsen/logrus"
   "io/ioutil"
)
func main() {
   log.AddHook(logs.FileHook{"log"})
   //  关闭控制台打印
   log.SetOutput(ioutil.Discard)
   log.Info("test log write file")
}

很显然这只是个例子,不可直接应用于生产。

以上就是go日志库logrus的安装及快速使用的详细内容,更多关于go日志库logrus安装使用的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言利用ssh连接服务器的方法步骤

    Go语言利用ssh连接服务器的方法步骤

    这篇文章主要介绍了Go语言利用ssh连接服务器的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Go Web下gin框架的模板渲染的实现

    Go Web下gin框架的模板渲染的实现

    Gin框架是目前非常流行的Go语言Web框架之一,作为一个轻量级的框架,Gin提供了丰富的功能和灵活的架构,本文就来介绍下Go Web下gin框架的模板渲染的实现,感兴趣的可以了解一下
    2023-10-10
  • Go语言中实现Unix风格的进程管道方法实例

    Go语言中实现Unix风格的进程管道方法实例

    这篇文章主要为大家介绍了Go语言中实现Unix风格的进程管道方法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 详解Opentelemetry Collector采集器

    详解Opentelemetry Collector采集器

    这篇文章主要为大家介绍了Opentelemetry Collector神秘的采集器详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • golang实现枚举的几种方式

    golang实现枚举的几种方式

    在Go语言中,虽没有内置枚举类型,但可通过常量、结构体或自定义类型和方法实现枚举功能,这些方法提高了代码的可读性和维护性,避免了魔法数字的使用,感兴趣的可以了解一下
    2024-09-09
  • 详解Go语言的错误处理和资源管理

    详解Go语言的错误处理和资源管理

    资源处理是什么?打开文件需要关闭,打开数据库连接,连接需要释放。这些成对出现的就是资源管理。有时候我们虽然释放了,但是程序在中间出错了,那么可能导致资源释放失败。如何保证打开的文件一定会被关闭呢?这就是资源管理与错误处理考虑的一个原因
    2021-06-06
  • GoLang中Strconv库有哪些常用方法

    GoLang中Strconv库有哪些常用方法

    这篇文章主要介绍了GoLang中Strconv库有哪些常用方法,strconv库实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi()、Itia()、parse系列、format系列、append系列
    2023-01-01
  • 关于go-micro与其它gRPC框架之间的通信问题及解决方法

    关于go-micro与其它gRPC框架之间的通信问题及解决方法

    在之前的文章中分别介绍了使用gRPC官方插件和go-micro插件开发gRPC应用程序的方式,都能正常走通。不过当两者混合使用的时候,互相访问就成了问题,下面通过本文给大家讲解下go-micro与gRPC框架通信问题,一起看看吧
    2022-04-04
  • go的切片扩容机制详解

    go的切片扩容机制详解

    本文主要介绍了go的切片扩容机制详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • go语言的sql包原理与用法分析

    go语言的sql包原理与用法分析

    这篇文章主要介绍了go语言的sql包原理与用法,较为详细的分析了Go语言里sql包的结构、相关函数与使用方法,需要的朋友可以参考下
    2016-07-07

最新评论