2010-03-16 81 views
16

我們使用log4net來記錄winform應用程序的事件和錯誤。 我們的客戶希望在應用程序運行期間檢查日誌文件。 但我找不到log4net何時以及如何執行寫(提交)操作。 以及如何滿足客戶的要求,除了自己創建另一個記錄器。 有什麼幫助嗎?謝謝。log4net何時將日誌寫入或提交到文件?

+0

我們在我們的Windows Forms應用程序中使用log4net,我們對此沒有任何問題。事件和文件更新之間有一些延遲,但我們談論的是秒數。也許問題出在別的地方? – 2010-03-16 08:01:18

+1

是的,也許我們的客戶的問題是第二種情況。正如Peter所說,我們將通過MemoryAppender解決這個問題。 謝謝大家,尤其是彼得。你的答案更有幫助。 – Jollian 2010-03-17 07:14:08

回答

8

如果您使用的FileAppender,該附加器繼承了TextWriterAppender,這又暴露了ImmediateFlush財產。默認情況下,此屬性的值爲true,並強制appender爲每個追加操作在基礎流上執行Flush()

根據您設想客戶「監視」日誌文件的方式,一個想法可能是啓用應用程序內的監視。除了附加到文件之外,還可以使用the MemoryAppender並從該appender讀取事件。

-1

你說的是日誌文件,所以大概你在用FileAppender或派生類。這會默認緩衝輸出。緩衝輸出效率更高,所以爲了滿足您的要求,我建議您在查看日誌之前提供一些刷新日誌的機制,而不是在每次寫入操作後強制進行提交。

您可以像下面的代碼做到這一點:

foreach (IAppender appender in LogManager.GetRepository().GetAppenders()) 
{ 
    BufferingAppenderSkeleton b = appender as BufferingAppenderSkeleton; 
    if (b != null) b.Flush(); 
} 
+1

「這會默認緩衝輸出。」 這是不正確的! FileAppender(更具體地說它的基類TextWriterAppender)在每個Append操作後都會刷新!請參閱http://logging.apache.org/log4net/release/sdk/log4net.Appender.TextWriterAppender.ImmediateFlush.html 因此,您不需要執行任何操作,因爲最新的日誌條目將始終立即寫入文件,以便您的客戶可以簡單地打開文件。 – gehho 2010-03-16 07:38:06

+1

@gehho是對的。 FileAppender不緩衝。緩衝的內置appender是AdoNet-,BufferingForwarding-,Remoting-和SmtpXXX appender。 – 2010-03-16 08:37:05

1

我在SharePoint實例中使​​用log4net時注意到的一件事是,根據您的安全配置和配置加載的實現,加速應用程序池的用戶可能沒有寫權限本地文件系統來創建日誌文件。

因此,您需要確保使用正確的憑據調用您的配置,在SharePoint中它將處於提升的安全上下文中。不完全相關,但它可能是你遇到的一個問題。

0

請參閱this SO發佈瞭如何以編程方式刷新log4net日誌。 Joe的回答雖然稍微不準確,但代碼大致相同,所以大概可以用於沖洗所有緩衝的appender。