2010-01-18 26 views
7

這人真的有我抓我的頭....爲什麼會log4net的條目去「失蹤」,在一些聽衆

我一直在使用log4net的(當前版本1.2.10),在一段時間的應用程序。在嚮應用程序添加新選項的同時,我注意到即使log4net Debug,Error等方法從該日誌源調用的項目不會被控制檯appender看到。

檢查了顯而易見的東西(比如確保沒有涉及過濾),我注意到其他奇怪的東西。如果我有多個appender(例如,日誌文件appender和UDP appender),那麼appender有時會看到不同的日誌消息子集。他們看到的哪個子集似乎是隨機的,但通常當問題發生時,他們將無法看到來自給定日誌源的所有消息。

爲什麼會發生這種情況,我該如何處理它,因爲丟失的消息意味着不能信任日誌文件以顯示遠程故障的準確畫面?

[如下的添加1月19的其他信息,2010

我終於把在ILog的對象好好看看響應獲取傳遞迴調用

LogManager.GetLogger(typeof (MyTypeHere)); 

在某些情況下,我我得到一個ILog對象與調試,信息,警告,錯誤等設置爲false。在其他情況下,ILog對象將它們正確設置爲true。由於我的代碼沒有任何操作這些標誌,所以在我的代碼被傳遞的時候,我的代碼中的「disabled」ILog對象消息(可以理解)根本不會被傳播。

我仍不能解釋兩個appender之間的明顯差異。

+0

是否有涉及緩衝?我知道我的文件不會立即更新...如果有時出錯,緩衝區可能永遠不會發送給appender? – 2010-01-18 20:46:59

+1

嗨,你到底了嗎?我在AdoNetAppender和RollingLogFile Appender之間遇到了同樣的問題 – richardwhatever 2015-07-04 19:29:56

+0

不,我從來沒有完全解決過這個問題,但是觀察到問題的那段代碼被重寫,並且所有記錄器被禁用的ILog對象偶爾出現。我們最好的猜測是,可能存在某種奇怪的競態條件,偶爾會導致GetLogger調用在日誌初始化完成之前返回實例化的記錄器。 – 2015-07-07 20:18:51

回答

1

我們經常一起使用日誌文件,控制檯和smtp appenders,我們似乎沒有這些問題。在某些情況下,一些appender可能會由於其固有特性而失去信息。例如,由於傳輸機制,UDP appender不保證傳輸所有消息。 SMTP appender也會發生同樣的情況。如果您使用的是通用日誌文件,但是從多個進程登錄,有時該文件被另一個進程鎖定(這通常會引發異常,但它可能會在代碼的某處被捕獲),因此請確保將最小鎖定屬性在上面。此外,appender可以被緩衝,所以如果出現進程崩潰,log4net可能沒有機會清除緩衝的數據。

最後,最可靠的appender是那些本地登錄的appender,比如文件和事件日誌appender,但是你必須收集所有的日誌。如果您想要集中登錄,則可能需要考慮記錄到數據庫或消息隊列。

+0

關於像UDP這樣的非本地appender的好處。我發現很奇怪的事情是,UDP appender實際上比捕獲控制檯的捕獲更多。正如我還向Konrad發表的評論,問題看起來與執行有關。對於來自事件源X的應用程序的給定運行,可能會或可能不會被記錄...但是它們的存在(或不存在)對於該運行是一致的。 – 2010-01-19 13:28:16

+0

這很奇怪。你是從正在運行的應用程序的線程登錄,還是在寫入日誌時使用線程池或其他線程機制? – jvilalta 2010-01-19 15:52:28

+0

日誌條目(或至少應該是)來自應用程序線程,或者通過QueueUserWorkItem機制使用ThreadPool處理的工作項。來自兩個線程源的日誌條目似乎都出現在我所做的所有測試中。 – 2010-01-19 20:48:26

1

我是否正確理解某些正常記錄成功的消息在某些時刻突然停止出現(正在記錄)?如果是這樣的話,那麼我會建議打開log4net的內部日誌記錄。另外用log4net代碼來調試這個問題(你的問題我建議在Logger類中的CallAppenders方法的某個地方打破它,它會告訴你哪些appender實際上會被記錄事件調用)。

如果一些消息始終未被記錄,那麼我會查看log4net配置。檢查是否設置了任何級別/閾值,更重要的是,如果您正在使用記錄器,請檢查其名稱並確保放入LogManager.GetLogger(...)調用中的任何前綴與配置中的名稱記錄器匹配。

我加倍jvilalta說。多年來,我一直在使用log4net來處理多種類型的appender,而且我還沒有看到只有一些appender會丟失消息的情況,但並非全部。

+0

這是我第一次看到這個問題。我以前只有log4net的成績,而且從來沒有擔心輸入項會丟失 - 至少在去當地的appenders這樣的文件的時候是這樣的)。奇怪的是它似乎是執行依賴。對於來自事件源X的應用程序的給定運行,可能會或可能不會被記錄......但是它們的存在(或不存在)與該應用程序的執行一致。 – 2010-01-19 13:25:55

0

我知道這是舊的,但我最近在asp.net mvc應用程序中發生過這種情況,而且追查真的很令人沮喪。它似乎發生在使用ValidateInput(false)屬性的方法上。

我的猜測是,使用此屬性可以跳過初始化log4net在記錄時嘗試訪問的一些數據。我發現添加以下內容到我的web.config中修復了這個問題:

<httpRuntime requestValidationMode="2.0" /> 

當然,它有其他副作用(與日誌記錄無關)。