已遵循全部步骤,但NLog的event-properties在日志文件中始终为空
解决NLog中EventId.Id在event-properties中为空的问题
我之前也碰到过一模一样的问题,其实核心原因很明确:.NET自带的ILogger接口传入的EventId,默认不会自动映射到NLog的event-properties集合里,所以你用${event-properties:item=EventId.Id}自然拿不到值。不过有几个简单直接的解决办法:
方法一:用NLog专属的EventId渲染器(最省心)
NLog专门为.NET日志的EventId提供了${event-id}渲染器,不需要绕到event-properties里取值。直接把你的layout改成这样:
${longdate}|${event-id}|${logger}|${uppercase:${level}}| ${message} ${exception}
修改完重新运行程序,执行_logger.LogError(1, "Error Logged");后,日志里的EventId位置就会正常显示1了。
方法二:配置NLog将EventId注入到event-properties
如果你一定要通过event-properties来获取值,需要确保NLog正确捕获.NET的EventId并注入属性集合:
- 先确认你引用了最新版的
NLog.Extensions.Logging(ASP.NET Core项目用NLog.Web.AspNetCore),旧版本的集成支持可能有缺陷; - 在NLog配置文件里显式启用相关扩展(一般默认会自动加载,但显式声明更稳妥):
<nlog> <extensions> <add assembly="NLog.Extensions.Logging"/> <!-- ASP.NET Core项目替换成 <add assembly="NLog.Web.AspNetCore"/> --> </extensions> <!-- 其他配置内容... --> </nlog>
- 之后你就能在layout里用
${event-properties:item=EventId.Id}拿到Id值了,不过这种方式确实不如方法一直接。
另外还要检查你的日志服务配置,确保NLog是唯一的日志提供器,避免其他默认提供器干扰:
比如在.NET 6+的Program.cs里:
var builder = WebApplication.CreateBuilder(args); // 清除默认日志提供器 builder.Logging.ClearProviders(); // 添加NLog作为日志提供器 builder.Logging.AddNLog();
按上面的方法调整后,应该就能正常输出EventId了。
内容的提问来源于stack exchange,提问作者rethabile




