【问题标题】:How to use ellipsis for zap global logger如何为 zap 全局记录器使用省略号
【发布时间】:2022-01-15 22:04:50
【问题描述】:

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

例如在某些情况下我使用

                    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 对每个请求的打击都不相同

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

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

【问题讨论】:

    标签: go go-zap


    【解决方案1】:

    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 返回单个 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...)
    

    如果这不起作用,请查看 zap 提供的各种encoders(例如AnyInline 等)。

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

    【讨论】: