卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34089本站已运行391

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

如何在 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...,
    )
}
卓越飞翔博客
上一篇: 我无法在我的语音识别代码中生成 google/youtube 的研究结果
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏