2010-03-02 106 views
2

我們使用log4net和AdoNetAppender將關鍵日誌寫入數據庫。由於AdoNetAppender是BufferedAppender的子類,因此可以啓用日誌事件的排隊。 我想要做的是保存備份&將日誌緩衝區恢復到本地文件,以便在數據庫關閉或應用程序崩潰時不會丟失任何日誌條目。log4net從BufferedAppender保存緩衝區

有人知道如何做到這一點嗎?

回答

1

不要以爲你可以保存緩衝區而無需自己編寫代碼。我寧願建議將日誌發送到AdoNetAppender和RollingFileAppender。第一個將確保您定期記錄到數據庫,第二個將確保最新的日誌也寫入磁盤。

更新:鑑於您以後的評論,我可以看到如何記錄到兩個不同的源(一個數據庫和一個本地存儲,文件或本地數據庫)難以整合。

Imo您絕對應該使用log4net來做最好的事情:一個經過驗證的真正的框架,用於從應用程序收集日誌數據並將數據路由到接收系統。在log4net之上構建故障轉移系統雖然不是它的設計目的。例如,在應用程序崩潰後,沒有可以拾取碎片的流程模型。

而是在接收系統中處理故障轉移。在數據庫級別和網絡級別進行故障切換可爲您帶來很長的路,但您無法保證100%的正常運行時間。通過登錄到本地商店,然後讓進程獲取日誌並將其發送到數據庫,可以最大限度地減少日誌數據丟失的風險,同時避免必須整合來自兩個不同商店的日誌。更好的是,日誌記錄仍然簡單快捷,因此對應用程序的影響很小。

另一種方法是記錄到本地數據庫並使數據庫作業將數據拖入主數據庫。你也可以使用排隊。有a sample MsmqAppender在那裏讓你開始。如果你使用的是MS SQL Server,你甚至可以使用the Service Broker作爲排隊功能。

+0

對我來說,看起來像擴展AdoNetAppender比編寫一個帶有序列化隊列的完整自定義數據庫記錄器更確切,以確保沒有日誌條目丟失。 – Alexander 2010-03-02 14:38:30

+0

@Alexander:你是說你不需要AdoNetAppender的緩衝功能?如果是這樣,那麼爲什麼不設置BufferSize爲0,這將有效地使appender日誌同步而無需緩衝。 – 2010-03-02 14:52:53

+0

...仍然可以在數據庫關閉時記錄日誌,您應該使用文件appender記錄到本地文件系統。 – 2010-03-02 14:57:12