首页 > 其他分享 >Go 语言之 zap 日志库简单使用

Go 语言之 zap 日志库简单使用

时间:2023-06-17 11:13:19浏览次数:36  
标签:log url go Go 日志 main logger zap

Go 语言之 zap 日志库简单使用

默认的 Go log

log:https://pkg.go.dev/log

package main

import (
	"log"
	"os"
)

func init() {
	log.SetPrefix("LOG: ") // 设置前缀

	f, err := os.OpenFile("./log.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
	if err != nil {
		log.Fatalf("open log file failed with error: %v", err)
	}
	log.SetOutput(f) // 设置输出

	log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Llongfile)

	// const (
	// 	Ldate         = 1 << iota // 1 << 0 = 000000001 = 1
	// 	Ltime                     // 1 << 1 = 000000010 = 2
	// 	Lmicroseconds             // 1 << 2 = 000000100 = 4
	// 	Llongfile                 // 1 << 3 = 000001000 = 8
	// 	Lshortfile                // 1 << 4 = 000010000 = 16
	// 	...
	// )
}

func main() {
	log.Println("1234")

	// log.Fatalln("1234")

	// log.Panicln("1234")

	// log.Panic("1234")
	// log.Panicf("1234, %d", 5678)
}

log 包是一个简单的日志包。

Package log implements a simple logging package. It defines a type, Logger, with methods for formatting output. It also has a predefined 'standard' Logger accessible through helper functions Print[f|ln], Fatal[f|ln], and Panic[f|ln], which are easier to use than creating a Logger manually. That logger writes to standard error and prints the date and time of each logged message. Every log message is output on a separate line: if the message being printed does not end in a newline, the logger will add one. The Fatal functions call os.Exit(1) after writing the log message. The Panic functions call panic after writing the log message.

uber-go zap

loghttps://pkg.go.dev/log

github zaphttps://github.com/uber-go/zap

pkg zaphttps://pkg.go.dev/go.uber.org/zap#section-readme

Blazing fast, structured, leveled logging in Go.

安装

go get -u go.uber.org/zap

在性能良好但不是关键的上下文中,使用 SugaredLogger。它比其他结构化日志包快4-10倍,包括结构化和 printf 风格的 API。

logger, _ := zap.NewProduction()
defer logger.Sync() // flushes buffer, if any
sugar := logger.Sugar()
sugar.Infow("failed to fetch URL",
  // Structured context as loosely typed key-value pairs.
  "url", url,
  "attempt", 3,
  "backoff", time.Second,
)
sugar.Infof("Failed to fetch URL: %s", url)

当性能和类型安全至关重要时,请使用Logger。它甚至比SugaredLogger 更快,分配也少得多,但它只支持结构化日志记录。

logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("failed to fetch URL",
  // Structured context as strongly typed Field values.
  zap.String("url", url),
  zap.Int("attempt", 3),
  zap.Duration("backoff", time.Second),
)

zap文档https://pkg.go.dev/go.uber.org/zap#section-readme

Logger 简单使用

package main

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

// 定义一个全局 logger 实例
// Logger提供快速、分级、结构化的日志记录。所有方法对于并发使用都是安全的。
// Logger是为每一微秒和每一个分配都很重要的上下文设计的,
// 因此它的API有意倾向于性能和类型安全,而不是简便性。
// 对于大多数应用程序,SugaredLogger在性能和人体工程学之间取得了更好的平衡。
var logger *zap.Logger

func main() {
	// 初始化
	InitLogger()
	// Sync调用底层Core的Sync方法,刷新所有缓冲的日志条目。应用程序在退出之前应该注意调用Sync。
	// 在程序退出之前,把缓冲区里的日志刷到磁盘上
	defer logger.Sync()
	simpleHttpGet("www.baidu.com")
	simpleHttpGet("http://www.baidu.com")
}

func InitLogger() {
	// NewProduction构建了一个合理的生产Logger,它将infollevel及以上的日志以JSON的形式写入标准错误。
	// It's a shortcut for NewProductionConfig().Build(...Option).
	logger, _ = zap.NewProduction()
}

func simpleHttpGet(url string) {
	// Get向指定的URL发出Get命令。如果响应是以下重定向代码之一,则Get跟随重定向,最多可重定向10个:
	//	301 (Moved Permanently)
	//	302 (Found)
	//	303 (See Other)
	//	307 (Temporary Redirect)
	//	308 (Permanent Redirect)
	// Get is a wrapper around DefaultClient.Get.
	// 使用NewRequest和DefaultClient.Do来发出带有自定义头的请求。
	resp, err := http.Get(url)
	if err != nil {
		// Error在ErrorLevel记录消息。该消息包括在日志站点传递的任何字段,以及日志记录器上积累的任何字段。
		logger.Error(
			"Error fetching url..",
			zap.String("url", url), // 字符串用给定的键和值构造一个字段。
			zap.Error(err))         // // Error is shorthand for the common idiom NamedError("error", err).
	} else {
		// Info以infollevel记录消息。该消息包括在日志站点传递的任何字段,以及日志记录器上积累的任何字段。
		logger.Info("Success..",
			zap.String("statusCode", resp.Status),
			zap.String("url", url))
		resp.Body.Close()
	}
}

运行

Code/go/zap_demo via 

标签:log,url,go,Go,日志,main,logger,zap
From: https://www.cnblogs.com/QiaoPengjun/p/17487169.html

相关文章

  • golang之context
    context用来解决goroutine之间退出通知、元数据传递的功能。 context使用起来非常方便。源码里对外提供了一个创建根节点context的函数:funcBackground()Context background是一个空的context,它不能被取消,没有值,也没有超时时间。有了根节点context,又提供了四个函数创......
  • golang之fmt格式化
    常用fmt中用于格式化的占位符 普通占位符占位符说明举例输出%v相应值的默认格式。Printf("%v",people){zhangsan},%+v打印结构体时,会添加字段名Printf("%+v",people){Name:zhangsan}%#v......
  • golang之errors包
    errors包常用方法funcUnwrap(errerror)error//获得err包含下一层错误funcIs(err,targeterror)bool//判断err是否包含targetfuncAs(errerror,targetinterface{})bool//判断err是否为target类型   自定义错误信息errors.New("......
  • golang之jwt
    golang-jwt是go语言中用来生成和解析jwt的一个第三方库。本文中使用目前最新的v5版本。安装goget-ugithub.com/golang-jwt/jwt/v5 在代码中引用import"github.com/golang-jwt/jwt/v5" 结构体假设jwt原始的payload如下,username,exp为过期时间,nbf为生效时间,iat为签发时间。第一......
  • 如何调试golang程序
    在Golang中进行调试和性能分析是非常重要的,在开发过程中发现问题并及时修复可以极大地提高代码质量和效率。介绍两种常用的调试工具,dlv和pprof,以及如何使用它们进行代码调试和性能分析。一、dlv调试工具1.安装在使用dlv前需要先安装,可以通过以下命令进行安装:goget-ugithub.......
  • 仿喜茶GO小程序前端模板源码,奶茶店微信小程序源码
    本项目包含:首页点单喜茶百货百货详情历史订单我的积分商城积分商城详情页我的-微信一键登录我的-成为星球会员我的-个人资料我的-钱包我的-阿喜有礼会员码任务中心下载地址点击下载仿喜茶小程序源码运行效果图 ......
  • Go Redis 管道和事务之 go-redis
    GoRedis管道和事务之go-redisGoRedis管道和事务官方文档介绍Redispipelines(管道)允许一次性发送多个命令来提高性能,go-redis支持同样的操作,你可以使用go-redis一次性发送多个命令到服务器,并一次读取返回结果,而不是一个个命令的操作。GoRedis管道和事务:https://red......
  • 6月有奖征文挑战,ZEGO开发者社区首季活动报名入口!
     前言哈喽开发者们:ZEGO即构科技作为一家20年技术积累的音视频云服务商,已经为全球200+个国家的企业服务,单日通话时长突破30亿+分钟,现下即构开发者社区举办首期征文活动!本次征文活动围绕音视频开发系列,从采集到播放每个环节的内容均可投稿,期待大家发挥创造力与想象力~我......
  • golang 语法糖
    golang语法糖在Go语言中,nums...是一种语法糖,用于将切片nums展开为一个个独立的参数。在函数调用中,如果你有一个切片nums,你可以使用nums...将切片展开为独立的元素,作为函数的参数传递。以下是一个示例说明nums...的使用:gofuncsum(nums...int)int{total:......
  • 镜像golang 标准库文档
    缘起:查golang文档时,访问https://pkg.go.dev/std网站有点慢,就想做个离线版的修改日期:2023-06-16mirrorstdlibwget-c-t3-r-l1-np-p-khttps://pkg.go.dev/stdstatic/frontend/*rename.css@*->.cssreplacetextbytextforeverhttps://pkg.go.dev.......