Log4s
Log4s 是为一个 swift 项目提供的日志库,它允许您非常灵活地进行记录。
它是从 Log4swift 分支出来的,但现在由Log4s团队维护。
它的最终目标是成为您优化日志价值的工具,无论是在您的开发和生产环境中。
兼容性
当前版本需要 Xcode 9 和 swift 4.1。
- 对于 swift 3,请使用版本 1.0.2(《标签 v1.0.2》)
- 对于 swift 2.3,请使用版本 1.0.0b5(《标签 v1.0.0b5》)
它可以用于目标 OS X (>= 10.10), iOS (>= iOS 8) 或 appleTV 的项目,并且可以用 swift 或 objective-C 写作(或两者的组合)。
如何使用
手动
在您的机器上克隆仓库,并编译适合您需要的目标(OS X、iOS 等)。这将生成一个库,您可以在项目中使用。由于 Swift ABI 仍未稳定,如果您更改用于项目的编译器版本,则需要重新编译库。因此,您最好考虑其他方法(见下文)。
CocoaPod
将这些行添加到您的 Podfile 中,以便将此库嵌入 iOS 项目(包含您想要的库和目标版本)
platform :ios, '8'
pod 'Log4s', '1.2.0'
use_frameworks!
并在 OS X 项目中
platform :osx, '10.10'
pod 'Log4s', '1.2.0'
use_frameworks!
功能
以下是您可以期望从 Log4s 获得的主要功能
- 简单情况下易于使用:默认配置应该可以直接使用,例如将日志记录到 IDE 控制台或系统日志的配置为一行
- 复杂情况下更加灵活,具有多目标日志记录、分层日志记录器配置等
- 提供多个目标,包括使用 NSLogger 的网络日志记录
- 文件日志记录
- 使用 NSLogger 的网络日志记录
- Xcode 控制台日志记录,包括着色日志(如果已安装 XcodeColors 插件)
- 可通过代码动态配置
- 可通过文件配置,具有自动在更新时重新加载的可能性(可选功能)
- 异步日志记录,在辅助线程上执行(可选功能)。异步行为可以针对每个日志记录器独立激活
另一个目标,我相信我们都有共鸣,是要有易于阅读和测试的代码。
- Log4s 代码覆盖率(不包括第三方代码)对于大多数源文件为 100%,对于其他文件非常接近
- 如果您觉得代码不够清晰,或者有提高代码质量的想法,请随时提出反馈或贡献力量!
概念
本库的主要三个概念借鉴自log4j。
日志记录器
日志记录器是日志首先发送的对象。它们由一个层次结构化的UTI(例如 "project.module.function")标识符识别。当发送日志消息时,最长匹配UTI的记录器将负责处理日志。根记录器将处理没有匹配特定记录器的日志。
记录器定义一个阈值级别。低于此级别的日志将被忽略。非忽略级别将发送到与记录器关联的附加器。
附加器
附加器连接到记录器。它们负责将日志写入目标设备。它们通过一个标识符来识别,该标识符在加载配置时用于将附加器附加到它们的记录器。一个附加器可以连接到多个记录器。
附加器还可以设置一个阈值来过滤消息。
格式化器
格式化器连接到附加器。它们的任务是修改消息,在将其发送到最终目标之前应用特定格式。一个格式化器可以连接到多个附加器。
关于功能的更多详细信息
每个日志器可以有多个追加器
一个日志器可以拥有多个追加器。例如,您可以定义一个将所有内容记录到控制台的日志器,但也将错误消息记录到文件供以后使用。
let logger = Logger.getLogger("test.logger");
let stdOutAppender = StdOutAppender("console");
let fileAppender = FileAppender(identifier: "errorFile", filePath: "/var/log/error.log");
stdOutAppender.thresholdLevel = .Debug;
fileAppender.thresholdLevel = .Error;
logger.appenders = [stdOutAppender, fileAppender];
logger.debug ("This message will go to the console");
logger.error ("This message will go to the console and the error log file"); }
(此代码在Xcode 7.3上编译,使用swift 2.2)
与追加器关联的格式化程序
格式化程序允许您为日志消息应用特定的格式化规则,可以向日志消息中添加信息或修改消息以满足某些约束条件。
格式化程序与追加器关联。这样,您可以将人类可读的日志记录到Xcode的控制台,同时在文件中记录更具有正则表达式友好格式的更多信息。
使用闭包进行日志记录
如果您生成的消息代码较重,提供闭包而不是字符串非常方便:只有当需要发出日志时,才会执行闭包。无需将代码封装在if结构中。
Logger.debug { someHeavyCodeThatGeneratesTheLogMessage() }
请注意,创建闭包不是完全没有代价的(幕后有一些魔法,比如变量捕获)。但对于大多数用途来说,这种成本应该可以忽略不计。
异步日志记录
可以将记录器单独配置以进行异步日志记录。异步日志记录在请求日志时会立即返回,而实际日志将在后台以低优先级线程上发布。
异步记录器的日志消息顺序得到保证。
注意,如果异步记录器会在更晚的时间执行记录的闭包,并且在外部线程上。
灵活配置
可以使用文件或库的API配置记录器。
使用API,您可以使用一个字典,这个字典可以从您希望的任何地方存储和加载(Web服务、数据库、首选文件等)。
使用配置文件,您可以要求每次文件修改时自动重新加载配置
LoggerFactory.sharedInstance.readConfiguration(fromPlistFile: "/some/file.plist", autoReload: true)
可以在运行时修改配置。
提供的附加器
标准输出附加器
此附加器将日志消息写入stdout或stderr。它有两个阈值:所有附加器都有的常规阈值和错误阈值。
- 如果日志级别低于通用阈值,则消息会被忽略
- 如果日志级别高于通用阈值但低于错误阈值,则消息会在标准输出(stdout)中输出
- 如果日志级别高于通用和错误阈值,则消息会在标准错误(stderr)中输出
默认情况下,标准输出(stdout)追加器被配置为将错误和致命消息发送到标准错误(stderr),其他所有级别的消息发送到标准输出(stdout)。
这个追加器是CLI工具的理想选择。
文件追加器
这个追加器会将日志消息写入由其路径指定的文件中。如果有需要(且可能的话),它将创建该文件,如果文件消失,也会重新创建它。这允许日志轮转脚本在轮转后无需重启进程即可确保日志被记录到新的文件中。
NSLogger追加器
这个追加器使用NSLogger(https://github.com/fpillet/NSLogger)在网络中发送日志消息。目前还不能访问NSLogger的所有功能:只能记录文本消息。
ASL追加器
ASL追加器将日志消息发送到苹果提供的系统日志服务。如果ASL配置没有被自定义,您的消息将在Console.app应用程序中可见。
对于仅针对没有统一日志系统的系统开发的软件发布版本来说,这是一个不错的选择。
注意:从macOS 10.12开始,苹果已经弃用了ASL。对于这些平台,应使用统一日志记录器追加器替代ASL。
统一日志系统附加器
自MacOS 10.12开始,统一日志系统取代了ASL。此记录器将消息记录到该设施。您的消息将出现在Console.app应用中。
此附加器是针对10.12及以后版本的软件发布版本的好选择。
系统附加器
此元附加器将使用最合适的系统附加器来适应当前系统。
- 对于小于10.12的MacOS,它将使用ASL附加器
- 对于大于等于10.12的MacOS,它将使用统一日志系统附加器。
此附加器是针对针对多个系统版本(最常见情况)的软件发布版本的最佳选择。
提供格式化工具
PatternFormatter
PatternFormatter使用带有一个百分号前缀标记的简单文本模式来渲染日志消息。
例如,此模式
[%d][%l][%n] %m
将产生这种类型的日志
[2015-02-02 12:45:23 +0000][Debug][logger.name] The message that was sent to the logger
有关详细信息,包括可用标记的完整列表,请参阅此页面