Cosmic 是一个用 Swift 编写的日志报告框架。
Cosmic 提供了一个简单的接口来实现丰富的日志记录功能,包括:
Cocoapods
pod 'Cosmic', '~> x.y.z'
SPM
.Package(url: "https://github.com/jnewc/Cosmic", majorVersion: <MAJORVERSION>)
在您的类中支持日志记录器的最简单方法是扩展 DefaultLogReporter 协议。
import Cosmic
class MyClass: DefaultLogReporter {
// ...
}
扩展 DefaultLogReporter 协议会为您的类添加一个 logger 属性,该属性可用于报告日志消息。
func logSomething() {
// Debug level
self.logger.debug("Logging something")
// Info level
self.logger.info("Logging something")
// Warn level
self.logger.warn("Logging something")
// Error level
self.logger.error("Logging something")
}
默认情况下,LogReporter 提供的 logger 将是 PrintLogger 的一个实例 - 这可以通过实现 LogReporter 协议及其 DefaultLoggerType 关联类型来更改。
class MyClass: LogReporter {
typealias DefaultLoggerType: Logger = PrintLogger
// ...
}
或者,如果您想自己管理日志记录器,您可以根据需要简单地实例化它们。
let myLogger: Logger = PrintLogger()
您可以通过实现 LogReceiver 协议来创建自己的日志记录器。
class MyLogger: LogReceiver {
func onReceive(_ messages: [String], logLevel: LogLevel) {
// Do something with the log
}
}
(onReceive 方法只会为有效的日志级别调用,因此您无需在此处基于日志级别进行过滤。)
您可以在初始化器中添加格式化器。
init() {
formatters.append(SyslogFormatter())
}
并且您可以使用 format 方法格式化您的消息。
func onReceive(_ messages: [String], logLevel: LogLevel) {
messages.forEach { print(format($0)) }
}
Cosmic 为更复杂的使用场景提供了 CompositeLogger。CompositeLogger 将日志路由到多个日志记录器。
复合日志记录器的日志级别以传递方式用于其所有组件日志记录器。
下面的例子描述了一个记录到控制台、文件和 TCP Socket 的日志记录器。
let printLogger = PrintLogger()
let memoryLogger = MemoryLogger()
let socketLogger = SocketLogger(...)
let logger = CompositeLogger(printLogger, fileLogger, socketLogger)
您可以通过将 LogFilter 添加到 LogFilters.global 缓存来过滤日志记录器。 以下示例排除了所有名为 MyLogger 的基于 Logger 类的实例。
let filter = ClassBasedLogFilter()
filter.excluded.append(MyLogger.self)
LogFilters.global.addFilter(filter: filter)
注意:使用 ClassBasedLogFilter 时,included 和 excluded 互斥。如果两者都包含类型,则将使用 included,而 excluded 将被忽略。