【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)


而且照理來說,本來也就應該在 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 之中,如下程式所示:
  1. using Elmah;  
  2. using System.Web;  
  3. using System.Web.Mvc;  
  4.   
  5. namespace MvcApplication1  
  6. {  
  7.   public class ElmahHandledErrorLoggerFilter : IExceptionFilter  
  8.   {  
  9.     public void OnException(ExceptionContext context)  
  10.     {  
  11.       if (context.ExceptionHandled)  
  12.         ErrorSignal.FromCurrentContext().Raise(context.Exception);  
  13.     }  
  14.   }  
  15.   
  16.   public class FilterConfig  
  17.   {  
  18.     public static void RegisterGlobalFilters(GlobalFilterCollection filters)  
  19.     {  
  20.       // 必須置於第一順位  
  21.       filters.Add(new ElmahHandledErrorLoggerFilter());  
  22.       // 預設的 Exception Action Filter  
  23.       filters.Add(new HandleErrorAttribute());  
  24.     }  
  25.   }  
  26. }  
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}");



You may also like

沒有留言: