SwiftyTimber

SwiftyTimber 是另一个日志记录库,它 fork 自 PureLogger 并受到 Timber 的启发。

该库的主要目标是

安装

CocoaPods

最新版本

pod 'SwiftyTimber'

或者

pod 'SwiftyTimber', :git => "https://github.com/iballan/SwiftyTimber.git"

指定版本

pod 'SwiftyTimber', :git => "https://github.com/iballan/SwiftyTimber.git", :tag => "0.1.0"

Swift Package Manager

一旦你设置好你的 Swift 包,添加 SwiftyTimber 作为依赖项就像把它添加到你的 Package.swift 的 dependencies 值中一样简单。

dependencies: [
    .package(url: "https://github.com/iballan/SwiftyTimber.git", .upToNextMajor(from: "0.1.0"))
]

用法

种植一棵树的例子

// Static methods
#import SwiftyTimber
#if DEBUG
Timber.shared.plant(TimberDebugTree())
#else
Timber.shared.plant(TimberCrashlyticsTree())
#endif

// Then in your code
#import SwiftyTimber
Timber.i("This is info log")
Timber.d("This is debug log")
Timber.e("This is error log", error)

或者我更喜欢的

#import SwiftyTimber
#if DEBUG
let logger = Timber.shared.plant(TimberDebugTree())
#else
let logger = Timber.shared.plant(TimberCrashlyticsTree()).plant(AnotherTree())
#endif

// Then in your code
logger.i("This is info log")
logger.d("This is debug log")
logger.e("This is error log", error)

例子

种植一棵树以记录到 Crashlytics 的例子

import FirebaseCrashlytics

public class TimberCrashlyticsTree: TimberTree {
    public func print(_ message: String, _ error: Error?, level: TimberLogLevel?, filename: String, line: Int, column: Int, funcName: String) {
        guard level == .error else { return }
        let sourceName = getSourceFileName(filePath: filename)
        let systemInfo = "[\(sourceName)]:\(line) \(funcName)"
        let message = "\(item)"
        let keysAndValues: [String : Any] = [
            "level" : level?.name ?? "none",
            "filename" : filename,
            "line" : line,
            "column" : column,
            "systemInfo" : systemInfo,
            "message" : message
        ]
        Crashlytics.crashlytics().setCustomKeysAndValues(keysAndValues)
        if let error = error {
            Crashlytics.crashlytics().record(error: error)
        } else {
            Crashlytics.crashlytics().record(exceptionModel: ExceptionModel(name: "\(sourceName)-\(funcName)", reason: message))
        }
    }
    
    func getSourceFileName(filePath: String) -> String {
        let components = filePath.components(separatedBy: "/")
        return components.last ?? ""
    }
}