2

実行に非常に時間がかかり、要求タイムアウトをトリガーしている同期コードを含む .aspx ページがあります。例えば:

protected void Page_Load(object sender, EventArgs e)
{
    var log = LogManager.GetLogger("test");
    log.Debug("Before thread sleep...");
    Thread.Sleep(99999999);
    log.Debug("After thread sleep.");
}

私のGlobal.asaxでは、例外を電子メールで送信するエラー処理を追加しました。

protected void Application_Error(Object sender, EventArgs e)
{
    var exception = HttpContext.Current.Server.GetLastError();
    SendExceptionEmail(exception);
}

問題は、 ではGlobal.asax、リクエストとレスポンス、および発生した例外にしかアクセスできず、ロガーからの出力にアクセスできないことです。でこれにアクセスするにはどうすればよいGlobal.asaxですか? これがなければ、ログ ファイルを調べなければ、どのコードがアプリケーションをハングさせているのかを知ることができません。

4

2 に答える 2

0

'log'オブジェクトは静的変数であり、Global.asax Application_Error()でフェッチしようとするのは正しくありません。スレッドプール内の現在のスレッドによっては、予測できない値が含まれる場合があります。より安全なアプローチは、log.Debug()を使用して、いくつかのデバッグデータをHttpContext.Current.Itemsに挿入することです。次に、Application_Error()メソッドでこれらのアイテムにアクセスできます。Context.Itemsはスレッドセーフと見なされ、このような場合に使用することをお勧めします。

于 2012-06-02T11:52:07.097 に答える
0

これを行う別の方法は、log4netに電子メールアペンダーを使用して電子メールを送信させることです。この例を参照してください:http ://sradack.blogspot.co.uk/2007/09/have-log4net-send-email-when-error.html

于 2012-06-02T12:00:18.187 に答える