如何向 zap logger 的 .Error() 方法添加逻辑?

问题描述 投票:0回答:1

如果有这样的日志

logger, _ := zap.NewProduction()
logger.Error("hello")

我希望

.Error()
还可以执行其他操作,例如将带有特定消息的日志发送到电子邮件、仅将错误日志发送到电报机器人等

我尝试过钩子,但无法访问完整字段

    core := zapcore.RegisterHooks(logger.Core(), func(e zapcore.Entry) error {
        if e.Message == "[Recovery from panic]" {
            teleBot.SendMessageToAllChatIDs(fmt.Sprintf(
                "log_name: %s\nlevel: %s\nts: %s\nmsg: %s\nstack: %s",
                e.LoggerName,
                e.Level.String(),
                e.Time.Format(time.RFC1123),
                e.Message,
                e.Stack,
            ))
        }
        return nil
    })
go go-zap
1个回答
0
投票

您可以定义一个嵌入

*zap.Logger
的新结构,并在其上创建自定义错误方法,同时保留其所有方法。

type Logger struct {
    *zap.Logger
}

func NewLogger() *Logger {
    logger, _ := zap.NewProduction()
    return &Logger{
        logger,
    }
}

func (l *Logger) CustomError(msg string, fields ...zapcore.Field) {
    l.Error(msg, fields...)
    // custom logic
}

func main() {
    logger := NewLogger()
    logger.Error("hello")
    logger.CustomError("hello")
}
© www.soinside.com 2019 - 2024. All rights reserved.