Logging 方框404 ELMAh中的FavIco错误
我注意到ELMAH在我的本地服务器上记录了一个没有为favico找到的404。如何通过过滤器抑制此错误?我还不太熟悉如何配置它。这并不能帮助您了解如何配置ELMAH,但防止404请求favicon的最简单方法是提供一个…官方ELMAH解释了许多抑制404 favicon错误的方法 您可以在web.config中声明性地过滤掉所有404错误,如下所示。我不确定是否有一种方法可以让法维康只超过404Logging 方框404 ELMAh中的FavIco错误,logging,http-status-code-404,elmah,Logging,Http Status Code 404,Elmah,我注意到ELMAH在我的本地服务器上记录了一个没有为favico找到的404。如何通过过滤器抑制此错误?我还不太熟悉如何配置它。这并不能帮助您了解如何配置ELMAH,但防止404请求favicon的最简单方法是提供一个…官方ELMAH解释了许多抑制404 favicon错误的方法 您可以在web.config中声明性地过滤掉所有404错误,如下所示。我不确定是否有一种方法可以让法维康只超过404 <errorFilter> <test> <e
<errorFilter>
<test>
<equal binding="HttpStatusCode" value="404" type="Int32" />
</test>
</errorFilter>
我个人更喜欢通过web.config声明性地过滤所有404,或者像Joel建议的那样提供favicon。我只是忽略路由,而不是配置Elmah。这对我很有用:
routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});
我在使用上面Kurt Schindler的编程解决方案(vs config);但是,我注意到在ErrorLog_过滤事件处理程序中两次抛出非HttpException。为了避免这种情况,请确保对GetBaseException方法进行类型检查。下面是片段
void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
if (e.Exception.GetBaseException() is HttpException)
{
if (((HttpException)e.Exception.GetBaseException()).GetHttpCode() == 404
&& ((HttpContext)e.Context).Request.Path == "/favicon.ico")
{
e.Dismiss();
}
}
}
这里没有什么新鲜事,如果你碰巧看到一些奇怪的行为,请告诉我
谢谢…不是我的web应用程序请求一个favicon,而是当我浏览elmah.axd页面时,浏览器请求一个favicon 据推测,这应该是可行的:
<elmah>
<errorFilter>
<test>
<and>
<equal binding="HttpStatusCode"
value="404" type="Int32" />
<regex binding="Context.Request.ServerVariables['URL']"
pattern="/favicon\.ico(\z|\?)" />
</and>
</test>
</errorFilter>
</elmah>
但你猜怎么着,事实并非如此
我发现唯一可行的方法是在我的web根目录中添加一个favicon.ico。这不是为我的网站,它只是为elmah.axd页面。不需要调用route.IgnoreRoute
这是elmah.axd和我的favicon,没有错误:
通过使用下面的代码,我可以让ELMAH忽略错误。您还可以添加任何其他要忽略的路径。从技术上讲,这些可能是单独的测试,但如果我不想在将来忽略与我的应用程序相关的其他404错误,我想我会将这些错误分组在一起,因为它们完全不依赖于我的应用程序,而只是为了从我的错误日志中删除杂乱无章的内容
<errorFilter>
<test>
<or>
<and>
<equal binding="HttpStatusCode" value="404" type="Int32" />
<equal binding="Context.Request.Path" value="/favicon.ico" type="string" />
</and>
<and>
<equal binding="HttpStatusCode" value="404" type="Int32" />
<equal binding="Context.Request.Path" value="/robots.txt" type="string" />
</and>
</or>
</test>
</errorFilter>
当然,如果您担心web.config会变得混乱,您可以将过滤器拆分为一个专用文件
<elmah>
<security allowRemoteAccess="1" />
<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sqlserver" />
<errorFilter configSource="elmahFilters.config" />
</elmah>
这就可以了,但我不建议过滤所有404错误。这有点限制了艾玛的力量。我更支持Joel的方法,你可以解决问题。哈哈!我只是去了。。哦,是的,我可以添加一个favicon!你确定你真的和ELMAH查过了吗?忽略路线是行不通的。它只会导致MVC忽略该请求,并将其传递到常规ASP.NET管道,该管道会对其进行404处理,从而使其登录到ELMAH。我已经有一段时间没有查看该代码了,因此我需要再次检查,但我在一个实时站点上使用了该技术,它似乎对我有效。IIS6和IIS7之间有区别吗?是否需要它取决于服务器配置。对于Cassini(Visual Studio调试),这些404由Elmah记录。对于IIS 6,如果路由忽略它们,Elmah不会看到它们。我没有测试IIS 7。我最后重新检查了这个,你是对的,它确实被作为404传递。嘿,Matt,你需要确保你在httpModule和system.webServer模块中注册了你的ErrorFilter-并且它们需要在ErrorLog处理程序(或任何其他日志模块)运行后注册-这是一个反向堆栈,优先权。
<elmah>
<security allowRemoteAccess="1" />
<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sqlserver" />
<errorFilter configSource="elmahFilters.config" />
</elmah>