首頁 >後端開發 >Golang >如何在 slog 記錄器中傳遞結構並自動使用其欄位?

如何在 slog 記錄器中傳遞結構並自動使用其欄位?

WBOY
WBOY轉載
2024-02-06 08:10:03440瀏覽

如何在 slog 记录器中传递结构并自动使用其字段?

問題內容

我正在使用 slog 套件。我面臨的問題是,當我在結構中擁有大部分參數時,我必須向其傳遞太多參數。

有沒有辦法修改處理程序以使用這個結構? 就像你可以在 python 中執行的操作一樣,發送一個字典或物件作為額外的內容,然後從中提取所需的參數。

現在我有這個:

g.l.Log(
    context.TODO(),
    slog.LevelInfo,
    "Sending request to server.",
    "Destination", m.route.destination,
    "Protocol", m.route.protocol,
    "Service Identifier", m.route.serID,
    "Session ID", m.GetIdentifier(),
    "Client Connection", client.RemoteAddr().String(),
    "Server Connection", destination.RemoteAddr().String(),
)

我想做這樣的事情:

g.l.Log(
    context.TODO(),
    slog.LevelInfo,
    "Sending request to server.",
    "message", m,
    "Client Connection", client.RemoteAddr().String(),
    "Server Connection", destination.RemoteAddr().String(),
)

我該怎麼做?


正確答案


我找到了這個問題的答案。

我將 slog 記錄器嵌入到我的自訂記錄器中。

type Logger struct {
    *slog.Logger
}

我還為我的結構編寫匯出函數,如下所示:

func (m *GatewayMessage) LoggableData() *xlog.RequestData {
    return &xlog.RequestData{
        Request:             m.Request.String(),
        OriginalRequest:     m.OriginalRequest,
    }
}

func (m *GatewayMessage) PopulateGeneralLogData() []any {
    logData := m.LoggableData()
    return []any{
        "Request", logData.Request,
        "OriginalRequest", logData.OriginalRequest,
    }
}

然後我寫一個輔助函數,取得此 GatewayMessage 作為參數以及任意數量的參數,例如 slog Logger 的 Log 函數。 這是調試功能的例子:

func LogDebug(l *xlog.Logger, ctx context.Context, msg string, m *GatewayMessage, args ...any) {
    var generalLogData []any = make([]any, 0)
    if m != nil {
        generalLogData = m.PopulateGeneralLogData()
    }
    args = append(args, generalLogData...)
    l.RuntimeDebug(
        ctx,
        msg,
        args...,
    )
}

我還使用名為 RuntimeDebug 的接收器在所有日誌中註入名為 Scope 的參數。

func (l *Logger) RuntimeDebug(ctx context.Context, msg string, args ...any) {
    args = append(args, "Scope", "Runtime")
    l.Logger.Log(
        ctx,
        slog.LevelDebug,
        msg,
        args...,
    )
}

以上是如何在 slog 記錄器中傳遞結構並自動使用其欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除