Go Programming Languages - 框架篇 - 日志 - Zap
Zap
zap是uber开发的一个日志框架,相较于logrus来说,性能要好一些,公司内部也会用zap来进行日志的格式规范。
类型
zap内置三种logger,对于NewProduction
生产环境中运用的logger,会设置日志级别为info(意味着debugger不会被输出),error及error以上会打印调用堆栈,会上报位置。
1 | logger := zap.NewExample() // 测试 |
zap的性能之所以比较好,很大一部分原因是因为日志里面需要显式地声明数据的类型,比如zap.Int
,zap.Namespace
。
1 | logger.Debug("hello") |
一般来说,不需要定制log的,直接使用logger := zap.NewDevelopment()
或
logger, _ := zap.NewProduction()
即可,但如果需要定制部分功能的,需要灵活操作的,则可以使用logger.New()
进行定制
1 | file, err := os.OpenFile(logFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModePerm) |
也可以使用第三方日志轮询库,如之前提到的rotatelogs
或者lumberjack
(https://github.com/natefinch/lumberjack.git)
zap与logrus一样,可以添加钩子
1 | logger := zap.New( |
上述代码在error级别及以上的日志可以在终端中打印错误的message,比如logger.Error("hello", zap.Namespace("china"), zap.Int("age", 18))
则会打印hello
。zap.AddStacktrace(zapcore.ErrorLevel)
允许在error
level及其以上打印调用堆栈
1 | 2025-04-13 23:03:20.000 ERROR io/zap_test.go:22 hello {"china": {"age": 18}} |
如果需要公共的field,可以使用logger.With
1 | logger = logger.With( |
打印出来的公共参数:
1 | 2025-04-13 23:09:44.954 INFO io/zap_test.go:21 hello {"system": {"T-uuid": "091dfb4e-c6a3-463e-9dd0-67c02521c7ee", "age": 18}} |
Go Programming Languages - 框架篇 - 日志 - Zap
https://jerry20000730.github.io/wiki/程序语言/Go/Go_framework_log2/