注意:我使用的是.NET 8和
Microsoft.Extensions.Telemetry.Abstractions
,所以LoggerMessageAttribute
触发的源生成器与旧的不一样...
我的目标是获得.NET高性能日志记录的好处,并使用Serilog的高级解构功能来增强日志结构。
(一个有效的答案可能是,同时满足这两个要求是不可能的,并且 Serilog 解构不适合高性能场景,但是在这种情况下,问题是:我们能否使其可配置哪个需求想要我优先考虑使用相同的代码库,而不是重写数以万计的日志代码行)
所以代替:
// Serilog automatically and in a configurable way destructures forecast
_logger.LogInformation("Generated forecast {@forecast}", forecast);
我有以下方法:
[LoggerMessage(Level = LogLevel.Information, Message = "Generated {@forecast} forecast")]
public partial void GeneratedForecast(ILogger logger, WeatherForecast forecast);
给出了源生成器错误消息:
Error LOGGEN031 Logging method "GeneratedForecast" has template(s) that start with "@":
显然这是被禁止的,错误消息中没有进一步的推理。
我在这里缺少什么?我是否正在尝试做一些本质上不可能的事情?
(我确实知道
[LogProperties]
和 [TagProvider]
属性,但解构能力有限。)
看起来它有自己的硬连线“解构”,而且还不能互操作;安德鲁·洛克 (Andrew Lock) 本系列的详细信息: