-1

こんにちは、シュガーロガーをグローバルに変更しようとしています。使用できるフィールドを確認しましたが、問題を解決できませんでした

たとえば、私が使用するいくつかの状況で

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

これは私がほとんどの場合に使用するものですが、これが好きな別のケースが1つあります

    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.StringerField複数のフィールドを実際にログに記録しようとしているのに、単一を返します。

あなたが達成しようとしていると思うのは(遊び場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 に答える