如何为 zap 全局记录器使用省略号

How to use ellipsis for zap global logger

您好,我正在尝试将 sugar logger 更改为全局更长时间我检查了我可以使用的可能字段,但我无法解决我的问题

例如在某些情况下我使用

                    zap.L().Debug("recv_cmd",
                        zap.String("user", c.GetString("user")),
                        zap.String("path", c.Request.URL.Path),
                    )

这是我在大多数情况下使用的,但我有一个不同的情况,就像这样

    params := make([]interface{}, 0, 20)
    params = append(params,
        "status", c.Writer.Status(),
        "method", c.Request.Method
        "path", c.Request.URL.Path,
        "ip", c.ClientIP(),
    )
    if len(body) > 0 {
        params = append(params, "body", string(body))
    }

所以在这种情况下,我没有在每个请求中都有一个正文,所以 params obj 对每个请求都没有相同的打击

我想要的是(这只是一个简单的演示,我知道 stringer 不会起作用)

    zap.L().Info("Info",
        zap.Stringer("request", params...),
    )

Logger.Info的定义是:

func (log *Logger) Info(msg string, fields ...Field)

zap.Stringer的定义是:

func Stringer(key string, val fmt.Stringer) Field

所以您的尝试存在很多问题:

  • 您不能将 []interface{} 传递给接受 fmt.Stringer 的函数(因为它没有实现接口)。
  • zap.Stringer returns 单个 Field 而您实际上是在尝试记录多个字段。

我认为您要完成的是 (playground)(但我不太清楚 params 是专门为日志记录还是出于其他原因创建的):

var params []zap.Field
params = append(params,
    zap.String("status", c.Status),
    zap.String("method", c.Method),
    zap.String("path", c.URL.Path),
    zap.String("ip", c.ClientIP),
)
if len(body) > 0 {
    params = append(params, zap.String("body", string(body)))
}
zap.L().Info("Info", params...)

如果这不能满足您的要求,请查看 encoders that zap provides (e.g. Any, Inline 等的多样性)。

注意:我已经稍微简化了你的结构(因为你没有包括细节)。如果您包含 minimum reproducible example(即您应该定义所使用的结构,但仅限于说明问题所需的程度),这样的问题会更容易回答。