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