Elmah.MVC setup

本文关键字:setup MVC Elmah | 更新日期: 2023-09-27 17:59:10

我正在尝试使用Elmah来运行MVC 5 WebAPI应用程序。我找到的所有文档似乎都以"通过nuget安装"开头和结尾,并认为这会涵盖它,但我显然遗漏了一些东西。我安装了Elmah。MVC 2.1.1通过nuget,我可以在/elmah上查看错误日志。我可以请求一个无效的路由,并看到Elmah记录了由此产生的404错误,即使启用了customErrors。但是,如果我在控制器内或在控制器实例化期间生成了未处理的错误,则Elmah不会记录任何错误。例如:

[HttpGet, Route("api/health")]
[ApiExplorerSettings(IgnoreApi = true)]
public HttpResponseMessage GetHealth()
{
    throw new Exception("Whoops.");
}

我可以整天都这样,Elmah日志中什么都没有显示。添加标准的HandleError属性不会改变任何东西,这里的一点点文档似乎很明确,我不应该创建自定义的HandleError特性。

我使用Ninject作为DI,类似地,如果我破坏依赖绑定,我会得到一个类似的错误:

{
    Message: "An error has occurred."
    ExceptionMessage: "An error occurred when trying to create a controller of type 'HealthController'. Make sure that the controller has a parameterless public constructor."
    ...
}

但在这种情况下,Elmah日志中也没有任何内容。

我认为在这两种情况下,这都是因为MVC为我处理这些错误(将异常格式化为JSON等),而不是将它们传递给Elmah。我该如何配置,以便Elmah记录任何未在控制器内处理的异常?

Elmah.MVC setup

想明白了。这类似于旧的ExceptionFilter机制,但更具全局性,因为ExceptionFilter只处理来自特定控制器的未处理异常,而不处理堆栈中可能出现的更高错误。首先,我需要一个简单的ExceptionLogger来将异常传递给Elmah:

public class ElmahExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(context.Exception));
    }
}

然后在WebApiConfig.cs:中添加

public static void Register(HttpConfiguration config)
{
    // Web API routes
    config.MapHttpAttributeRoutes();
    config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());
}

这确实需要最新和最棒的MVC/WebAPI(目前为5.1.1)。