Puree 5.2.0

Puree 5.2.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布上次发布2021年2月

Tomohiro MoroYuya HirayamaaomathwiftgiginetKenta AikawaAtsuya SatoYuji Fujisaka 维护。



Puree 5.2.0

  • Tomohiro Moro,Kohki Miki 和 Vincent Isambart

Puree

Build Status Language Carthage compatible CocoaPods Compatible Platform License

描述

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.swiftdependencies值一样简单。

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.viewpv.recipe_detail。您可以自由选择要记录的标签。

模式

FilterOutputBufferedOutput 插件将应用于具有匹配标签的日志条目。您可以为插件的反应规则指定标签模式。

简单模式

模式 aaa.bbb 匹配标签 aaa.bbb,不匹配标签 aaa.ccc(完全匹配)。

通配符

模式 aaa.* 匹配标签 aaa.bbbaaa.ccc,但不匹配 aaaaaa.bbb.ccc(单个术语)。

模式 aaa.** 匹配标签 aaaaaa.bbbaaa.bbb.ccc,但不匹配 xxx.yyy.zzz(零个或多个术语)。

日志存储

在这种情况下,如果一个应用程序无法发送日志条目(例如,网络连接不可用),Puree 将存储未发送的条目。

默认情况下,Puree 将它们存储在 Library/Caches 目录中的本地文件中。

您还可以定义自己的自定义日志存储,该存储支持任何存储(例如 Core Data、Realm、YapDatabase 等)。

有关详细信息,请参阅 LogStore 协议。