You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

已遵循全部步骤,但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并注入属性集合:

  1. 先确认你引用了最新版的NLog.Extensions.Logging(ASP.NET Core项目用NLog.Web.AspNetCore),旧版本的集成支持可能有缺陷;
  2. 在NLog配置文件里显式启用相关扩展(一般默认会自动加载,但显式声明更稳妥):
<nlog>
  <extensions>
    <add assembly="NLog.Extensions.Logging"/>
    <!-- ASP.NET Core项目替换成 <add assembly="NLog.Web.AspNetCore"/> -->
  </extensions>
  <!-- 其他配置内容... -->
</nlog>
  1. 之后你就能在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

火山引擎 最新活动