.NET 9 Windows服务LoggerMessage事件日志ID异常问题咨询
.NET 9 Windows服务中LoggerMessage事件ID问题解析与解决
事件ID来源
LoggerMessage框架默认会对日志消息模板进行哈希计算,生成一个整数作为事件ID,这就是你看到的"随机5位数字"。而直接调用_logger.LogWarning时,若未显式指定事件ID,系统默认使用0,这是基础日志方法的固定默认值。
解决方法
1. 手动指定固定事件ID(包括统一用0)
在定义LoggerMessage时,显式传入EventId参数即可固定ID,示例代码:
// 定义时指定EventId为0 private static readonly Action<ILogger, string, Exception> _sampleWarning = LoggerMessage.Define<string>( LogLevel.Warning, new EventId(0), // 固定事件ID为0 "警告:{Operation} 执行异常" ); // 使用时直接调用 _sampleWarning(_logger, "数据同步", null);
这样日志输出的事件ID会统一为0,和直接用LogWarning的效果一致,同时不会触发"找不到描述"的提示。
2. 注册事件ID与描述消除提示
如果需要保留LoggerMessage生成的ID或自定义其他ID,可通过注册事件日志资源文件解决描述缺失问题:
- 创建
.resx资源文件,添加对应事件ID的描述(比如ID12345对应"自定义警告:{Param} 无效") - 使用
resgen.exe将.resx编译为.resources文件,再用al.exe生成资源.dll - 用注册表命令将资源.dll关联到你的事件源:
完成后事件查看器就能找到对应ID的描述,不再显示提示。reg add "HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Application\My Service Name" /v EventMessageFile /t REG_EXPAND_SZ /d "C:\你的资源文件路径\Resource.dll;%SystemRoot%\System32\EventLog.dll" /f
内容的提问来源于stack exchange,提问作者M.M
相关产品推荐
相关产品推荐

