当前位置:网站首页>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
边栏推荐
- Retrieval question answering system baseline
- Add the compiled and installed Mysql to the path environment variable
- 兼容NSR20F30NXT5G的小体积肖特基二极管
- Stm32f4 MCU ADC sampling and FFT of ARM-DSP Library
- Let matlab2018b support the mex configuration of vs2019
- 什么是软件验收测试,第三方软件检测机构进行验收测试有什么好处?
- [latex] formula group
- Chlamydia infection -- causes, symptoms, treatment and Prevention
- TreeSet after class exercises
- [echart] Introduction to echart
猜你喜欢
[AI vision · quick review of robot papers today, issue 31] Fri, 15 APR 2022
Understand the gut organ axis, good gut and good health
QT program integration easyplayer RTSP streaming media player screen flicker what is the reason?
Overview of knowledge map (II)
Cortex-M3寄存器组、汇编语言与C语言的接口介绍
The great gods in acmer like mathematics very much
[latex] formula group
/etc/bash_completion.d目录作用(用户登录立刻执行该目录下脚本)
Express中间件①(中间件的使用)
Let matlab2018b support the mex configuration of vs2019
随机推荐
【ICCV 2019】MAP-VAE:Multi-Angle Point Cloud-VAE: Unsupervised Feature Learning for 3D Point Clouds..
Installation and configuration of MinGW under win10
减治思想——二分查找详细总结
Xiaohongshu was exposed to layoffs of 20% as a whole, and the internal volume among large factories was also very serious
作为一名码农,女友比自己更能码是一种什么体验?
[latex] formula group
Second kill all interval related problems
[string] ranking of country names ----- problem solving notes
TreeSet after class exercises
MYSQL去重方法汇总
【测绘程序设计】坐标方位角推算神器(C#版)
STM32单片机ADC规则组多通道转换-DMA模式
STM32 MCU ADC rule group multi-channel conversion DMA mode
什么是软件验收测试,第三方软件检测机构进行验收测试有什么好处?
一个函数秒杀2Sum 3Sum 4Sum问题
Single chip microcomputer serial port data processing (2) -- ucosiii + cyclic queue receiving data
顺序表的基本操作
记录一下盲注脚本
Let matlab2018b support the mex configuration of vs2019
AI CC 2019 installation tutorial under win10 (super detailed - small white version)