打印日志怎样不打base64打印出来_Golang优秀源码走读---zap日志(一)

本文深入探讨了Golang zap日志组件的构造和使用,包括Logger结构体、配置选项如Level、Development模式、Encoding,以及日志输出的方法如Debug、Info等。zap强调结构化日志,提高性能,支持多种配置和定制,如自定义编码器、输出路径和日志级别控制。文章还介绍了zap.Core的核心作用,为后续理解zap的实现打下基础。
摘要由CSDN通过智能技术生成

28b06750c5a65fdfc9502aeae5234892.png

好长时间没有写点干货出来了,偷懒太久了23333.

前段时间隔壁组小姐姐又陷入了日志组件的水深火热中,emmm,毕竟还是我当年学go语言时写的第一个项目,留的坑太深,设计也太差。(默默心疼下小姐姐)


言归正传,ServiceComb中的日志组件并不是自研的,从配套go的1.12版本开始,使用了uber开源出来的zap日志组件。虽然不属于ServiceComb,但是不知道为什么还是强行放在了这个系列里,强行从ServiceComb学zap吧,学习下zap的设计模式以及代码实现的细节,也算是对zap代码走读的一个指导。

先转一张网上流传很广泛的图

ad1b3b273a43b5a8d2050056997fc42f.png

这张图大致描述了zap中有哪些模块,但是还体现不出来zap的精髓,我们就按照上图,从对外接口向下分析,学习zap中的实现。

既然是打印日志,一定需要一个接口或者结构体来实现日志打印的功能,在zap中,对外呈现的实现日志打印方法的是Logger结构体而不是接口,这个其实与常见的用接口定义API的模式有点不同。在zap的设计理念中,Logger虽然是结构体,但Logger中的core却是接口,这个接口可以有不同的实现,core中的方法才是真正实现日志的编码和输出的地方。而zap.core和Logger几乎是完全解耦的,也为我们按模块学习zap的实现提供了便利。

// A Logger provides fast, leveled, structured logging. All methods are safe
// for concurrent use.
//
// The Logger is designed for contexts in which every microsecond and every
// allocation matters, so its API intentionally favors performance and type
// safety over brevity. For most applications, the SugaredLogger strikes a
// better balance between performance and ergonomics.
type Logger struct {
    
	core zapcore.Core

	development bool
	name        string
	errorOutput zapcore.WriteSyncer

	addCaller bool
	addStack  zapcore.LevelEnabler

	callerSkip int
}

稍后我们再回过头看Logger中的方法,先探究下如何构造一个Logger,zap提供了两类构造Logger的方式,一类是使用了建造者模式的Build方法,一类是接收Option参数的New方法,这两类方法提供的能力完全相同,只是给用户提供了不同的选择。先看看建造者模式的实现。

在config.go文件中,有以下结构体和方法:

499c21e455c65ee6eeca659bdb609b2d.png

Config这个结构体是创建一个Logger的基础。

// Config offers a declarative way to construct a logger. It doesn't do
// anything that can't be done with New, Options, and the various
// zapcore.WriteSyncer and zapcore.Core wrappers, but it's a simpler way to
// toggle common options.
//
// Note that Config intentionally supports only the most common options. More
// unusual logging setups (logging to network connections or message queues,
// splitting output between multiple files, etc.) are possible, but require
// direct use of the zapcore package. For sample code, see the package-level
// BasicConfiguration and AdvancedConfiguration examples.
//
// For an example showing runtime log level changes, see the documentation for
// AtomicLevel.
type Config struct {
    
	// Level is the minimum enabled logging level. Note that this is a dynamic
	// level, so calling Config.Level.SetLevel will atomically change the log
	// level of all loggers descended from this config.
	Level AtomicLevel `json:"level" yaml:"level"`
	// Development puts the logger in development mode, which changes the
	// behavior of DPanicLevel and takes stacktraces more liberally.
	Development bool `json:"development" yaml:"development"`
	// DisableCaller stops annotating logs with the calling function's file
	// name and line number. By default, all logs are annotated.
	DisableCaller bool `json:"disableCaller" yaml:"disableC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值