ASP.NET Core MVC中Windows事件日志Event ID无法修改及低级别日志无输出问题求助
解决Windows事件日志Event ID不生效及低级别日志不输出问题
我来帮你拆解这两个问题,一步步给出解决思路和方案:
一、自定义Event ID不生效(始终显示1000)的原因和解决方法
问题根源
默认的EventLogLogger并不会直接使用你通过_logger.LogError(4472, "Event")传入的自定义Event ID,而是根据日志级别使用固定的映射值(比如Error级别默认对应1000)。你在事件消息里看到的EventId:4472只是日志框架附加的属性,并非写入Windows事件日志的实际Event ID。
解决方法:自定义EventLogLogger
要让自定义Event ID真正生效,需要继承EventLogLogger并重写日志写入逻辑,直接使用传入的Event ID:
- 创建自定义日志记录器和提供器:
public class CustomEventLogLogger : EventLogLogger { private readonly EventLogSettings _settings; public CustomEventLogLogger(ILoggerFactory loggerFactory, EventLogSettings settings) : base(loggerFactory, settings) { _settings = settings; } protected override void Write(LogEntry logEntry) { // 优先使用传入的Event ID,没有指定则用级别映射的默认值 int eventId = logEntry.EventId.Id != 0 ? logEntry.EventId.Id : GetDefaultEventId(logEntry.LogLevel); EventLog.WriteEntry( _settings.LogName, logEntry.Message, GetEventLogEntryType(logEntry.LogLevel), eventId); } private int GetDefaultEventId(LogLevel logLevel) { return _settings.LogLevelToEventIdMapping.TryGetValue(logLevel, out int id) ? id : 1000; } } public class CustomEventLogLoggerProvider : EventLogLoggerProvider { private readonly EventLogSettings _settings; public CustomEventLogLoggerProvider(EventLogSettings settings) : base(settings) { _settings = settings; } public override ILogger CreateLogger(string categoryName) { return new CustomEventLogLogger(this, _settings); } }
- 在
CreateHostBuilder中替换默认的EventLog提供器:
.ConfigureLogging(logging => { logging.ClearProviders(); logging.AddDebug(); // 使用自定义的EventLog提供器 logging.AddProvider(new CustomEventLogLoggerProvider(new EventLogSettings())); })
这样修改后,你调用_logger.LogError(4472, "Event")时,Windows事件日志里的Event ID就会显示为你指定的4472了。
二、Trace和Information级别日志不输出的问题
问题根源
当你调用ClearProviders()后,默认的控制台日志提供器被移除了;而AddEventLog()默认只记录Warning及以上级别的日志,AddDebug()只会将日志输出到调试窗口(比如VS的输出面板),所以你在控制台看不到Trace和Information日志。
解决方法
1. 让EventLog记录低级别日志
在appsettings.json中配置EventLog的最低日志级别:
"Logging": { "LogLevel": { "Default": "Trace" }, "EventLog": { "LogLevel": { "Default": "Trace" } } }
或者在代码中直接配置:
logging.AddEventLog(options => { options.Filter = (category, level) => level >= LogLevel.Trace; });
2. 保留控制台日志输出
如果你需要在控制台看到Trace和Information日志,不要移除默认的控制台提供器,或者手动添加:
.ConfigureLogging(logging => { // 保留控制台日志提供器,或手动添加 logging.AddConsole(); logging.AddDebug().AddEventLog(options => { options.Filter = (category, level) => level >= LogLevel.Trace; }); })
这样Trace和Information日志就会同时输出到控制台和Windows事件日志(如果配置了对应级别)。
内容的提问来源于stack exchange,提问作者Richard Harris
相关产品推荐
相关产品推荐

