当前位置:网站首页>Go 语言中的 logger 和 zap 日志库
Go 语言中的 logger 和 zap 日志库
2022-04-23 04:14:00 【沉淅尘】
Go 语言中的 logger 和 zap 日志库
在软件开发过程中,需要进行关键日志记录,便于后期的审计和排错。
一个好的日志记录器应该具备以下功能:
- 日志写入到文件而不是控制台输出
- 日志切割-按文件大小、时间或间隔等切割日志文件
- 支持不同的日志级别,如:INFO,DEBUG,ERROR 等
- 能打印基本信息,如调用文件/函数名和行号,日志时间等
Go Logger
配置日志输出文件
func SetupLogger() {
logFileLocation, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0744)
log.SetOutput(logFileLocation)
}
编写示例,建立一个到 URL 的 HTTP 连接,记录状态码/错误记录到日志文件
func simpleHttpGet(url string) {
resp, err := http.Get(url)
if err != nil {
log.Printf("Error fetching url %s : %s", url, err.Error())
} else {
log.Printf("Status Code for %s : %s", url, resp.Status)
resp.Body.Close()
}
}
main 函数,执行示例
func main() {
SetupLogger()
simpleHttpGet("www.google.com")
simpleHttpGet("http://www.google.com")
}
看到 test.log 文件被创建,并且记录了下面的内容
2022/04/22 11:33:52 Error fetching url www.google.com : Get "www.google.com": unsupported protocol scheme ""
2022/04/22 11:33:53 Status Code for http://www.google.com : 200 OK
Zap Logger
go get -u go.uber.org/zap
Zap 提供两种类型的日志记录器- Sugared Logger 和 Logger
在性能很好但不是很关键的上下文中,使用 SugaredLogger。它比其他结构化日志记录包快 4-10 倍,并且支持结构化和 printf 风格的日志记录
在每一微秒和每一次内存分配都很重要的上下文中,使用 Logger。甚至比 SugaredLogger 更快,内存分配次数也更少,但它只支持强类型的结构化日志记录
Logger
- 通过调用
zap.NewProduction()/zap.NewDevelopment()或者zap.Example()创建一个Logger - 上面的每一个函数都将创建一个
logger。唯一的区别在于它将记录的信息不同。例如production logger默认记录调用函数信息、日期和时间等 - 通过
Logger调用Info/Error等 - 默认情况下日志都会打印到应用程序的
console界面
var logger *zap.Logger
func main() {
InitLogger()
defer logger.Sync()
simpleHttpGet("www.google.com")
simpleHttpGet("http://www.google.com")
}
func InitLogger() {
logger, _ = zap.NewProduction()
}
func simpleHttpGet(url string) {
resp, err := http.Get(url)
if err != nil {
logger.Error(
"Error fetching url..",
zap.String("url", url),
zap.Error(err))
} else {
logger.Info("Success..",
zap.String("statusCode", resp.Status),
zap.String("url", url))
resp.Body.Close()
}
}
Sugared Logger
- 大部分的实现基本都相同
- 唯一的区别是,我们通过调用主
logger的.Sugar()方法来获取一个SugaredLogger - 然后使用
SugaredLogger以printf格式记录语句
var sugarLogger *zap.SugaredLogger
func main() {
InitLogger()
defer sugarLogger.Sync()
simpleHttpGet("www.google.com")
simpleHttpGet("http://www.google.com")
}
func InitLogger() {
logger, _ := zap.NewProduction()
sugarLogger = logger.Sugar()
}
func simpleHttpGet(url string) {
sugarLogger.Debugf("Trying to hit GET request for %s", url)
resp, err := http.Get(url)
if err != nil {
sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err)
} else {
sugarLogger.Infof("Success! statusCode = %s for URL %s", resp.Status, url)
resp.Body.Close()
}
}
定制 Logger 记录到文件中
- Encoder: 编码器(如何写入日志)。我们将使用开箱即用的
NewJSONEncoder(),并使用预先设置的 - WriterSyncer: 指定日志将写到哪里去。我们使用
zapcore.AddSync()函数并且将打开的文件句柄传进去 - Log Level: 哪种级别的日志将被写入
var logger *zap.Logger
func main() {
InitLogger()
defer logger.Sync()
simpleHttpGet("www.google.com")
simpleHttpGet("http://www.google.com")
}
func InitLogger() {
writeSyncer := getLogWriter()
encoder := getEncoder()
core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)
logger := zap.New(core)
// sugarLogger = logger.Sugar()
}
func getEncoder() zapcore.Encoder {
return zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
}
func getLogWriter() zapcore.WriteSyncer {
file, _ := os.Create("./test.log")
return zapcore.AddSync(file)
}
func simpleHttpGet(url string) {
resp, err := http.Get(url)
if err != nil {
logger.Error(
"Error fetching url..",
zap.String("url", url),
zap.Error(err))
} else {
logger.Info("Success..",
zap.String("statusCode", resp.Status),
zap.String("url", url))
resp.Body.Close()
}
}
将 JSON Encoder 更改为普通的 Log Encoder,只需要将 NewJSONEncoder() 更改为NewConsoleEncoder()
参考
[1] 在Go语言项目中使用Zap日志库(李文周)
[2] Go Logger
[3] Go zap
版权声明
本文为[沉淅尘]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_41335923/article/details/124355035
边栏推荐
- 记录一下盲注脚本
- Machine translation baseline
- Understand the gut organ axis, good gut and good health
- 一个函数秒杀2Sum 3Sum 4Sum问题
- How Zotero quotes in word jump to references / hyperlink
- [mapping program design] coordinate inverse artifact v1 0 (with C / C / VB source program)
- The super large image labels in remote sensing data set are cut into specified sizes and saved into coco data set - target detection
- C语言 字符常量
- 基于PHP的代步工具购物商城
- Retrieval question answering system baseline
猜你喜欢

基于PHP的代步工具购物商城

Summary of knowledge map (3)

A function second kill 2sum 3sum 4sum problem
![[AI vision · quick review of robot papers today, issue 31] Fri, 15 APR 2022](/img/f5/3cd3abee1480dc2cefa7f35696631b.png)
[AI vision · quick review of robot papers today, issue 31] Fri, 15 APR 2022

Xshell、Xftp连接新创建的Unbutu系统虚拟机全流程

中国移动日赚2.85亿很高?其实是5G难带来更多利润,那么钱去哪里了?

【ICCV 2019】MAP-VAE:Multi-Angle Point Cloud-VAE: Unsupervised Feature Learning for 3D Point Clouds..

【NeurIPS 2019】Self-Supervised Deep Learning on Point Clouds by Reconstructing Space

小红书被曝整体裁员20%,大厂之间内卷也很严重
![[AI vision · quick review of robot papers today, issue 29] Mon, 14 Feb 2022](/img/a3/88b20f3e1be702f580169400e417f4.png)
[AI vision · quick review of robot papers today, issue 29] Mon, 14 Feb 2022
随机推荐
Who will answer the question?
Summary of knowledge map (3)
智能电子秤全国产化电子元件推荐方案
Man's life
ERROR: Could not find a version that satisfies the requirement win32gui
单极性非归零NRZ码、双极性非归零NRZ码、2ASK、2FSK、2PSK、2DPSK及MATLAB仿真
作为一名码农,女友比自己更能码是一种什么体验?
现货黄金基本介绍
Introduction to Cortex-M3 register set, assembly language and C language interface
Machine translation baseline
【测绘程序设计】坐标反算神器V1.0(附C/C#/VB源程序)
C语言: 指针的进阶
[AI vision · quick review of today's sound acoustic papers, issue 3] wed, 20 APR 2022
The difference between lists, tuples, dictionaries and collections
C language character constant
Leetcode->1 两数之和
Zotero6. Version 0 quicklook cannot be used / Chinese garbled code will not be displayed
Xiaomi, qui a établi le plus grand volume de ventes de téléphones portables domestiques sur le marché d'outre - mer, se concentre de nouveau sur le marché intérieur
The latest price trend chart and trading points of London Silver
小红书被曝整体裁员20%,大厂之间内卷也很严重