ZAP日志框架&lumberjack日志归档库的分析使用

本文详细解析了如何使用Zap日志框架创建logger,并对比了`sugar`和`logger`两种模式的性能与特性。通过分析`NewProduction`等四种模式,理解其内部配置逻辑,包括EncoderConfig、WriteSyncer和LevelEnabler。同时,介绍了如何结合Lumberjack库实现日志归档,包括配置文件路径、大小限制、备份数量和压缩选项。最后,展示了自定义日志格式和输出地址的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次我们从官方例程的角度出发,来分析学习如何让zap日志框架动起来

一、 Zap官方例程

1、加糖版

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)

2、正常高性能版

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),
)

官方例程中总共列举出了两种打log的方法,sugarlogger,这两种的区别是logger的性能优于sugar,但是sugar提供了格式化输出sugar.Infof("Failed to fetch URL: %s", url),而logger不支持,所以根据自己的需要,来选择两种不同的log方式。

1、新建一个logger对象

logger, _ := zap.NewProduction() 

通过zap.newxxx的方法来生成一个logger对象,我们在编程时可以看到,zap总共提供了三种默认的模式和一种自定义模式

//1、生产模式
func NewProduction(options ...Option) (*Logger, error)
//2、开发模式
func NewDevelopment(options ...Option) (*Logger, error)
//3、例子
func NewExample(options ...Option) *Logger
//4、自定义模式
func New(core zapcore.Core, options ...Option) *Logger

四种模式对比分析

1&2&3

因为1、2、3只有配置不同,其他都相同,所以合并分析
在这里插入图片描述
在源码中我们看到两种模式都调用了NewxxxConfig()的函数。
在这里插入图片描述
进入两个函数可以看到都返回了一个EncoderConfig结构体,3中的example方法其实也是一样的,把我们定义的Encoder返回回来。然后程序根据这些参数运行build函数
在这里插入图片描述
查看build函数,可以看到程序把上面的参数,以及另外两个sink和level带入了一个zapcore.Newcore的函数,根据函数名推断,应该是把这些配置写入zap的core代码中。

func NewCore(enc Encoder, ws WriteSyncer, enab LevelEnabler) Core

对于NewCore函数来说,现在第一次参数已经有了,我们需要设置第二个和第三个参数,第二个参数的意思就是写的方法,这个地方要和lumberjack日志归档挂钩,这里可以先只填入日志的保存地址,归档问题后面讨论。
第三个参数就是日志等级。
这样就实现了一个使用配置的logger对象了

4、自定义日志输出格式

根据上面的分析我们可以看出来,4与1、2、3相比较只是多了三步

  1. encoderConfig的配置(日志的输出格式)
  2. writerSyncer(日志的输出地址)
  3. level(日志的输出等级)
    所以我们模仿可以写出下列代码
func SetupZapLogger() *zap.Logger {
   encoder := getEncoder()
   writeSyncer := getWriteSyncer()
   return zap.New(zapcore.NewCore(encoder,writeSyncer,zapcore.DebugLevel))
}

func getEncoder() zapcore.Encoder {
	encoderConfig := zapcore.EncoderConfig{
		TimeKey:        "ts",
		LevelKey:       "level",
		NameKey:        "logger",
		CallerKey:      "caller",
		FunctionKey:    zapcore.OmitKey,
		MessageKey:     "msg",
		StacktraceKey:  "stacktrace",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.LowercaseLevelEncoder,
		EncodeTime:     zapcore.ISO8601TimeEncoder,
		EncodeDuration: zapcore.SecondsDurationEncoder,
		EncodeCaller:   zapcore.FullCallerEncoder,
		EncodeName: 	zapcore.FullNameEncoder,
	}

	return zapcore.NewConsoleEncoder(encoderConfig)
}

func getWriteSyncer()  zapcore.WriteSyncer {
   file, _ := os.Create("./zapLog.log")
   return zapcore.AddSync(file)
}

上述例子中我们使用ConsoleEncoder来生成了一个我们自定义的模板类型,这样自定义参数中的zapcore.Core参数就配置完成了。
将zapcore.Core的返回值带入zap.New就可以生成我们自定义的日志了

二、lumberjack日志归档库的分析使用

刚才在前面讲过,在配置writerSyncer的时候我们只添加了一个日志输出地址,但是如果要实现日志的归档分割的话,还需要使用lumberjack库。而lumberjack的配置需要添加到writerSyncer

hook := lumberjack.Logger{
		Filename: 		"./zapLog" +time.Now().Format(timeLayout) + ".log",
		MaxSize: 		1,//日志最大的大小(M)
		MaxBackups: 	2,//备份个数
		MaxAge: 		7,//最大保存天数(day)
		Compress: 		true,//是否压缩
		LocalTime: 		false,
	}

	return zapcore.NewMultiWriteSyncer(
		zapcore.AddSync(os.Stdout), //日志同时输出到控制台
		zapcore.AddSync(&hook)//配置的hook
		)

对于lumberjack的配置我们可以把它当做一个hook函数,我们把对应的配置填入其中,最后使用zapcore.NewMultiWriteSyncer将多个配置融合到一起返回即可。

### 如何在Mac Mini 4上启用HiDPI显示设置 对于配备M1芯片的Mac mini,在2K显示器上实现HiDPI功能并非易事,因为苹果官方仅针对4K及以上分辨率提供了原生的支持[^2]。然而,通过特定的技术手段仍然可以在较低分辨率的屏幕上获得更好的视觉体验。 #### 使用第三方工具或硬件解决方案 一种可行的办法是采用外部设备辅助的方式,比如使用4K HDMI环出采集卡来间接达到目的。这种方法涉及连接一个能够处理更高分辨率信号并将其转换回适合2K屏幕输出的装置。这不仅解决了兼容性问题,还使得操作系统误认为正在驱动的是高分辨率显示屏,从而允许调整缩放比例至更舒适的水平。 另外,也可以尝试安装某些开源项目提供的补丁程序或是配置文件,这些资源通常托管于GitHub等平台之上。不过需要注意的是,此类操作可能会带来一定的风险以及稳定性方面的影响,因此建议事先做好数据备份工作,并仔细阅读相关文档说明后再做决定[^3]。 #### 调整系统偏好设置中的显示选项 尽管直接修改注册表项或其他底层参数可能不是最推荐的做法,但在某些情况下适当调节macOS内置的显示设定也能起到一定效果。进入`系统偏好设置 -> 显示器`界面之后,用户可以选择不同的分辨率模式(标准 vs 缩放),其中后者允许自定义文字和其他UI元素的实际尺寸,以此改善可读性和舒适度[^1]。 ```bash # 打开终端应用后输入命令打开显示设置窗口 open /System/Library/PreferencePanes/Displays.prefPane/ ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个旅者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值