簡體   English   中英

如何為 zap 全局記錄器使用省略號

[英]How to use ellipsis for zap global 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 對每個請求都沒有相同的打擊

我想要的是(這只是一個簡單的演示,我知道縱梁不起作用)

    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 的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 提供的各種編碼器(例如AnyInline等)。

注意:我已經稍微簡化了你的結構(因為你沒有包括細節)。 如果您包含一個最小可重復示例(即您應該定義使用的結構,但僅限於說明問題所需的程度),則更容易回答此類問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM