2010年3月30日火曜日

ASP.NET MVCでELMAHを使う

エラーのログをどうするか、というのはアプリケーションの永遠の課題だが、ASP.NETには優れたソリューションがある。それがELMAHだ。ELMAHはError Logging Modules and Handlersの略称だ。公式サイトはこちら

で、Elmahを使うと何ができるの?というのは下図をみてもらえればわかると思う。





ELMAHを設定した後にhttp://localhost:****/elmah.axdへアクセスすると上図のページが参照できる。一つ目はELMAHにハンドルされたエラーの一覧だ。二つ目の画像はそのエラーリストのうちの詳細情報になる。そう、ELMAHはASP.NET開発者が開発中に良く見かける黄色いエラーページ(いわゆる「Yellow screen of death」だ)の内容をそのまま保持管理してくれるのだ。

他にも、エラーが発生したことを通知してくれるメール機能やエラーの種類をフィルターする機能もある。また、エラーログの保存先として、SQL Serverはもちろん、Oracle, SQLite, Microsoft Access, VistaDB, XML, RAM(メモリ上)が選択できる。

さらに嬉しいことに導入はいたって簡単。Web.configにぺぺっといくつかの項目を記述して、ELMAHのDLLをbinへコピーするだけで(最もシンプルな構成にした場合は)すぐに動作する。

それではここから導入方法を解説する。今回はログのバックエンドとしてSQL Server 2008, サーバはIIS7, メール機能の有効化を行う。
(注意!これはASP.NET MVC用の導入手順なのでASP.NETと微妙に違います)

  1. まず前述の公式サイトからELMAHの最新版をダウンロードしElmah.dllを導入したいアプリケーションのbinフォルダへコピーする。
  2. 続いてweb.configを開き(下方にあるsample.configを参照) sample.configの内容をコピーする。
  3. このDTDをELMAHのログをインストールしたいDatabase上で実行する(実行時に互換性がうんたらかんたらとメッセージがでるが無視して構わない)。


-sample.config-(必要な箇所以外は省略してあります)
<configuration>
 <configSections>
  <sectionGroup name="elmah">
   <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah"/>
   <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah"/>
 </sectionGroup>
</configSections>

<elmah>
 <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ApplicationServices" />
  <errorMail from="***"
   to="***"
   subject="***"
   async="false"
   smtpPort="***"
   smtpServer="***"
   userName="***"
   password="***" />
</elmah>
<connectionStrings>
 <add name="ApplicationServices" connectionString="***"/>
</connectionStrings>
<system.web>
<httpHandlers>
 <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah"/>
</httpHandlers>
<httpModules>
 <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah"/>
 <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
 <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
</httpModules>
</system.web>
<system.webServer>
 <handlers>
 <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" preCondition="integratedMode" type="Elmah.ErrorLogPageFactory, Elmah"/>
 </handlers>
 <modules runAllManagedModulesForAllRequests="true">
  <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah"/>
  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
  <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
 </modules>
</system.webServer>
</configuration>


ここまでできたらhttp://localhost:****/elmah.axdへアクセスしてみよう。一つ目の画像の画面が表示され、「No errors found.」と表示されていたら成功だ。さらに何か適当なURLをたたくなどしてエラーを起こしてから、elmah.axdをリフレッシュし、それがログされているのを確認しよう。

また、HandleErrorAttributeと一緒にELMAHを使いたい場合はこちらのページを見てもらいたい。開発者であるAtif Aziz氏みずから解決策をコメントしてくれている。

今回解説していない機能の詳細についてはこちらを参照して欲しい。MSDNにもELMAHの解説が日本語であるのでそちらを参照するのも良いだろう。

0 件のコメント:

コメントを投稿