基于無鎖隊列(RingBuffer)實現的具備輪轉功能的異步日志:AsyncLogger
異步日志,參考Log4j2的異步日志和文件輪轉機制,重新抽象結構實現。
用途
- 對吞吐量有所要求(RingBuffer + ByteBuffer + FileChannel)。
- 不希望耦合或依賴log4j2/logback等日志框架。需要單獨隔離。
特點
- CachedClock:后臺線程計算時間。
- ParallelFlusher:異步刷新器,生產者/消費者模式(無鎖隊列),同一事件只被一個消費者消費。多消費者并行消費。單條”通知“模式。
- InvokeFlusher:異步刷新器,生產者/消費者模式(無鎖隊列)。同一事件被所有消費者消費,多消費者之間可控制消費順序(通過Group)。批量”通知“模式。
- BatchForwarder:批量聚合器,用于聚合單條記錄轉為批量。
- DefaultLogger:普通日志(ByteBuffer + FileChannel)。
- RollingLogger:輪轉日志(支持日期格式自動識別、索引、壓縮;按時間、文件大小識別輪轉)
- AsyncLogger:采用InvokeFlusher實現。
- FilterableLogger:支持過濾的日志。
- LoggerBuilder:用于生成日志(DefaultLogger/RollingLogger/AsyncLogger/FilterableLogger)的構造器。
相關屬性
DefaultLogger
- immediateFlush:每次都同步落盤,默認為false。
- fileName:文件名,必填。
- isAppend:是否對日志進行追加,默認為true。
- fileBufferSize:ByteBuffer申請大小,默認512 * 1024。
- useDirectMemory:是否使用DirectMemory,默認為true。
- clock:時鐘,默認采用CachedClock。
- exceptionHandler:異常處理器。
DefaultLogger
- filePattern:文件pattern,必填,支持日期和索引,如test.%d{yyyy-MM-dd}.%index.log.gz。
- maxFileSize:輪轉條件之最大文件大小,默認為50 * 1024 * 1024,設置為0表示不限制大小。
- interval:輪轉條件之時間間隔,默認為1,視pattern是否包含日期而起作用,如格式為yyyy-MM-dd,則間隔為day級別。
- modulate:輪轉條件之時間是否截斷,默認為true,視pattern是否包含日期而起作用,如格式為yyyy-MM-dd- HH,interval為1,當前時間為02:12,若modulate為false,則03:12進行輪轉,若為true,則表示3:00進行輪轉。
- minIndex:視是否包含%index而起作用,默認為1.
- maxIndex:視是否包含%index而起作用,默認為30。
- useMax:視是否包含%index而起作用,默認為false,表示使用minIndex、
- compressionBufferSize:壓縮buffer大小,默認為1024 * 512。
AsyncLogger
- waitStrategy:等待策略,參考InvokeFlusher,可根據延遲、性能等情況,自行選擇(自旋、讓步、讓步 + 等待、鎖和條件)。
- producerType:標識生產者類型,單生產者和多生產者,默認為多生產者。
- bufferSize:RingBuffer大小,默認為512 * 1024。
- notifySize:通知大小。默認為1024。用于手動報告RingBuffer當前位置。
使用
// 一直輸出到test.log。 Logger logger = LoggerBuilder.of("test.log", new TestExceptionHandler()).build(); // 一直輸出到test.log,使用HeapByteBuffer。 Logger logger = LoggerBuilder.of("test.log", new TestExceptionHandler()).setUseDirectMemory(false).build(); // 一直輸出到test.log,使用異步方式。 Logger logger = LoggerBuilder.of("test.log", new TestExceptionHandler()).async().build(); // 一直輸出到test.log,使用異步方式,設置RingBuffer大小。 Logger logger = LoggerBuilder.of("test.log", new TestExceptionHandler()).async().setBufferSize(1024 * 20).build(); // 一直輸出到test.log,帶有日志輪轉功能。 Logger logger = LoggerBuilder.of("test.log", new TestExceptionHandler()).rolling("test.%d{yyy-MM-dd}.%index.log.gz").build(); // 一直輸出到test.log,帶有日志輪轉功能。yyy-MM-dd級別下最多保留10份。 Logger logger = LoggerBuilder.of("test.log", new TestExceptionHandler()).rolling("test.%d{yyy-MM-dd}.%index.log.gz").setBackupSize(10).build(); // 一直輸出到test.log,使用異步方式,帶有日志輪轉功能。yyy-MM-dd級別下最多保留10份。 Logger logger = LoggerBuilder.of("test.log", new TestExceptionHandler()).rolling("test.%d{yyy-MM-dd}.%index.log.gz").setBackupSize(10).async().build(); // 帶有過濾功能的日志。 Logger filterLogger = LoggerBuilder.filter(logger, new Filter1(), new Filter2());
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!