log4cpp的RollingFileAppender異常情況下日誌文件不拆分的一種可能解決方法

在使用log4cpp幾年下來,也是接二連三地發現log4cpp實現上的隱患。

最開始是發現log4cpp不同的Category向同一個日誌文件輸出,就會出現些莫名其妙的問題,遂寫了log4cpp多線程缺角的文章。當時還因此問題給log4cpp開發者反饋bug,而log4cpp開發者認爲不應該這樣使用,他們認爲每個Category用於獨立的日誌輸出位置。

所以,當時就自己動手修改源碼進行編譯了。不過,在即使動了那個地方的隱患後,還是偶發地會出現日誌文件無法完成切分的問題。

這次還是因爲無法切分的故障,再次用放大鏡的視角去觀察RollingFileAppender的源碼,配合使用win7任務管理器性能Tab頁下資源監視器以發現文件佔用情況,發現log4cpp RollingFileAppender使用POSIX rename文件接口函數實現文件切換。但是其在實現上沒有考慮rename失敗的情況,所以,在一些特殊情況下,則會造成日誌只向一個文件輸出,從而造成此文件過大,甚至佔滿磁盤。

    這個異常情況,比較常見的情況就是在當rename時,日誌文件被其他地方也open了。例如,有人在查看分析日誌,但是因爲某種原因忘記關閉了。在這種異常情況下,log4cpp就沒有辦法自身完成rename,所以,也就無法切分了。

    因爲日誌文件被其他地方open是無法自身解決的問題,所以,只能兩害相較取其輕,再次選擇了修改log4cpp源碼,判斷在出現這種異常情況的時間,就對日誌文件採取截取打開文件方式而不是追加的文件方式。

寄希望這次能夠很好地解決這個問題,我還是很信賴log4cpp的:)
注:log4cpp的源碼撰寫的還是非常漂亮的,從中也學到不少知識。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章