如何在ASP.NET Core中配置ElmahLoggerProvider使ILogger<T>接入ElmahCore
解决ASP.NET Razor Pages中ElmahCore捕获ILogger日志的问题
问题核心
你通过ILogger<T>.LogError记录的异常未出现在Elmah仪表盘,原因是ElmahCore默认仅捕获未处理的全局异常,要对接ILogger日志,需正确配置ElmahLoggingProvider并处理依赖注入。
具体解决方案
1. 注册HttpContextAccessor依赖
ElmahLoggingProvider需要IHttpContextAccessor获取请求上下文,先在Program.cs中注册该服务:
builder.Services.AddHttpContextAccessor();
2. 配置Elmah日志提供器
使用ElmahCore提供的扩展方法直接注册日志提供器,无需手动实例化ElmahLoggingProvider(内部已自动处理依赖注入):
builder.Logging.AddElmah();
3. 确保中间件顺序正确
Elmah中间件需放在异常处理中间件之后、业务中间件之前,避免日志丢失:
var app = builder.Build(); // 异常处理中间件(根据环境配置) if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } else { app.UseDeveloperExceptionPage(); } // 注册Elmah中间件 app.UseElmah(); // 其他业务中间件 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapRazorPages(); app.Run();
4. 测试日志捕获
在页面Model中按规范记录错误(需传入Exception实例,否则Elmah可能不识别为错误):
public class TestModel : PageModel { private readonly ILogger<TestModel> _logger; public TestModel(ILogger<TestModel> logger) { _logger = logger; } public void OnGet() { try { throw new InvalidOperationException("测试异常"); } catch (Exception ex) { _logger.LogError(ex, "手动捕获的错误"); TempData["Error"] = "发生错误"; // 页面提示 } } }
注意事项
- 确保使用的ElmahCore版本为2.1.2,与.NET 7.0环境兼容
- 调试模式下Elmah默认开启,若仪表盘仍无日志,检查
ElmahOptions中的PermissionCheck配置是否限制了访问 - 仅记录字符串的
LogError不会被Elmah捕获,必须传入Exception对象
内容的提问来源于stack exchange,提问作者Greg Burghardt
相关产品推荐
相关产品推荐

