go入门实践三-go日志库-Logrus入门教程

这篇具有很好参考价值的文章主要介绍了go入门实践三-go日志库-Logrus入门教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

日志可以用于排查bug。在C++中,我尝试过:boost log简介、spdlog日志库的封装使用。但我还是比较喜欢plog,因为它简单。

Go 标准库提供了一个日志库log。它的使用可见:Go 每日一库之 log。但是,它有个致命的缺点,没有日志等级。它可以很好的用于日常写demo,但是不适合稍微大点的代码。

参考在Github中stars数最多的Go日志库集合,本文尝试logrus。


Logrus入门

本节内容翻译/摘录自:Sirupsen/logrus、Go 每日一库之 logrus

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

Logrus 进入维护模式。我们不会引入新的特性。因为它已经被很多项目依赖。引入新特性,可能会破坏他们的项目,这是不希望发生的事情。这并不意味着 Logrus 死了。Logrus 将继续保持安全性、(向后兼容的) bug 修复和性能(在这些方面我们受到接口的限制)。我认为,Logrus 最大的贡献在于,在 Golang 结构化日志的广泛应用中发挥了一定作用。似乎没有理由在 Logrus V2中进行重大的、突破性的迭代,因为出色的 Go 社区已经独立地构建了这些迭代。社区中也有很多优秀的日志库,如Zerolog、 Zap 和 Apex。


设置日志等级

设置日志等级未debug。

package main

import (
	"github.com/sirupsen/logrus"
)

func main() {
	logrus.SetLevel(logrus.DebugLevel)

	logrus.Trace("trace msg")
	logrus.Debug("debug msg")
	logrus.Info("info msg")
	logrus.Warn("warn msg")
	logrus.Error("error msg")
	logrus.Fatal("fatal msg")
	logrus.Panic("panic msg")
}

默认输出到标准输出。输入内容如下。

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

设置输出格式

上面默认使用的时logrus.SetFormatter(&logrus.TextFormatter{}),输出在tty中会有颜色。我们也可以设置为logrus.SetFormatter(&logrus.JSONFormatter{})格式,将字段记录为 JSON。其他的第三方format见官网。也可以自定义format。

package main

import (
	"github.com/sirupsen/logrus"
)

func main() {
	logrus.SetLevel(logrus.DebugLevel)
	logrus.SetFormatter(&logrus.JSONFormatter{})
	// logrus.SetFormatter(&logrus.TextFormatter{})

	logrus.Trace("trace msg")
	logrus.Debug("debug msg")
	logrus.Error("error msg")
}

输出如下。

{"level":"debug","msg":"debug msg","time":"2023-08-09T18:37:58+08:00"}
{"level":"error","msg":"error msg","time":"2023-08-09T18:37:58+08:00"}

设置输出文件名和函数

package main

import (
	"github.com/sirupsen/logrus"
)

func main() {
	logrus.SetLevel(logrus.DebugLevel)
	logrus.SetFormatter(&logrus.TextFormatter{})
	// logrus.SetFormatter(&logrus.TextFormatter{
	// 	DisableColors: true,
	// 	FullTimestamp: true,
	// })
	logrus.SetReportCaller(true)

	logrus.Trace("trace msg")
	logrus.Debug("debug msg")
	logrus.Error("error msg")
}

输入如下。

DEBU[0000]/xxx/demo-2/15-go-Logrus/demo-1.go:17 main.main() debug msg                                    
ERRO[0000]/xxx/demo-2/15-go-Logrus/demo-1.go:18 main.main() error msg

添加字段

package main

import (
	log "github.com/sirupsen/logrus"
)

func main() {
	log.SetLevel(log.DebugLevel)
	// log.SetFormatter(&log.TextFormatter{})
	// log.SetReportCaller(true)

	log.WithFields(log.Fields{
		"animal": "walrus",
	}).Debug("A walrus appears")

	contextLogger := log.WithFields(log.Fields{
		"common": "this is a common field",
		"other":  "I also should be logged always",
	})

	contextLogger.Info("I'll be logged with common and other field")
	contextLogger.Info("Me too")
}

输出如下。

DEBU[0000] A walrus appears                              animal=walrus
INFO[0000] I'll be logged with common and other field    common="this is a common field" other="I also should be logged always"
INFO[0000] Me too                                        common="this is a common field" other="I also should be logged always"

使用新的logger实例

package main

import (
	"os"

	log "github.com/sirupsen/logrus"
)

// Create a new instance of the logger. You can have any number of instances.
var FileLog = log.New()

func main() {

	file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err == nil {
		FileLog.SetOutput(file)
	} else {
		FileLog.Info("Failed to log to file, using default stderr")
	}
	FileLog.SetFormatter(&log.TextFormatter{})
	FileLog.SetLevel(log.DebugLevel)

	FileLog.Debug("hello world")
}

日志输出到文件中。


其他-略

  • hook: 每条日志输出前都会执行钩子的特定方法。
  • Logger 作为 io.Writer
  • 本身不提供日志Rotation。
  • 工具:通过配置文件初始化logger
  • Logrus 可以注册一个或多个在记录任何致命级别消息时将调用的函数
  • 默认情况下,Logger 受并发写操作的mutex保护。

一般实践

我习惯了plog的日志输出,包含:时间,等级,进程id,输出日志的函数以及所在行,日志信息。最后,日志文件可以回滚。

使用第三方nested-logrus-formatter设置格式。使用lumberjack控制日志回滚。示例如下:

package main

import (
	nested "github.com/antonfisher/nested-logrus-formatter"
	log "github.com/sirupsen/logrus"
	"gopkg.in/natefinch/lumberjack.v2"
)

func init() {
	logger := &lumberjack.Logger{
		Filename: "logrus.log",
		// 单位是 MB
		MaxSize: 500,
		// 最大过期日志保留的个数
		MaxBackups: 3,
		// 保留过期文件的最大时间间隔,单位是天
		MaxAge: 28, //days
		// 是否需要压缩滚动日志, 使用的 gzip 压缩
		Compress: true, // disabled by default
	}
	log.SetOutput(logger)

	log.SetFormatter(&nested.Formatter{
		NoColors:      true,
		HideKeys:      true,
		ShowFullLevel: true,
	})
	log.SetReportCaller(true)
	log.SetLevel(log.DebugLevel)
}

func main() {
	log.Debug("hello world")
}

输出到文件中,如下:

Aug  9 18:32:44.025 [DEBUG] hello world (/xxx/demo-2/15-go-Logrus/demo-1.go:33 main.main)
Level: true,
	})
	log.SetReportCaller(true)
	log.SetLevel(log.DebugLevel)
}

func main() {
	log.Debug("hello world")
}

输出到文件中,如下:文章来源地址https://www.toymoban.com/news/detail-636982.html

Aug  9 18:32:44.025 [DEBUG] hello world (/xxx/demo-2/15-go-Logrus/demo-1.go:33 main.main)

到了这里,关于go入门实践三-go日志库-Logrus入门教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Go语言】Golang保姆级入门教程 Go初学者chapter2

    setting的首选项 一个程序就是一个世界 变量是程序的基本组成单位 变量的使用步骤 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuxG8imp-1691479164956)(https://cdn.staticaly.com/gh/hudiework/img@main/image-20230726152905139.png)] 变量表示内存中的一个存储区 注意:

    2024年02月14日
    浏览(111)
  • 【GoLang入门教程】Go语言几种标准库介绍(六)

    前言 上一篇,我们介绍了image、IO、math三个库,这篇我们继续介绍剩下的库 几种库 Net库 (网络库,支持 Socket、HTTP、邮件、RPC、SMTP 等) 在 Go 语言的标准库中, net 包提供了对网络操作的支持,包括基本的网络协议、Socket 编程、HTTP 客户端和服务器等。 net 包包含多个子包,其

    2024年02月02日
    浏览(56)
  • 【GoLang入门教程】Go语言几种标准库介绍(七)

    前言 上一篇,我们介绍了Net、OS、path三个库,这篇我们继续介绍剩下的库 几种库 plugin库 (Go 1.7 加入的插件系统。支持将代码编译为插件,按需加载) 在 Go 语言的标准库中, plugin 包提供了对 Go 插件的支持。 插件是一种在运行时加载并与主程序交互的机制,允许程序在不重新

    2024年01月16日
    浏览(81)
  • 【GoLang入门教程】Go语言几种标准库介绍(四)

    前言 上一篇,我们介绍了debug、encoding、flag三个库,这篇我们继续介绍剩下的库 几种库 fmt库 (格式化操作) 在 Go 语言的标准库中, fmt 包提供了格式化输入输出的功能。 这个包包括了一系列函数,用于将数据格式化为字符串( fmt.Sprintf )、输出到控制台( fmt.Print 、 fmt.Pri

    2024年02月03日
    浏览(100)
  • 【GoLang入门教程】Go语言几种标准库介绍(五)

    前言 上一篇,我们介绍了fmt、Go、html 三个库,这篇我们继续介绍剩下的库 几种库 image库 (常见图形格式的访问及生成) 在 Go 语言的标准库中, image 包提供了对图像的基本操作和处理功能。 这个包定义了 Image 接口和一些基本的图像类型,同时也包含了一些实现了该接口的具

    2024年02月03日
    浏览(68)
  • 【GoLang入门教程】Go语言几种标准库介绍(八)

    强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能 前言 上一篇,我们介绍了plugin、reflect、regexp三个库,这篇我们继续介绍剩下的库 几种库 runtime库 ( 运行时接口) 在 Go 语言的标准库中, runtime 包

    2024年01月19日
    浏览(60)
  • 【Go语言】Golang保姆级入门教程 Go初学者介绍chapter1

    Golang的学习方向 区块链研发工程师: 去中心化 虚拟货币 金融 Go服务器端、游戏软件工程师 : C C++ 处理日志 数据打包 文件系统 数据处理 很厉害 处理大并发 Golang分布式、云计算软件工程师:盛大云 cdn 京东 消息推送 分布式文件系统 2、Golang的应用领域 区块链应用:区块链

    2024年02月15日
    浏览(65)
  • Go编程快闪之 logrus日志库

    战术卧倒 golang中常见的日志包是logrus, 根据logrus的胚子和我们的生产要求,给出一个生产可用的logrus实践姿势。 主谓宾定状补 logrus是一个结构化的、可插拔的、兼容golang标准log api的日志库。 快速过一下能力 支持对output=TTY增加颜色 内置JSONFormatter和TextFormatter(默认

    2024年02月06日
    浏览(36)
  • 【Go语言开发】将logrus日志送到elasticsearch构成elk体系

    这篇文章我们来讲讲怎么把logrus日志送到es。 使用的日志库是 github.com/sirupsen/logrus ,由于这个包中的日志对象是可以接入很多个hook的,所以我们可以使用hook来接入 elasticsearch 来操作 。 hook 就是钩子,当设置hook在某个点之后,hook会执行这个点之后异步进行。 比如让我们把

    2024年02月12日
    浏览(30)
  • Go学习第十八章——Gin日志与第三方工具Logrus

    1.1 快速入门 在使用Gin框架的过程中,日志是一个重要的组成部分,它可以记录框架和应用程序的运行情况,帮助开发者排查问题和监控应用程序的性能。Gin框架提供了方便的方法来设置和使用日志。 默认日志 Gin框架默认使用的是标准库的log包,将日志输出到控制台。可以通

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包