-1

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

例如在某些情况下我使用

                    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...),
    )

4

1 回答 1

0

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 提供的各种编码器Any(例如,Inline等)。

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

于 2021-12-12T03:40:01.403 回答