我正在尝试使用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确实如此。我无法找到任何信息表明它没有这样做。
有人可以确认是否支持它并希望指向一个有效的例子吗?
答案 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"
}
和@
NLog对$
使用Microsoft Extension Logging格式化程序,因为Microsoft Extension Logging已经花时间解析和格式化输入模板。
NLog能够收集日志记录参数以及${message}
和@
的规范。 $
使用它来自动使用它们来对结构化日志记录属性进行正确的json序列化(当MaxRecursionLimit为1或更高时)