2014年9月16日 星期二

Elmah (Error Logging Modules and Handlers)

Elmah - Error Logging Modules and Handlers
是一個將未處理的Error記錄起來的模組,和包含一個顯示Log的處理常式
先開一個簡單的Web專案

透過NuGet安裝Elmah套件

從設定檔上可以看到包含四個模組
<configSections>
    <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>
</configSections>

security,用來設定是否允許遠端讀取elmah.axd,
errorLog,用來設定Log要存在什麼地方,例如XML或DB,預設是Memory
errorMail,用來把Log送出EMail通知
errorFilter,用來過濾Log

elmah.axd是用來顯示Log的處理常式,如果允許遠端存取的時後,在安全性上要特別注意


如果要把記錄存在資料庫的話,以下用SQL Server為例子
首先到官網取得資料表結構
或是透過NuGet安裝Elmah.SqlServer套件

就可以在App_Readme資料夾下找到SQL檔案

不過最好把NTEXT形態,改成NVARCHAR(MAX)比較好

準備好資料庫,包含ELMAH_Error資料表和三隻預儲程序
透過errorLog設定Log寫到SQL Server
<elmah>
    <security allowRemoteAccess="false" />
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionString="data source=(localdb)\v11.0; database=ElmahDB; trusted_connection=true" />
</elmah>

隨便丟個錯誤出來
namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            throw new Exception("test");
        }
    }
}

資料庫就有記錄了