2014-01-05 94 views
2

我試過logj4,將bufferedIO設置爲true,asynappender,但是最後大約有100行日誌被遺漏。java中多線程環境下的非常快的日誌記錄

在java中我們必須以非常快的速度進行日誌記錄時,用什麼方法可以更好地登錄多線程環境?

我們在20秒左右的時間內記錄了大約330MB ..顯然,我們可以看到記錄在兩者之間停止。最後一行是4094902:[11,12,17,14,15,16,13,10,3, 其中應該有多於200行的線

+0

線路錯過?你是否將日誌分發到系統日誌?如果是這樣,你當然使用UDP。 – farvilain

+0

登錄本地文本文件。 – Hemal

+0

Logger rootLogger = Logger.getRootLogger(); rootLogger.setLevel(Level.INFO); PatternLayout layout = new PatternLayout(「%m%n」); RollingFileAppender fileAppender = new RollingFileAppender(layout,「somefile.log」); fileAppender.setAppend(false); fileAppender.setMaxFileSize(「25MB」); fileAppender.setMaxBackupIndex(100); fileAppender.setImmediateFlush(false); fileAppender.setBufferedIO(true); rootLogger.addAppender(fileAppender); – Hemal

回答

2

您可能會感興趣Log4j2中新增的異步記錄器: http://logging.apache.org/log4j/2.x/manual/async.html

它們使用LMAX Disruptor這是一個無鎖數據結構設計,以減少(甚至消除)鎖爭用,往往是在多線程場景吞吐量瓶頸罩下。

Performance AsyncLoggers比AsyncAppender好一點,特別是當許多線程正在記錄時。配置很簡單,只需使用普通的log4j2配置(它與log4j-1.x不同,順便說一下)和一個使所有記錄器AsyncLogger的系統屬性。

您可能還想使用Log4j2中新增的RandomAccessAppender,因爲它比標準FileAppender更快。 RandomAccessAppender和FileAppender與異步日誌記錄配合使用時可以配置爲immediateFlush="false",並且所有事件仍將刷新到磁盤(這是我對Log4j-1.x的主要抱怨)。

爲了您的特殊需要,在20秒內記錄330MB,我會建議從默認AsyncLogger.RingBufferSize開始,因爲它非常大,有256K事件空間,但如果結果不足,可以配置爲系統屬性。

+0

感謝Remko,我已經讀過它,看起來很有前途,但不知道什麼是使用它的配置,將工作和更新。謝謝。 – Hemal

+0

我正面臨配置它的問題,你能否提供參考來配置相同的XML或編程?謝謝。 – Hemal

+0

你看到什麼問題?手冊頁(上面的第一個鏈接)有很好的配置示例。你可以在你的main方法中以編程方式調用System.setPropery。 –

相關問題