You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置NLog仅向Windows系统日志记录Error级日志?

问题分析与解决方案

核心问题

你之前的配置存在两个关键错误:

  1. EventLog目标的<logLevel>配置无效:NLog的EventLog目标不支持用<logLevel>子节点过滤日志级别,这个设置不会生效,级别过滤必须在<rules>中定义。
  2. 混淆了内置EventLog提供器与NLog目标:当你在appsettings.json中配置EventLog节点时,实际启用的是ASP.NET Core内置的EventLog日志提供器,而非NLog的EventLog目标。此时是内置组件在按规则过滤日志,并非NLog本身。

正确的NLog配置方案

要完全通过nlog.config实现仅Error级日志写入事件查看器,按以下步骤调整:

1. 修正EventLog目标配置

移除EventLog目标中无效的<logLevel>节点,可按需指定日志名称和源名称(便于在事件查看器中区分)。

2. 调整日志规则

明确在<rules>中定义只有Error及以上级别的日志流向EventLog目标,并通过final="true"确保匹配后不再执行后续规则。

修改后的完整nlog.config:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
   <extensions>
      <add assembly="NLog.Web.AspNetCore"/>
      <add assembly="NLog.WindowsEventLog"/>
   </extensions>

   <targets>
      <target xsi:type="File" name="allfile" fileName="Backoffice_template.log" 
              layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring} |action: ${aspnet-mvc-action} |user: ${aspnet-user-identity}" 
              archiveEvery="Day" encoding="utf-8"
              archiveNumbering="Date"
              archiveDateFormat="yyyyMMdd_HHmmss" 
              archiveOldFileOnStartup="false" maxArchiveDays="30" />
      <!-- 移除无效<logLevel>,添加可选的日志名称和源名称 -->
      <target name="EventLog" xsi:type="EventLog" 
              logName="Application"
              source="BackofficeTemplate"/>
      <target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
   </targets>

   <rules>
      <logger name="*" minlevel="Trace" maxLevel="Warning" writeTo="allfile" />
      <logger name="Microsoft.*" maxLevel="Warning" final="true" />
      <logger name="System.Net.Http.*" maxlevel="Info" final="true" />
      <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole" final="true" />
      <!-- 明确仅Error及以上级别写入EventLog -->
      <logger name="*" minlevel="Error" maxlevel="Fatal" writeTo="EventLog" final="true" />
   </rules>
</nlog>

3. 禁用内置EventLog提供器

确保Program.cs中没有启用ASP.NET Core内置的EventLog提供器,避免冲突。如果之前有.AddEventLog()代码,需移除。

额外验证点

  • 规则顺序:NLog按配置顺序匹配规则,Error级规则需放在低级规则之后,确保不会被提前拦截。
  • 权限:应用运行身份需有写入Windows事件日志的权限,IIS下通常需要给应用池身份分配相应权限。

内容的提问来源于stack exchange,提问作者herve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:54:52