Serilog.Sinks.EventLog写入事件查看器时如何自定义指定Event ID
解决方案
Serilog.Sinks.EventLog 会优先读取日志事件中名为 EventId 的属性值作为Windows事件查看器的事件ID,你可以通过以下两种方式自定义指定:
方式1:写日志时手动附加(灵活适配单条日志需求)
在需要指定Event ID的日志调用前通过ForContext附加EventId属性即可:
// 服务启动时指定Event ID为X(示例为1001) Log.ForContext("EventId", 1001) .Information("工作服务正常启动"); // 发生错误时指定Event ID为Y(示例为2001) Log.ForContext("EventId", 2001) .Error(exception, "服务运行过程中出现未处理异常");
方式2:全局统一配置(适合固定规则的场景)
如果要按日志级别、内容等规则自动匹配Event ID,可以自定义日志增强器统一注入:
- 实现自定义Enricher
using Serilog.Core; using Serilog.Events; public class CustomEventIdEnricher : ILogEventEnricher { public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) { // 错误日志统一用Event ID 2001 if (logEvent.Level == LogEventLevel.Error) { logEvent.AddPropertyIfAbsent( propertyFactory.CreateProperty("EventId", 2001)); return; } // 启动日志统一用Event ID 1001 if (logEvent.MessageTemplate.Text.Contains("启动")) { logEvent.AddPropertyIfAbsent( propertyFactory.CreateProperty("EventId", 1001)); return; } // 其他日志默认用Event ID 0,避免生成随机ID logEvent.AddPropertyIfAbsent( propertyFactory.CreateProperty("EventId", 0)); } }
- 注册Enricher到Serilog配置
// Program.cs 中配置Serilog时添加 Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(Configuration) .Enrich.With<CustomEventIdEnricher>() // 注入自定义增强器 .CreateLogger();
可选配置修改
你可以在原有appsettings.json的EventLog Sink配置中添加defaultEventId参数,设置无指定Event ID时的默认值,彻底避免随机ID生成:
{ "Name": "EventLog", "Args": { "manageEventSource": false, "source": "CTS", "restrictedToMinimumLevel": "Error", "defaultEventId": 0 } }
内容的提问来源于stack exchange,提问作者SidD
相关产品推荐
相关产品推荐

