如何配置NLog仅向Windows系统日志记录Error级日志?
问题分析与解决方案
核心问题
你之前的配置存在两个关键错误:
- EventLog目标的
<logLevel>配置无效:NLog的EventLog目标不支持用<logLevel>子节点过滤日志级别,这个设置不会生效,级别过滤必须在<rules>中定义。 - 混淆了内置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
相关产品推荐
相关产品推荐

