批量处理 / 批量日志记录器 (BulkLogger)

Version platforms

Bulk 是一个用于缓冲对象的库。管道 (Sink) 接收对象,并将缓冲后的对象批量发送。

它的用途是什么?

在某些情况下,打包大量元素会很有帮助。例如,使用内部 API 发送您产品的分析事件。

Bulk 模块

创建一个 Sink

我们将接收对象的管道称为 Sink

Sink 接收对象,并将缓冲后的对象批量发送到多个目标。

  1. 选择缓冲区。

要创建 bulk,我们可以选择几种类型的缓冲区。
目前,Bulk 提供以下两种类型。

在本教程中,我们选择 MemoryBuffer。

  1. 创建目标

Target(目标)从 Sink 接收批量处理后的对象。

Bulk 没有提供默认实现的 Target。
现在,您需要自己创建它。

public protocol TargetType {

  associatedtype Element

  func write(items: [Element])
}
struct MyTarget<Element>: TargetType {

  func write(items: [Element]) {
    print(items)
  }
}

最后,创建 BulkSink 对象。

let sink = BulkSink<String>(
  buffer: MemoryBuffer.init(size: 10).asAny(),
  targets: [
    MyTarget<String>().asAny()
  ]
)

发送对象

sink.send("A")
sink.send("B")
sink.send("C")

当 Buffer 接收的对象达到指定大小(示例中为 10 个元素)时,sink 会发送批量处理后的对象。

BulkLogger 模块

Logger 是基于 Bulk 之上的一个库。

BulkLogger 提供 Logger 对象,该对象封装了内部的 Sink

let logger = Logger(context: "", sinks: [
  BulkSink<LogData>(
    buffer: MemoryBuffer.init(size: 10).asAny(),
    targets: [

      TargetUmbrella.init(
        transform: LogBasicFormatter().format,
        targets: [
          LogConsoleTarget.init().asAny()
        ]
      ).asAny(),

      OSLogTarget(subsystem: "BulkDemo", category: "Demo").asAny()
    ]
  )
    .asAny()
])

Logger 对象将日志数据发送到 2 个目标 (LogConsoleTarget 和 OSLogTarget)。

logger.verbose("Hello")

许可协议

Bulk Framework 在 MIT 许可证下发布。