You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:35:10