在我的Go应用程序中,我将错误登录转移到了一个单独的功能中

package logging

import "github.com/rs/zerolog"

func LogError(logger zerolog.Logger, err error) {
    logger.Error().Err(err).Msg("")
}

并希望创建一个小型测试以确保引发了错误日志(log)事件.出于再现的目的,我不会显示测试文件,而是显示来自操场https://go.dev/play/p/Jnyz51JemTh的代码

package main

import (
    "errors"
    "fmt"

    "github.com/rs/zerolog"
)

func main() {
    logger := zerolog.Nop()
    testError := errors.New("test error")
    logHook := &logHook{}

    logger.Hook(logHook)

    LogError(logger, testError)

    amountOfLogEvents := len(logHook.logEvents)

    fmt.Printf("预期的日志(log)事件数量:1\nActual amount of log events: %v", amountOfLogEvents)

    // TODO inspect logHook.logEvents[0]
}

func LogError(logger zerolog.Logger, err error) {
    logger.Error().Err(err).Msg("")
}

type logHook struct {
    logEvents []zerolog.Event
}

func (logHook *logHook) Run(logEvent *zerolog.Event, level zerolog.Level, message string) {
    logHook.logEvents = append(logHook.logEvents, *logEvent)
}

您应该会看到输出

预期的日志(log)事件数量:1

日志(log)事件的实际数量:0

我想我可以创建一个定制的钩子来捕捉事件并判断它.不幸的是,我正在与两件事作斗争

  • 正在判断错误、消息...从一张zerolog.Event英镑开始,对我来说不起作用.我找不到任何与此对应的字段或函数
  • 测试失败是因为amountOfLogEvents为空,尽管我预计它会有一个事件

你知道哪里出了问题吗?知道如何修复吗?

推荐答案

  1. Nop不能应用挂钩,并且Logger不是指针
// Nop returns a disabled logger for which all operation are no-op.
func Nop() Logger {
    return New(nil).Level(Disabled)
}
// Hook returns a logger with the h Hook.
func (l Logger) Hook(h Hook) Logger {
    l.hooks = append(l.hooks, h)
    return l
}
  1. 出于同样的原因,你的logHook应该是
func (logHook *logHook) Run(logEvent *zerolog.Event, level zerolog.Level, message string) {
    logHook.logEvents = append(logHook.logEvents, *logEvent)
}

所以我们得到了这个,并且可以通过测试,见playground

logger := zerolog.New(os.Stdout)
logHook := &logHook{}
logger = logger.Hook(logHook)

Go相关问答推荐

在Golang中,@LATEST和@UPGRADE特殊查询有什么不同?

链自定义GRPC客户端拦截器/DialOptions

JetBrains Goland,禁用突出显示测试文件

提供的client_secret与此帐户上任何关联的SetupIntent都不匹配

Go 中的sync.Cond 与 Wait 方法

htmx 表单 + gin 无法正确读取请求正文

当我的 go build 成功时,如何修复我的 docker build 失败? Dockerfile 包括 go mod 下载

go - 仅在函数即将返回错误时清理资源

Golang 中具体类型的错误片段

有没有办法约束(通用)类型参数?

致命错误:找不到由 zergon321/reisen 引起的libavcodec/avcodec.h文件

如何根据 Go 中第二次出现的分隔符拆分字符串?

Golang Getrlimit 返回与 ulimit 不同的值

如何通过组合来自不同包的接口来创建接口?

使用 image/jpeg 编码导致图像饱和/错误像素

如何从 tinygo webassembly 目标返回对象

使用正则表达式拆分具有相同标题的数据块

如何在gorm中处理多个查询

如何解决在mac m1中运行gcc失败退出状态1?

如何动态解析 Go Fiber 中的请求正文?