Global.aspx に、エラー発生時のハンドラを記述すれば良い。
<%@ Import Namespace="System.IO" %> <script Language="C#" runat="Server"> void Application_OnError(Object sender, EventArgs e) { // ここでログに書くなどする。 Exception err = Server.GetLastError().InnerException; logger.Error( "エラーだよん。", err ); } </script>
スクリプトではなく、コードに書く場合は、
<%@ Application Codebehind="Global.asax.cs" Inherits="Sample.Global"%>
として、Global.asax.cs に
using System; using System.Diagnostics; namespace Sample { public class Global : System.Web.HttpApplication { public Global() { InitializeComponent(); } protected void Application_Error(Object sender, EventArgs e) { // ここでログに書くなどする。 Exception err = Server.GetLastError().GetBaseException(); logger.Error( "エラーだよん。", err ); } } }
などと書く。
Global.asax は、ASP.NET のルートに置く。
※ちなみに、上の logger は log4net なんか使えるかと。
コードでは次のイベントも拾うことができる。
イベントハンドラ | タイミング |
Application_Start | アプリケーションの初回起動時。 |
Application_End | アプリケーションが破棄された時。 |
Session_Start | ユーザーセッションの初回起動時。 |
Session_End | ユーザーセッションの終了時。 |
Application_BeginRequest? | GETやPOSTなどのリクエスト発生時。 |
Application_EndRequest? | GETやPOSTなどのリクエスト終了時。 |
Application_Disposed | CLRがASP.NETアプリケーションを最終的にメモリから破棄するタイミング。 |
Application_Error | アプリケーション内で処理されない例外が発生した時。 |