我在我的应用程序中使用LoggerMessage日志记录。我想像下面这样使用结构化日志记录。但我看不到一种方法。这在LoggerMessage中可能吗?
logger.LogInformation("Test {id}",id)
更新:
为了说明这一点,我想实现一些类似于ILogger的东西。使用单个logger示例,我们可以使用任意数量的占位符记录任何消息。
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扩展方法。
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
[LoggerMessage(1, LogLevel.Information, "Test {id}", EventName = "TestId")] public static partial void TestId(ILogger logger, string id);
2条答案
按热度按时间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扩展方法。
4xrmg8kj2#
它就在你链接的文档中,对吗?
在你的例子中,你可以定义一个logger消息,如下所示:
然后像这样使用它:
或者更好的是,像这样使用
LoggerMessage
属性: