2012-04-05 159 views
2

我們使用log4net作爲我們當前的應用程序日誌記錄,但我不喜歡我們當前的日誌框架圍繞它構建的方式。例如,它目前有一個單點故障,如果由於某種原因它不能連接到日誌服務器,那麼你就沒有日誌記錄。我想將它構建爲一個靈活而簡單的框架,它允許我指定一個或多個「備份」appender,以便在主服務器失敗的情況下使用它(例如,如果日誌服務器關閉,寫入文件代替)。.NET日誌記錄框架設計

你們有沒有偶然發現過你喜歡的東西,發現寫得很好?我不介意我自己的滾動,但我儘量不推倒重來

感謝

+0

NLog允許指定多個日誌目標。 log4net不允許嗎? – 2012-04-05 19:22:55

+0

我認爲OP想要的是有多個日誌目標,但只有在主要目標不可用時才使用替代日誌目標。 – aKzenT 2012-04-05 19:35:13

+0

可能的重複:http://stackoverflow.com/questions/3244623/how-to-configure-log4net-for-fallback – aKzenT 2012-04-05 19:36:03

回答

2

沒有已經建成,我所遇到的任何一個大風扇。我建議你製作自己的appender,使用現有的appender,但在失敗發生時在該屬性中添加了該做什麼。你可以使用AppenderSkeleton作爲新的appender的基類,然後從那裏調用你想使用的appender的附加函數。

所以當LOG4使用您的記錄它會是這樣的(注意:這是不完整的,但應該給你一個起點):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using log4net.Appender; 
using log4net.Core; 

namespace logger { 
    class FailoverAppender : AppenderSkeleton { 

     protected override void Append(LoggingEvent loggingEvent) { 
      // Send the log message to the web service. 
      try { 
       FirstAppender.Append(loggingEvent); 
      } 
      catch (Exception e) { 
       try{ 
        SecondAppender.Append(loggingEvent); 
       } 
       catch (Exception e2){ 
        ErrorHandler.Error("An error occurred while connecting to the logging service.", e); 
       } 
      } 
     } 
    } 
} 

我希望這可以幫助你上手,也許如果你完成後你可以在這裏發佈解決方案。

+0

感謝凱文,這是一個不錯的方法......我其實寫了一些類似於log4j的東西但這可能是5-6年前,不幸的是我找不到該死的代碼。如果我找到了一些東西,或者只是從頭開始寫,歡呼,我一定會回到這裏 – snappymcsnap 2012-04-05 21:15:26

0

我實際上決定使用NLog來取代它,因爲log4net對於設置來說非常痛苦。 NLOG更容易使用,更容易設置和代碼庫保持最新(log4net的是幾乎放棄)

5

SeqSerilog組合支持這一點:記錄器緩衝區的所有事件一組滾動文件,然後異步讀取這些文件並使用HTTP/S將它們發送到服務器。

配置是這樣的:

var log = new LoggerConfiguration() 
    .WriteTo.Seq("http://my-seq-server", bufferBaseFilename: "C:\\Logs\\myapp") 
    .CreateLogger(); 

我在兩個工作項目 - 渴望得到這一做法如何符合該法案的一些反饋(如果你足夠幸運,能夠切換到Serilog;))