【Elmah】安裝設定
/
0 Comments
1.安裝好ELMAH on XML Log
2.在 FilterConfig 加入程式碼
public class ElmahHandledErrorLoggerFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
if (context.ExceptionHandled)
ErrorSignal.FromCurrentContext().Raise(context.Exception);
}
}
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// 必須置於第一順位
filters.Add(new ElmahHandledErrorLoggerFilter());
// 預設的 Exception Action Filter
filters.Add(new HandleErrorAttribute());
}
原因(will保哥):
由於 ELMAH 是利用 HTTP Modules 取得任何 Web 應用程式執行過程中丟出的例外狀況 (Exceptions),因此它可以通用於任何 ASP.NET 相關的執行環境,包括 ASP.NET Web Form 或 ASP.NET MVC 都可以正常支援。不過,如果你從應用程式中實作 try/catch 將例外狀況「吃」掉的話,ELMAH 當然是無法取得任何錯誤紀錄的。而在 ASP.NET MVC 之中,由於預設都會套用 HandleErrorAttribute 全域動作方法 (Global Action Filter)
3.web.config取代
<location path="debugger" inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="Elmah" verb="POST,GET,HEAD" path="BnyelmahErrorHandler.axd"
type="Elmah.ErrorLogPageFactory, Elmah" />
</handlers>
</system.webServer>
<system.web>
<httpHandlers>
<!--<add verb="POST,GET,HEAD" path="Bny_elmahErrorHandler.axd" type="Elmah.ErrorLogPageFactory, Elmah" />-->
<add verb="POST,GET,HEAD" path="BnyelmahErrorHandler.axd"
type="Elmah.ErrorLogPageFactory, Elmah" />
</httpHandlers>
<!--<authorization>
<allow users="DOMAIN\diablo"/>
<allow users="DOMAIN\User1, DOMAIN\User2" />
<allow roles="BUILTIN\Administrators"/>
<deny users="*" />
</authorization>-->
以這段程式碼 ,代替原本的location 區段
4.RouteConfig 加入
//routes.IgnoreRoute("elmah.axd");
routes.IgnoreRoute("debugger/BnyelmahErrorHandler.axd/{*pathInfo}");
2.在 FilterConfig 加入程式碼
public class ElmahHandledErrorLoggerFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
if (context.ExceptionHandled)
ErrorSignal.FromCurrentContext().Raise(context.Exception);
}
}
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// 必須置於第一順位
filters.Add(new ElmahHandledErrorLoggerFilter());
// 預設的 Exception Action Filter
filters.Add(new HandleErrorAttribute());
}
原因(will保哥):
由於 ELMAH 是利用 HTTP Modules 取得任何 Web 應用程式執行過程中丟出的例外狀況 (Exceptions),因此它可以通用於任何 ASP.NET 相關的執行環境,包括 ASP.NET Web Form 或 ASP.NET MVC 都可以正常支援。不過,如果你從應用程式中實作 try/catch 將例外狀況「吃」掉的話,ELMAH 當然是無法取得任何錯誤紀錄的。而在 ASP.NET MVC 之中,由於預設都會套用 HandleErrorAttribute 全域動作方法 (Global Action Filter)
而且照理來說,本來也就應該在 ASP.NET MVC 套用自訂的錯誤頁面,但是在這種情況下,由於 ASP.NET MVC 已經處理過所有例外狀況,所以 ELMAH 是無法取得任何錯誤紀錄的。
請注意:若要在 ASP.NET MVC 中顯示自訂錯誤頁面,必須將 web.config 裡的 <customError mode="On" /> 設定的 mode 屬性設定為 On 或 RemoteOnly 才會有效果,如下圖範例:
為了要讓這種情況下也能讓 ELMAH 妥善記錄所有紀錄,一般來說就是要自訂一個 例外動作過濾器(Exception Action Filter) 並載入到 ASP.NET MVC 的 GlobalFilterCollection 之中,如下程式所示:
- using Elmah;
- using System.Web;
- using System.Web.Mvc;
- namespace MvcApplication1
- {
- public class ElmahHandledErrorLoggerFilter : IExceptionFilter
- {
- public void OnException(ExceptionContext context)
- {
- if (context.ExceptionHandled)
- ErrorSignal.FromCurrentContext().Raise(context.Exception);
- }
- }
- public class FilterConfig
- {
- public static void RegisterGlobalFilters(GlobalFilterCollection filters)
- {
- // 必須置於第一順位
- filters.Add(new ElmahHandledErrorLoggerFilter());
- // 預設的 Exception Action Filter
- filters.Add(new HandleErrorAttribute());
- }
- }
- }
<location path="debugger" inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="Elmah" verb="POST,GET,HEAD" path="BnyelmahErrorHandler.axd"
type="Elmah.ErrorLogPageFactory, Elmah" />
</handlers>
</system.webServer>
<system.web>
<httpHandlers>
<!--<add verb="POST,GET,HEAD" path="Bny_elmahErrorHandler.axd" type="Elmah.ErrorLogPageFactory, Elmah" />-->
<add verb="POST,GET,HEAD" path="BnyelmahErrorHandler.axd"
type="Elmah.ErrorLogPageFactory, Elmah" />
</httpHandlers>
<!--<authorization>
<allow users="DOMAIN\diablo"/>
<allow users="DOMAIN\User1, DOMAIN\User2" />
<allow roles="BUILTIN\Administrators"/>
<deny users="*" />
</authorization>-->
以這段程式碼 ,代替原本的location 區段
4.RouteConfig 加入
//routes.IgnoreRoute("elmah.axd");
routes.IgnoreRoute("debugger/BnyelmahErrorHandler.axd/{*pathInfo}");