如何为 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(即您应该定义所使用的结构,但仅限于说明问题所需的程度),这样的问题会更容易回答。
您好,我正在尝试将 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(即您应该定义所使用的结构,但仅限于说明问题所需的程度),这样的问题会更容易回答。