NLog.Extensions.Logging 结构化日志

NLog.Extensions.Logging structured logs

我正在尝试使用 NLog 提供程序登录我的 .net 核心应用程序。我在 GitHub 网站上使用示例代码。格式化日志记录工作得很好,但结构化日志记录似乎不起作用。我正在使用以下代码来初始化记录器

var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
loggerFactory.AddNLog();
NLog.LogManager.LoadConfiguration("nlog.config");

Logger 使用 Microsoft DI 注入到应用程序中,日志语句看起来像,其中 action 是某个复杂类型的实例

_logger.LogInformation("Test {@action}", action);

如果我不使用 Microsoft 日志记录抽象并使用 NLog 日志管理器实例化记录器,结构化日志记录工作正常

NLog.LogManager.LoadConfiguration("nlog.config");
_logger = NLog.LogManager.GetCurrentClassLogger();

如果我将 SeriLog 与 Microsoft 日志记录抽象结合使用,它也可以正常工作。格式化日志和结构化日志都可以使用以下代码来初始化 logger

loggerFactory.AddSerilog();
Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateLogger();

这让我开始思考,唯一可能的解释是 NLog.Extensions.Logging(由 Microsoft 和 NLog 联合提供)尚不支持结构化日志记录,尽管 Nlog 支持。我找不到任何资料说它没有做到。

有人可以确认它是否受支持并希望指出一个工作示例吗?

Microsoft 扩展日志记录支持结构化日志记录,但不支持 @$

的消息模板规范

NLog 为 ${message} 使用 Microsoft 扩展日志格式化程序,因为 Microsoft 扩展日志已经花时间解析和格式化输入模板。

NLog 能够收集日志参数以及 @$ 的规范。这由 JsonLayout 使用,它将自动使用它们来正确 json- 结构化日志属性的序列化(当 MaxRecursionLimit 为 1 或更高时)