.net LoggerMessage结构化日志记录

wwwo4jvm  于 2023-04-07  发布在  .NET
关注(0)|答案(2)|浏览(151)

我在我的应用程序中使用LoggerMessage日志记录。我想像下面这样使用结构化日志记录。但我看不到一种方法。这在LoggerMessage中可能吗?

logger.LogInformation("Test {id}",id)

更新:

为了说明这一点,我想实现一些类似于ILogger的东西。使用单个logger示例,我们可以使用任意数量的占位符记录任何消息。

oknwwptz

oknwwptz1#

我想实现一些类似于ILogger的东西。使用单个logger示例,我们可以使用任意数量的占位符记录任何消息。
然后使用ILogger。
LoggerMessage牺牲了可用性来换取性能。它通过预解析消息模板来实现这一点,这样你就不必在记录消息时承担解析的成本。这样做的结果是你必须为每个消息模板使用一个单独的LoggerMessage示例。
Logger扩展方法必须在每次写入日志消息时解析消息模板(命名的格式字符串)。LoggerMessage只需要在定义消息时解析一次模板。
-- https://learn.microsoft.com/en-us/dotnet/core/extensions/high-performance-logging
如果您同意这种折衷,请按照文档中的方式使用LoggerMessage。或者,更好的是,use the LoggerMessage attribute用于预编译的消息模板。
否则,请使用ILogger扩展方法。

4xrmg8kj

4xrmg8kj2#

它就在你链接的文档中,对吗?

s_processingPriorityItem = LoggerMessage.Define<WorkItem>(
    LogLevel.Information,
    new EventId(1, nameof(PriorityItemProcessed)),
    "Processing priority item: {Item}");

在你的例子中,你可以定义一个logger消息,如下所示:

private static Action<ILogger, string, Exception> _loggerMessage;

// ...

_loggerMessage = LoggerMessage.Define<string>(
    logLevel: LogLevel.Information,
    eventId: 1,
    formatString: "Test {id}");

然后像这样使用它:

_loggerMessage(_logger, id, null);

或者更好的是,像这样使用LoggerMessage属性:

[LoggerMessage(1, LogLevel.Information, "Test {id}", EventName = "TestId")]
public static partial void TestId(ILogger logger, string id);

相关问题