NLog.Extensions.Logging结构化日志

时间:2018-05-01 10:19:39

标签: .net-core nlog

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

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

使用Microsoft DI将记录器注入到应用程序中,并且日志记录语句看起来像,其中action是某种复杂类型的实例

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

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

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

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

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

它让我思考,只有可能的解释是NLog.Extensions.Logging(由Microsoft和NLog联合提供)还不支持结构化日志记录,即使Nlog确实如此。我无法找到任何信息表明它没有这样做。

有人可以确认是否支持它并希望指向一个有效的例子吗?

1 个答案:

答案 0 :(得分:4)

Microsoft Extension Logging支持结构化日志记录,但不支持{ "timestamp" : "2018-05-01T22:45:28.907+0000", "status" : 400, "error" : "Bad Request", "errors" : [{ "codes" : ["NotNull.ticket.items[0].amount", "NotNull.ticket.items.amount", "NotNull.items[0].amount", "NotNull.items.amount", "NotNull.amount", "NotNull.java.math.BigDecimal", "NotNull"], "arguments" : [{ "codes" : ["ticket.items[0].amount", "items[0].amount"], "arguments" : null, "defaultMessage" : "items[0].amount", "code" : "items[0].amount" } ], "defaultMessage" : "may not be null", "objectName" : "ticket", "field" : "items[0].amount", "rejectedValue" : null, "bindingFailure" : false, "code" : "NotNull" } ], "message" : "Validation failed for object='ticket'. Error count: 1", "path" : "/v1/databases/00000000-0000-0000-0000-000000000000/retail/pos/ticket" } @

的messagetemplate规范

NLog对$使用Microsoft Extension Logging格式化程序,因为Microsoft Extension Logging已经花时间解析和格式化输入模板。

NLog能够收集日志记录参数以及${message}@的规范。 $使用它来自动使用它们来对结构化日志记录属性进行正确的json序列化(当MaxRecursionLimit为1或更高时)