我試過logj4
,將bufferedIO設置爲true,asynappender,但是最後大約有100行日誌被遺漏。java中多線程環境下的非常快的日誌記錄
在java中我們必須以非常快的速度進行日誌記錄時,用什麼方法可以更好地登錄多線程環境?
我們在20秒左右的時間內記錄了大約330MB ..顯然,我們可以看到記錄在兩者之間停止。最後一行是4094902:[11,12,17,14,15,16,13,10,3, 其中應該有多於200行的線
我試過logj4
,將bufferedIO設置爲true,asynappender,但是最後大約有100行日誌被遺漏。java中多線程環境下的非常快的日誌記錄
在java中我們必須以非常快的速度進行日誌記錄時,用什麼方法可以更好地登錄多線程環境?
我們在20秒左右的時間內記錄了大約330MB ..顯然,我們可以看到記錄在兩者之間停止。最後一行是4094902:[11,12,17,14,15,16,13,10,3, 其中應該有多於200行的線
您可能會感興趣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事件空間,但如果結果不足,可以配置爲系統屬性。
線路錯過?你是否將日誌分發到系統日誌?如果是這樣,你當然使用UDP。 – farvilain
登錄本地文本文件。 – Hemal
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