2012-06-20 181 views
1

我有一個運行整天數據轉換和同步的工具。Log4Net停止記錄

如果應用程序暫時停止運行,這不是什麼大事,但它必須記錄它的操作。我寧願應用程序失敗,也不願意登錄。我遇到了幾個涉及這個主題的帖子,但我無法獲得任何解決方案。

我需要設置一種停止運行應用程序的方法(取決於應用程序設置),並在Log4Net停止記錄時發出警告電子郵件。

我爲我的附加目的地:

<log4net> 
<appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
    <errorHandler type="SomeApp.PresentationLayer.Log4NetErrorHandler" /> 
    <file type="log4net.Util.PatternString" value="H:\SomeApp-%property{RegNo}-log.txt" /> 
    <appendToFile value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <header value="[START]" /> 
    <footer value="[END]" /> 
    <conversionPattern value="%date %-5level - %message%newline" /> 
    </layout> 
</appender> 
<!-- Setup the root category, add the appenders and set the default level --> 
<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="LogFileAppender" /> 
    <!-- <appender-ref ref="A" /> --> 
</root> 

這是我的錯誤處理程序:

namespace SomeApp.PresentationLayer 
{ 
class Log4NetErrorHandler : IErrorHandler 
{ 

    public bool HandleError(Exception ex) 
    { 
     //Trace.TraceError(ex.ToString()); 
     ExceptionUtil.GetAndLogMessage(ex, "Log4Net Error in SomeApp", false, true); 

     return false; 
    } 

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
    { 
     // Shield the unknown exception 
     FaultException faultException = new FaultException(
      "Server error encountered. All details have been logged."); 
     MessageFault messageFault = faultException.CreateMessageFault(); 

     fault = Message.CreateMessage(version, messageFault, faultException.Action); 
    } 
} 
} 

無論我怎麼努力,異常處理程序永遠不會觸發。我將日誌文件設置爲映射的驅動器。當它正在記錄時,我斷開驅動器,它永遠不會向我的異常處理程序拋出異常。任何人都能看到我失蹤的東西?

我使用C#.NET 3.5的log4net 1.2.10

感謝提前任何幫助。

回答

0

我實際上並沒有使用log4net errorHandlers,可能完全在這裏,但我的直覺告訴我,errorHandler是用來配置處理log4net異常,而不是應用程序異常,並且關於這方面的信息很少主題是一個關於errorHandler參數的博客文章可能會讓你感到困惑。從SDK文檔:

Implements log4net's default error handling policy which consists of emitting a 
message for the first error in an appender and ignoring all subsequent errors. 

不是很有幫助,我承認,但它似乎並沒有做你的想法。 您必須在您的應用程序中正確處理應用程序異常,並自己登錄該消息以在日誌中查看它。

並且有another question here可能提供額外的線索。

+0

是的,這就是我想要的。我想在Log4net中處理錯誤,而不是在我的應用程序中。 Log4Net以出現錯誤時不會崩潰應用程序而聞名。問題是,我仍然需要使用Log4Net,但如果它停止記錄,我想要這些錯誤。它的默認模式是默默停止記錄。根本沒有通知。 –

+0

我簡直不敢相信我錯過了解決方案。我混淆了log4net.Core.IErrorHandler和.net IErrorHandler。我應該從簽名中認識到它。感謝那個鏈接。 –