go - 如何测试从自定义配置构建的 zap Logger 的日志记录?

标签 go logging go-zap

我有一个从自定义配置(即 config.Build())生成的 Zap 记录器。我想通过在测试方法中调用例如 logger.Info() 来测试记录器,并断言结果以查看它是否符合配置集。我怎样才能做到这一点?

代码示例:

func GetLogger() *zap.Logger{
 config := &zap.Config{
  Encoding: "json",
  Level: zap.NewAtomicLevelAt(zapcore.InfoLevel),
  OutputPaths: []string{"stdout"},
  ErrorOutputPaths: []string{"stdout"},
  EncoderConfig: zapcore.EncoderConfig{
   MessageKey: "@m",
   LevelKey:    "@l",
   EncodeLevel: zapcore.CapitalLevelEncoder,
   TimeKey:    "@t",
   EncodeTime: zapcore.EpochMillisTimeEncoder,
   CallerKey:     "@c",
   EncodeCaller:  zapcore.ShortCallerEncoder,
   StacktraceKey: "@x",
  },
 }
 return config.Build()
}

最佳答案

zap 有一个特殊的 zaptest/observer 模块,用于单元测试:

package test

import (
    "testing"

    "go.uber.org/zap"
    "go.uber.org/zap/zaptest/observer"
)

func setupLogsCapture() (*zap.Logger, *observer.ObservedLogs) {
    core, logs := observer.New(zap.InfoLevel)
    return zap.New(core), logs
}

func Test(t *testing.T) {
    logger, logs := setupLogsCapture()
    
    logger.Warn("This is the warning")
    
    if logs.Len() != 1 {
        t.Errorf("No logs")
    } else {
        entry := logs.All()[0]
        if entry.Level != zap.WarnLevel || entry.Message != "This is the warning" {
            t.Errorf("Invalid log entry %v", entry)
        }
    }
}

关于go - 如何测试从自定义配置构建的 zap Logger 的日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52734529/

相关文章:

docker - 无法(退出状态 66)在基于 Windows 的 Docker 容器中下载 Golang 包

unit-testing - Golang - 多个包的有效测试

python-3.x - Airflow {logging_mixin.py :84} WARNING - --- Logging error --

go - 如何使用 go.uber.org/zap lib 以不同的日志级别打印不同的颜色,并根据日志级别将日志附加到不同的文件?

go - 如何为滚动文件系统日志配置 uber-go/zap 记录器?

用于实现 RTSP 客户端的 Golang 库

Goland 读取每行命令输出的衬垫

php - 确定用于评估预处理的 PHP.INI 值的运行时源?

laravel - 每次运行作业时都会有单独的日志文件 laravel

go - 使用zap时如何自定义日志格式?