Spy 是一个灵活、轻量级的跨平台日志工具,使用 Swift 完全编写。它允许在不同的级别和通道上记录日志,您可以根据自己的需求自行定义。
要求
开发
项目使用以下工具进行开发
安装
要开始使用 Spy,您首先必须决定如何将其集成到您的项目中。Spy 支持以下工具
CocoaPods
要使用 Cocoapods 安装 Spy,请按照以下步骤操作
- 在您的 Podfile 中添加以下条目
pod 'Spy'
- 然后运行
pod install
。
Carthage
要使用Carthage安装Spy,请按照以下步骤进行
- 请将以下条目添加到您的Cartfile中
github "appunite/Spy"
- 然后运行
carthage update
Swift包管理器
要使用Swift包管理器安装Spy,请按照以下步骤进行
- 在您的Package.swift中添加以下包依赖项:
.package(url: "https://github.com/appunite/Spy.git", from: "0.5.0")
- 在您的Package.swift中添加以下目标依赖项:
dependencies: ["Spy"])
例如,它可能看起来像这样
import PackageDescription
let package = Package(
name: "YourLibrary",
products: [
.library(
name: "YourLibrary",
targets: ["YourLibrary"])
],
dependencies: [
.package(url: "https://github.com/appunite/Spy.git", from: "0.5.0")
],
targets: [
.target(
name: "YourLibrary",
dependencies: ["Spy"])
]
)
概述
以下是关于Spy使用的功能和概念的快速概述。
SpyChannel
SpyChannel是指实现了PSpyChannel协议的事物。频道可用于分类日志。通常,它们是用枚举实现的。您可以按照以下方式定义自己的频道:
public enum SpyChannel: String, PSpyChannel {
case foo
case bar
public var channelName: String {
return self.rawValue
}
}
SpyLevel
SpyLevel是指实现了PSpyLevel协议的事物。您可以定义自己的级别,但Spy 还附带了一个预设集合供您使用,如果您愿意,可以采用它。这个集合称为 SpyLevel,其中包含以下警报级别: finest, finer, fine, config, info, warning, severe,按递增的警报优先级排序。
Spy配置
该配置包含Spy将监视的级别和频道。
间谍配置构建器
通过提供添加和移除功能,构建您的间谍配置,适用于各级别和渠道。示例用法
SpyConfigurationBuilder()
.add(level: .severe)
.add(channels: [.foo, .bar])
.build()
可间谍化
可间谍化是一个可记录的实体,必须实现PSpyable协议。您可以定义自己的可间谍化实体或使用字符串作为基本的一个。
观察到
观察到是一个属性包装器,允许记录任何对属性的更改和访问。示例用法
class Foo {
@Spied(spy: Environment.spy, onLevel: .info, onChannel: .foo) var foo = "foo"
}
间谍
间谍是实现了PSpy协议的任何东西。已经定义了一些间谍供您使用
- ConsoleSpy - 使用print命令记录间谍化的间谍
- FileSpy - 将间谍化记录到文件系统中(允许创建monolith或chunked日志)
- CompositeSpy - 将多个间谍组合为一个的间谍
- AnySpy - 类型擦除式间谍 - 任何一个间谍都可以转换为AnySpy
使用log方法进行记录,如下所示
spy.log(level: .severe, channel: .foo, message: "Something bad happened")
ConsoleSpy
ConsoleSpy提供了两个可用的输出格式化器:RawSpyFormatter和DecoratedSpyFormatter,后者可以通过装饰器进行扩展。您始终可以定义自己的输出格式化器。例如,RawSpyFormatter的输出可能如下所示
info::foo::Hello Spy
例如,DecoratedSpyFormatter的输出可能如下所示
ℹ️ info::foo::Hello Spy
示例
本例定义了间谍的示例。它使用 CompositeSpy 允许您登录多个目的地(《控制台》和《文件》)。
public static var spy: AnySpy<SpyLevel, SpyChannel> = {
return CompositeSpy()
.add(spy: ConsoleSpy<SpyLevel, SpyChannel, DecoratedSpyFormatter>(
spyFormatter: DecoratedSpyFormatter(
levelNameBuilder: DecoratedLevelNameBuilder<SpyLevel>()
.add(decorator: EmojiPrefixedSpyLevelNameDecorator().any())
),
timestampProvider: CurrentTimestampProvider(),
configuration: SpyConfigurationBuilder()
.add(levels: SpyLevel.levelsFrom(loggingLevel))
.add(channel: .foo)
.build()).any())
.add(spy: FileSpy<SpyLevel, SpyChannel, DecoratedSpyFormatter>(
logFile: LogFile(
type: .chunked(maxLogsPerFile: 3),
directoryURL: logDirectoryURL),
spyFormatter: DecoratedSpyFormatter(
levelNameBuilder: DecoratedLevelNameBuilder<SpyLevel>()
.add(decorator: EmojiPrefixedSpyLevelNameDecorator().any())
),
timestampProvider: CurrentTimestampProvider(),
configuration: SpyConfigurationBuilder()
.add(level: .severe)
.add(channels: [.foo, .bar])
.build()).safe().any()
).any()
}()
通过使用预处理器,可以为调试和发布定义不同的日志级别。这样我们就可以在发布前不忘记关闭不重要的日志。
public extension Environment {
static var loggingLevel: SpyLevel {
#if DEBUG
return .info
#else
return .warning
#endif
}
}
以下是使用间谍的方法
Environment.spy.log(level: .info, channel: .foo, message: "Hello Spy")
更详细的示例请参阅源代码。
贡献
该项目由 Tomasz Lewandowski 创建和维护。
如果您添加了新功能或修复了错误,您可以提出合并请求。如果您有任何功能请求,请随时提交。
许可
间谍是根据MIT许可证发布的。有关更多信息,请参阅 License.md。