不管是在開發階段還是真實上線的狀態,總還是會有原本工程師遺漏的邏輯漏洞。以前總是要請使用者抓畫面,才能取得完整的錯誤訊息,且這樣的話無法即時收到錯誤的訊息;以前都是用土法煉鋼的方式弄一個 ErrorLogger 類別之類的東西來記錄,原來真實世界上已經有很多商業與 OpenSource 的套件可以使用,今天要介紹的是 Elmah。下圖來源為原專案網站,這是根目錄下的管理介面,顯示著錯誤例外發生的日期、類型、訊息簡介等,傑克,真的太神奇了!


1. 基本安裝與設定

已經有太多的資源可查詢,這邊就不廢話,直接放連結請大家參閱囉。基本上就是先把該組件參考至專案中,接著設定 Web.config 檔就可以運作了。


2. 儲存方式設定 Log errors to several back-end storages
Elmah 提供多種記錄錯誤的方式,包括實體的資料庫(MS SQL, SQLite, etc.)和檔案(XML),以及記憶體中。以下的例子是以 Microsoft SQL Server 2005 當例子說明。


2-1. Web.config setting & Create a Elmah database

<configuration>
  <elmah>
    <errorLog type="Elmah.SqlErrorLog
        , Elmah" connectionStringName="ELMAH.Sql" />
  </elmah>

  <connectionStrings>
    <add name="ELMAH.Sql"
         connectionString="Data Source=YourDBSource;
         Initial Catalog=ELMAH;Persist Security Info=True;
         User ID=YourUserID;Password=YourPassword"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

</configuration>

接著我們新增一個資料庫 ELMAH(上一段中所設定的資料庫名稱),接著很重要的是要執行解壓縮後路徑 Elmah-1.x\db 下的 SQLServer.sql 檔案,把程式需要叫用的 Stored Procedure 新增到 ELMAH 資料庫中;做完上述的設定後,執行 http://project.domain/elamh.axd 就可以看到錯誤列表頁面了。

3. 使用 Gmail 寄送錯誤訊息
這邊要特別設定的地方是 smtpPort="0",另外一些信件的相關設定也可以一併在該區段中設定。

<configuration>
  <elmah>
    <errorMail from="...@..." to="...@..." 
               priority="high" smtpPort="0" useSsl="true" 
               subject="Error form ELMAH: " async="true" />  
  </elmah>
  <system.net>
    <mailSettings>
      <smtp deliveryMethod="network">
        <network
          host="smtp.gmail.com"
          port="587"
          userName ="YourGmailAccount@gmail.com"
          password ="YourGmailPassword"
         />
      </smtp>
    </mailSettings>
  </system.net>
</configuration>

收到信的範例如下圖。

或是參考下列的相關說明文章:

4. 在 Web Service 中偵錯
若是用 ajax 呼叫後端的 Web Service 發生錯誤的話,你會發現 ELMAH 並沒有記錄該錯誤,找了 StackOverflow 似乎也沒有較好的作法,目前我是像那些網友建議的方式,用 try-catch 包住程式邏輯,來達成記錄錯誤的目的。請參閱這一篇討論 Handle exceptions in web services with Elmah

public int WebServiceMethod() {
  try {
   ...
  }
  catch (Excetion ex) {
    Elmah.ErrorLog.GetDefault(
      HttpContext.Current)
          .Log(new Elmah.Error(ex, HttpContext.Current));
  }
}

5. 安全性設定
當網站正式部署上線後,要讓維護人員可以進入 elamh.axd 需要下列的設定。請參閱這一篇 Allowing secure, remote access to your ELMAH error log: 這邊要注意的是,如果一般使用者和管理者都是透過同一頁面做登入驗證的話,可以在對應的 Controller 中再做處理,或是如同上一篇作者建議的用 Role 的方式做管理。

通常在 MasterPage 中會引用一些 CSS,但是很詭異的是在 ContentPlaceHolder 使用那些定義於 CSS 中的 class 時,儘管實際 render 網頁的時候是正確的,但每次看到編譯完後 MS Visual Studio 2008 出現一排警告訊息還是覺得很厭煩...
MS-VS-class-error

雖然有網友說安裝完 VS SP1 後就可以解決上述的問題,不過在我的開發環境還是一樣會出現這些警告訊息;下列的程式碼是從 Tired of Visual Studio Telling You "The class or CssClass value is not defined"? 擷取出來的,原作者把原本的引用路徑複製一份到 <asp: Literal...> 中,且把該控制項設定為 Visible="false",編譯後檢視網頁原始碼會發現並沒有什麼不同(因為 Visible="false"),但是對 Visual Studio 而言就不會出現那些警告訊息了,雖然不是最佳解,但還是有蠻好的效果的。

<head runat="server">
  <title>The Page</title>
  <asp:Literal Visible="false" runat="server">
    <link href="~/Content/SuppressCssWarnings.css"
        rel="stylesheet" type="text/css" />
  </asp:Literal>
  <!-- You probably have more here... -->
  <link href="~/Content/SuppressCssWarnings.css"
      rel="stylesheet" type="text/css" />
</head>

Firefox Extension:IDE Environment Setup

接觸 Firefox 以來,對多樣化且功能強大的 Extensions 印象很深刻,但從沒想過有一天也需要去開發擴充套件...一切就從老闆的需求開始去硬K...這個系列(如果還有下一篇的話),比較不會用市面上常見的電腦教學書一般,用一個大案子貫穿整個主題(因為我也不太熟XD),比較會傾向用 case 的方式來說明,希望能減少有興趣踏入的朋友一些摸索撞牆的時間...若文中內容有誤,也請不吝賜教 ^o^

開發勢必要會的知識:Javascript 和 XUL(XML User Interface Language),官網上有詳細的中文說明,煩請參閱...本文主要是想介紹自己常用的開發環境設定。撰寫 Javascript Code 方面,我是使用 Spket IDE - 可以直接整合到 eclipse 中,安裝好後,可以直接建立一個 Firefox Extension Project(如下圖所示)。


這樣做的好處是,Spket IDE 可以快速的幫我們開出一個符合 Firefox Extension 的檔案架構(如下圖)。且用 eclipse 的好處是,可以直接對著根目錄的 build.xml 按下右鍵後選取 "Ant Build" 會直接幫你打包成 .xpi(其實本身也是一個壓縮檔,裡面有包好的 .jar 等檔案)。


XUL 中定義了很多常見的控制項(XUL controls),如果怕敲錯字或不想看文件的話,可以用 XUL Explorer 小工具來建構你想打造的 Extension 外觀。工具左邊是你想要放的控制項,像是按鈕或是選單之類的,拖到右邊後,可以按下 Preview 就會是在 Extension 中長的樣子。


長久被 MS Visual Studio 養慣...實在會覺得整個 IDE Solution 相對沒有非常友善...因為我敲錯字或多一個 ; 還是可以 build 成功...有時候會 debug 很久..因為 console 也看不到錯誤...實在很難想像大如 firebug 的套件是怎麼快速開發和維護的。