2012-06-02 79 views
2

我有一個.aspx頁面,其中有一些同步代碼需要很長時間才能執行並觸發請求超時。例如:如何從另一個.aspx頁面獲取Global.asax中的log4net日誌信息?

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,我已經添加了一些錯誤處理,將電子郵件發送出任何異常:

問題是,在Global.asax,我只能訪問請求和響應以及發生的異常,但不是記錄器的輸出。我如何在Global.asax中訪問?如果沒有它,我就不知道在沒有挖掘日誌文件的情況下掛起應用程序的代碼,這是一項重要的過濾任務。

回答

0

'log'對象是一個靜態變量,嘗試在Global.asax Application_Error()中獲取它是不正確的。根據線程池中的當前線程,您可能會得到不可預知的值。 更安全的方法可以與log.Debug()一起插入一些調試數據到HttpContext.Current.Items。然後你可以在Application_Error()方法中訪問這些項目。 Context.Items被認爲是線程安全的,推薦在這種情況下使用。

+0

謝謝Tisho。使用'HttpContext.Current.Items'似乎適用於我。 –

0

另一種方法可以讓log4net使用電子郵件appender爲您發送電子郵件。看到這個例子:http://sradack.blogspot.co.uk/2007/09/have-log4net-send-email-when-error.html

+0

這個方法的問題在於它假設你正在碰到'_logger.Error()'行。在我的情況下,'InternalDoSomethingImportant()'阻塞了這個進程足夠長的時間,以至於超過了ASP.NET的默認超時時間。除了我不知道我的許多方法調用中的哪一個正在執行該塊。 –

+0

在這種情況下,請在執行它之前在httpcontext項目中記錄動作名稱並將其包含在錯誤消息中? –

+0

然後我不會爲每個記錄器消息收到一封電子郵件嗎?例如,我會收到一封電子郵件,內容是'線程休眠之前......和'線程休眠之後.'。 –

相關問題