基于無鎖隊列(RingBuffer)實現的具備輪轉功能的異步日志:AsyncLogger

jopen 9年前發布 | 20K 次閱讀 日志處理 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());

項目主頁:http://www.baiduhome.net/lib/view/home/1442328618430

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!