开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 26天,点击查看活动详情
前言
标准库log包功能有限,不能满足日志级别的指定(info|warn|error等)、日志格式化操作,以及日志文件切割等能力。在实际项目开发中,会选择使用第三方日志库zap来做支持。
log包回顾
设置日志文件路径、简单日志格式、日志前缀。然后可使用Print系列
(Print|Printf|Println)、Fatal系列
(Fatal|Fatalf|Fatalln)、Panic系列
(Panic|Panicf|Panicln)等相关函数,进行日志的打印输出。
代码示例:
func init() {
//设置日志文件
file, err := os.OpenFile("./07_package/09_logtest1.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0655)
if err != nil {
fmt.Println("os.OpenFile err:", err)
return
}
//defer file.Close()
log.SetOutput(file)
}
func main() {
log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile)
log.SetPrefix("[logger]")
log.Println("logger first see")
log.Fatal("logger first fatal")
}
日志输出:
[logger]2023/02/27 22:21:26.229873 09_log.go:25: logger first see
[logger]2023/02/27 22:21:26.230026 09_log.go:26: logger first fatal
Zap初识
Zap是非常快的、结构化的,分日志级别的Go日志库
安装:go get -u https://github.com/uber-go/zap
Zap提供了两种类型的日志记录器:Logger
和Sugared 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() {
logger, _ = zap.NewProduction()
defer logger.Sync()
url := "http://www.baidu.com"
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()
}
}
输出日志:
{"level":"info","ts":1677511583.702923,"caller":"07_package/10_zap.go:43","msg":"Success..","statusCode":"200 OK","url":"http://www.baidu.com"}
Sugared Logger
使用Sugared Logger来实现相同的功能
- 大部分的实现基本都相同。
- 唯一的区别是,我们通过调用主logger的
. Sugar()
方法来获取一个SugaredLogger
。 - 然后使用
SugaredLogger
以printf
格式记录语句
代码示例:
var sugarLogger *zap.SugaredLogger
func main() {
logger, _ = zap.NewProduction()
sugarLogger = logger.Sugar()
defer sugarLogger.Sync()
url := "http://www.baidu.com"
resp, err := http.Get(url)
if err != nil {
sugarLogger.Error("Error fetching url..", zap.String("url", url), zap.Error(err))
} else {
sugarLogger.Info("Success..", zap.String("statusCode", resp.Status), zap.String("url", url))
resp.Body.Close()
}
}
输出日志:
{"level":"info","ts":1677511583.743777,"caller":"07_package/10_zap.go:29","msg":"Success..{statusCode 15 0 200 OK <nil>} {url 15 0 http://www.baidu.com <nil>}"}
如果本文对你有帮助,欢迎点赞收藏加关注,如果本文有错误的地方,欢迎指出!