gpt4 book ai didi

c# - 如何将完整的对象添加到 Serilog Azure Table Storage 接收器,而该对象未在消息中写出?

转载 作者:行者123 更新时间:2023-11-30 22:52:52 24 4
gpt4 key购买 nike

所以,我现在正在尝试将 Serilog 包含在我的应用程序中,并且想知道以下内容:

是否可以添加一个对象,以便我的 Azure Tablestorage 接收器将其拾取并在相应的“数据”列中将其完全写入 JSON,而不将其添加到纯文本消息中?

我最初的做法是这样的:

m_logger.Information("{message} @{context}", message, context);

这就是我的问题的来源。这行得通,但我想让消息本身保持人类可读性,并将上下文中的元数据保存在单独的列中。

所以,我的第二次尝试现在看起来像这样:

using (LogContext.PushProperty("context", context))
{
m_logger.Information("{message}", message);
}

鉴于此,我将此添加到我的记录器配置中:.Enrich.FromLogContext()

现在这种方法有效了,该对象不再出现在消息中,实际上已添加到数据中,但不是将其完全写入 JSON,而是我最终在 Tablestorage 的数据列中得到的结果终点:

{"Timestamp":"2019-09-01T08:52:29.4835746+02:00","Level":"Information","MessageTemplate":"{message}","Properties":{"message":"Login happened","context":"MooMed.Core.DataTypes.Session.Context"}}

所以,这似乎只是在内部调用了 .ToString()

我现在想知道是否有一种内置的方法可以递归地对对象进行 jsonify,或者我是否必须(表面上)只是在我的 Context 中重写 .ToString() 类?

最佳答案

除非您明确告诉 Serilog 解构您的上下文数据,否则它将简单地使用 ToString 表示。在您最初的方法中,您通过使用 @ 符号告诉 Serilog 进行解构(尽管我假设您在花括号内而不是在外面使用它,即 {@context}而不是 @{context} 否则这不应该起作用。

当使用 LogContext 时,你可以告诉 Serilog 通过在使用属性时传递一个标志来解构对象:

using (LogContext.PushProperty("context", context, destructureObjects: true))
{
// ...
}

我假设您知道这会将上下文添加到 using block 内记录的所有消息,包括调用堆栈下方发生的任何消息。作为替代方案,如果您想更好地控制将上下文添加到哪些消息,您还可以创建一个使用此上下文数据丰富的临时记录器。这是使用 ILogger.ForContext 方法完成的:

var enrichedLogger = m_logger.ForContext("context", context, destructureObjects: true);

// Use `enrichedLogger` instead of `m_logger` whenever you want context data included.
enrichedLogger.Information("This message has context data attached!");
m_logger.Information("This message does not have context data attached.");

您还可以使用上面相同的方法为单个消息添加上下文:

m_logger.ForContext("context", context, destructureObjects: true)
.Information("This message has context data attached!")

关于c# - 如何将完整的对象添加到 Serilog Azure Table Storage 接收器,而该对象未在消息中写出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57743851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com