我正在使用 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中文網其他相關文章!