测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | 自定义 |
发布最后发布 | 2014年12月 |
由 Krzysztof Profic,Wojciech Nagrodzki 维护。
TFLogger 允许您做以下事情:
将其用作应用程序范围的日志记录功能(TFLogDebug
、TFLogError
、...
宏)具有相应日志级别的消息将被直接打印到 Xcode 调试控制台和/或设备控制台(ASL)。
修改 NSLog 的默认实现,并将其用作外部模块或您开发的 CocoaPod 库的无依赖日志工具。我们的 NSLog 实现将日志级别以“可视化格式”编写。
实现自己的自定义日志处理程序/适配器,以便将消息转发到您希望的目的地。例如,有一个 CocoaLumberjack 适配器可用。
使用筛选器仅调试您当前正在工作的特定组件。
TFLogger 非常有助于根据 logged 信息的重要性对它们进行分类。通过使用以下宏定义,您可以这样做:
TFLogEmergency
- 优先级最高,通常保留用于灾难性故障和重新启动通知。
TFLogAlert
- 关键系统中的一个严重故障。
TFLogCritical
- 关键系统中的一个故障。
TFLogError
- 有东西失败了。
TFLogWarning
- 有东西有缺陷,并且如果未解决则可能会失败。
TFLogNotice
- 对用户或管理员具有适度兴趣的事情。
TFLogInfo
- 您通常会记录的最低优先级,纯粹是信息性的。
TFLogDebug
- 最低优先级,通常不会记录,除非是来自内核的消息。
可以使用 TFLoggerSetBaselineLevel(NSInteger level)
在任何时候调整日志级别。低于当前设置级别的信息将被删除。
上述日志宏旨在在应用程序级别使用。如果您正在处理库(例如 cohocaapod、模块),请参阅 NSLog 可视化格式 和 外部库集成 部分。
TFLogger 允许您选择日志的目的地,TFStdErrLogHandler 是默认的一个,将日志定向到 STDERR_FILENO - 这就是您在 Xcode 控制台中看到的内容。另一方面,TFASLLogHandler 将日志转发到 asl(Apple 系统日志器),它们存储在设备上,可以使用控制台应用程序阅读。为了将日志通过 ASL 保存到设备,请使用以下命令添加此处理程序:
TFLoggerAddHandler(TFASLLogHandler());
如果您想要将日志转发到其他地方,只需创建一个自己的日志处理程序作为块,并使用这种方法将其添加到TFLogger。
ASL 内部有一个预定义的日志过滤器。它被设置为显示除了 DEBUG 和 INFO 级别的所有消息。如果您想要不同的 ASL 过滤策略,请使用 asl_set_filter()
组为您执行。
TFLoggerBaselineLevel()
具有比其他日志级别更高的优先级。
标准的 NSLog 实现将日志消息输出到 Xcode 控制台 (STDERR) 和 ASL,并且将日志级别设置为 ASL_LEVEL_ERR
。这在使用 TFASLLogHandler
时相当于 TFLogError
。
NSLog 是一款不错的工具,它是 Foundation
框架的一部分,因此它总是可用——您不需要第三方库来显示日志。这可能正是开发人员仍然在日常生活中使用 NSLog 的原因——它简单且始终可用。关于 NSLog 的一个问题是:
为解决上述问题,TFLogger 能够替换默认的 NSLog 实现。要做到这一点,请在您的源代码中包含以下行:#define NSLog(...) NSLogToTFLoggerAdapter(module_name, __VA_ARGS__)
这会导致默认的 NSLog 语句转发到 _TFLog
方法,这是 TFLogger 的入口点。它的行为当然取决于 TFLogger 的设置。默认情况下,它将只导致您的消息显示在 Xcode 调试器中。此外,如果使用 TFASLLogHandler,默认的 NSLog 日志级别将是 ASL_LEVEL_DEBUG 而不是 ASL_LEVEL_ERROR。这里的重点特性是 NSLog 可视化格式,您可以使用它通过以下语法显式更改日志消息中的日志级别:
NSLog(@"[m] something) - ASL_LEVEL_EMERG;
NSLog(@"[a] something) - ASL_LEVEL_ALERT;
NSLog(@"[c] something) - ASL_LEVEL_CRIT;
NSLog(@"[e] something) - ASL_LEVEL_ERR;
NSLog(@"[w] something) - ASL_LEVEL_WARNING;
NSLog(@"[n] something) - ASL_LEVEL_NOTICE;
NSLog(@"[i] something) - ASL_LEVEL_INFO;
NSLog(@"[d] something) - ASL_LEVEL_DEBUG;
上述机制主要是为了与使用替换的 NSLog 的外部 cocoapod 库一起使用。有关更多信息,请参阅下一章节:外部库集成。当然,您也可以在整个应用程序范围内替换 NSLog - 这样,应用程序中的所有 NSLog 都将很好地集成到 TFLogger 流程中。
TFLogger 可以通过 NSLog 可视化格式 与应用程序的其他模块集成。这意味着您将与您的 cocoapod 库中的日志设施没有直接依赖。选择要使用的日志框架的决定是在您实际上开始使用库的时候做出的。在这种情况下,您可以简单地继续使用默认的 TFLogger 实现,或者轻松地将所有日志转发到您最喜欢的日志库(使用您自己的块处理程序;CocoaLumberjack 有一个预定义的处理程序:TFCocoaLumberjackHandler
)。
为了在您的 cocoapod 库中实现与 TFLogger 的这种按需集成 - 执行以下操作:
s.prefix_header_contents = '#if NSLOG_TO_TFLOGGER_ENABLED', '#import <TFLogger/NSLogVisualFormat.h>', '#define NSLog(...) NSLogToTFLoggerAdapter(@"YourPodName", __VA_ARGS__)', '#endif'
为了利用具有TFLogger集成的库,请执行以下操作
1) 在项目的Podfile中添加对TFLogger和您希望使用的pods的依赖关系
target 'MyProject', :exclusive => true do
pod "TFLogger"
pod 'OtherLibraryThatUsesNSLogVisualFormat'
end
2) 添加一个pod post_install步骤以激活visual格式NSLog->TFLogger通道。
post_install do |installer_representation|
installer_representation.project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'NSLOG_TO_TFLOGGER_ENABLED=1'
end
end
end
使用NSLog视觉格式进行这种无依赖关系集成的优点在于,如果没有TFLogger,所有cococapod库仍然可以正常工作。NSLog语句将简单地使用标准的NSLog实现打印日志。
这里的‘杀手特性’是,你使用的库集中哪个日志框架将处理日志的决定是由主应用程序做出的。你可以随时更改日志框架,而无需修改库的源代码。
TFLogger可在Apache v2下使用。有关更多信息,请参阅LICENSE文件。
Krzysztof Profic,[email protected]