Elmah在Web API中无法过滤/拦截错误

3
我有一个Web Api应用程序,已配置并正常工作的Elmah,日志正常创建。
为了从日志中隐藏/删除敏感数据,我尝试了这个,但它对我的Web Api控制器不起作用。当MVC管道中发生错误时才会命中过滤器(项目中有MVC和Web API控制器)。
我也查看了这个问题,但我的配置文件似乎是正确的:
    <sectionGroup name="elmah">
      <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
      <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
      <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
      <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
    </sectionGroup>

    [...]

   <location path="." inheritInChildApplications="false">
      <system.web>
          <httpModules>
              <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
              <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
              <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
          </httpModules>
          [..]
      </system.web>
   </location>

   [...]

   <system.webServer>
       <modules runAllManagedModulesForAllRequests="true">
           <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
           <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
           <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
       </modules>
  </system.webServer>

在Global.asax中的过滤器:

public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    var ctx = e.Context as HttpContext;

    if (ctx == null) return;

    ElmahDataFilter.Apply(e, ctx);
}

作为额外信息,如果我注释掉system.web>httpModules部分,日志仍然会正常创建。

你正在使用哪些 ELMAH NuGet 包? - ThomasArdal
elmah 1.2.2,它依赖于 elmah.corelibrary(也是1.2.2版本)。 - Jean Lourenço
1个回答

5

ELMAH默认不记录由ASP.NET Web API生成的错误。您需要安装Elmah.Contrib.WebApi软件包:

Install-Package Elmah.Contrib.WebApi

然后在WebApiConfig.cs中配置Web API以使用ELMAH作为异常记录器:

config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());

要了解更多信息,请查看我编写的指南从Web API日志记录到ELMAH。在本教程中,您需要将elmah.io包替换为ELMAH,因为您可能正在使用其他错误日志记录器之一。我刚刚验证安装这些软件包确实会触发您在问题中添加的ErrorLog_Filtering代码。

就是这样,谢谢。一个快速的问题:在我的过滤器上,我调用了'e.Dismiss()',但仍然创建了两个日志文件。有另一种方法可以抑制日志记录吗?(我基本上是按照此步骤进行的(https://dev59.com/tmw15IYBdhLWcg3wZ7AY)) - Jean Lourenço
即使您忽略了错误,它是否仍然被记录,或者您指的是某些日志文件? - ThomasArdal
错误日志即使被忽略仍然会被记录。我需要将其忽略,因为我手动创建了它 ErrorLog.GetDefault(null).Log(error); 所以只显示我想要的数据。 - Jean Lourenço
1
我之前已经编写并测试了这个解决方案:http://docs.elmah.io/remove-sensitive-form-data/ - ThomasArdal
没错,它正在工作。问题是应用程序的另一个服务在抛出异常时写入了相同的日志。再次感谢您的帮助 :) - Jean Lourenço
完全没有问题。 - ThomasArdal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接