zap 简介

在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能:
能够将事件记录到文件中,而不是应用程序控制台
日志切割-能够根据文件大小、时间或间隔等来切割日志文件
支持不同的日志级别。例如INFO,DEBUG,ERROR等
能够打印基本信息,如调用文件/函数名和行号,日志时间等
它同时提供了结构化日志记录和printf风格的日志记录,它非常的快
根据Uber-go Zap的文档,它的性能比类似的结构化日志包更好——也比标准库更快

安装zap依赖

go get -u go.uber.org/zap

举例:

  • 通过调用 zap.NewProduction() / zap.NewDevelopment() 或者 zap.Example() 创建一个 Logger ;
  • 上面每个函数都创建一个 logger。 唯一的区别是它将记录的信息不同。例如:production logger 默认记录调用函数信息、日期和时间等;
  • 通过 Logger 调用 Info/Error 等;
  • 默认情况下日志都会打印到应用程序的 console界面.
package main

import (
    "go.uber.org/zap"
    "net/http"
)

var logger *zap.Logger

func main() {
    InitLogger()
    defer logger.Sync()
    simpleHttpGet("www.google.com")
    simpleHttpGet("http://www.google.com")
}

func InitLogger() {
    //func NewProduction(options ...Option) (*Logger, error) {
    logger, _ = zap.NewProduction()
}

//我们将建立一个到URL的HTTP连接,并将状态代码/错误记录到日志文件中
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结构格式 输出以下:
{"level":"error","ts":1646124280.6289413,"caller":"demo/main.go:26","msg":"Error fetching url..","url":"www.baidu.com","error":"Get \"www.baidu.com\": unsupported protocol scheme \"\"","stacktrace":"main.simpleHttpGet\n\tD:/all proj
ect/go/demo/main.go:26\nmain.main\n\tD:/all project/go/demo/main.go:13\nruntime.main\n\tD:/CodeSoftware/go/src/runtime/proc.go:255"}
{"level":"info","ts":1646124281.0494952,"caller":"demo/main.go:31","msg":"Success..","statusCode":"200 OK","url":"http://www.baidu.com"}

*/

作者:GoGo在努力
链接:https://blog.csdn.net/weixin_52690231/article/details/124879087