Puree
描述
Puree 是一个日志聚合器,提供了以下功能。
- 过滤:在发送之前可以处理日志条目。您可以添加常见参数,进行随机采样...
- 缓冲:日志条目会存储在缓冲区中,直到发送的时间到来。
- 批量处理:多个日志条目将被分组并通过一个请求发送。
- 重试:如果在某个后退时间后出现传输错误,将自动重试发送。
Puree 帮助您统一您的日志基础设施。
目前处于开发中,因此界面可能发生变化。
安装
Carthage
github "cookpad/Puree-Swift"
CocoaPods
use_frameworks!
pod 'Puree', '~> 5.0'
Swift PM
Swift包管理器(Swift Package Manager)是一个用于自动化Swift代码分发的工具,它与swift
编译器集成。它目前处于早期开发阶段,但Puree-Swift已支持在支持的平台上使用它。
一旦您设置了Swift包,将Puree-Swift作为依赖项添加就像将其添加到Package.swift
的dependencies
值一样简单。
dependencies: [
.package(url: "https://github.com/cookpad/Puree-Swift.git", .upToNextMinor(from: "5.2.0"))
]
用途
定义自己的过滤器/输出
过滤器
过滤器
应将任何对象转换为LogEntry
。
import Foundation
import Puree
struct PVLogFilter: Filter {
let tagPattern: TagPattern
init(tagPattern: TagPattern) {
self.tagPattern = tagPattern
}
func convertToLogs(_ payload: [String: Any]?, tag: String, captured: String?, logger: Logger) -> Set<LogEntry> {
let currentDate = logger.currentDate
let userData: Data?
if let payload = payload {
userData = try! JSONSerialization.data(withJSONObject: payload)
} else {
userData = nil
}
let log = LogEntry(tag: tag,
date: currentDate,
userData: userData)
return [log]
}
}
输出
输出
应将日志条目输出到所需的位置。
下面的ConsoleOutput
将日志输出到标准输出。
class ConsoleOutput: Output {
let tagPattern: TagPattern
required init(logStore: LogStore, tagPattern: TagPattern) {
self.tagPattern = tagPattern
}
func emit(log: LogEntry) {
if let userData = log.userData {
let jsonObject = try! JSONSerialization.jsonObject(with: userData)
print(jsonObject)
}
}
}
缓冲输出
如果您使用 BufferedOutput
而不是原始的 Output
,日志条目将会被缓冲并在常规时间表中发出。
class LogServerOutput: BufferedOutput {
override func write(_ chunk: BufferedOutput.Chunk, completion: @escaping (Bool) -> Void) {
let payload = chunk.logs.flatMap { log in
if let userData = log.userData {
return try? JSONSerialization.jsonObject(with: userData, options: [])
}
return nil
}
if let data = try? JSONSerialization.data(withJSONObject: payload, options: []) {
let task = URLSession.shared.uploadTask(with: request, from: data)
task.resume()
}
}
}
创建记录器和发布日志
在实现筛选器和输出后,您可以使用 Logger.Configuration
进行路由配置。
import Puree
let configuration = Logger.Configuration(filterSettings: [
FilterSetting {
PVLogFilter(tagPattern: TagPattern(string: "pv.**")!)
}
],
outputSettings: [
OutputSetting {
PVLogOutput(logStore: $0, tagPattern: TagPattern(string: "activity.**")!)
},
OutputSetting {
ConsoleOutput(logStore: $0, tagPattern: TagPattern(string: "pv.**")!)
},
OutputSetting {
LogServerOutput(logStore: $0, tagPattern: TagPattern(string: "pv.**")!)
},
])
let logger = try! Logger(configuration: configuration)
logger.postLog(["page_name": "top", "user_id": 100], tag: "pv.top")
使用此配置,预期结果如下
标签名称 | -> [ 筛选器插件 ] | -> [ 输出插件 ] |
---|---|---|
pv.recipe.list | -> [ PVLogFilter ] |
-> [ ConsoleOutput ], [ LogServerOutput ] |
pv.recipe.detail | -> [ PVLogFilter ] |
-> [ ConsoleOutput ], [ LogServerOutput ] |
activity.recipe.tap | -> ( 无筛选器 ) | -> [ ConsoleOutput ] |
event.special | -> ( 无筛选器 ) | -> ( 无输出 ) |
我们建议在应用程序处于后台时暂停记录器。
class AppDelegate: UIApplicationDelegate {
func applicationDidEnterBackground(_ application: UIApplication) {
logger.suspend()
}
func applicationWillEnterForeground(_ application: UIApplication) {
logger.resume()
}
}
标签系统
标签
标签是由多个由 .
分隔的词组成。例如:activity.recipe.view
、pv.recipe_detail
。您可以自由选择要记录的标签。
模式
Filter
、Output
和 BufferedOutput
插件将应用于具有匹配标签的日志条目。您可以为插件的反应规则指定标签模式。
简单模式
模式 aaa.bbb
匹配标签 aaa.bbb
,不匹配标签 aaa.ccc
(完全匹配)。
通配符
模式 aaa.*
匹配标签 aaa.bbb
和 aaa.ccc
,但不匹配 aaa
或 aaa.bbb.ccc
(单个术语)。
模式 aaa.**
匹配标签 aaa
,aaa.bbb
和 aaa.bbb.ccc
,但不匹配 xxx.yyy.zzz
(零个或多个术语)。
日志存储
在这种情况下,如果一个应用程序无法发送日志条目(例如,网络连接不可用),Puree 将存储未发送的条目。
默认情况下,Puree 将它们存储在 Library/Caches
目录中的本地文件中。
您还可以定义自己的自定义日志存储,该存储支持任何存储(例如 Core Data、Realm、YapDatabase 等)。
有关详细信息,请参阅 LogStore
协议。