推荐使用:UALogger——iOS与Mac的高效日志工具
UALogger是一个轻量级的日志记录工具,专为iOS和Mac应用设计。它允许您自定义日志格式,在运行时动态控制何时将日志输出到控制台,并能收集完整的应用程序最近控制台日志。它包括UALogger
类以及便捷的宏定义。
为什么选择UALogger?
获取上下文信息
NSLog
非常实用,但仍有提升空间。例如,你可能会在代码中看到这样的日志输出,结果是不具帮助性的通用错误消息:
NSLog(@"Error: %@", [error localizedDescription]);
UALogger
则能助你一臂之力,只需基本的日志格式设置,就能将你的通用日志信息放入上下文环境中,使之成为强大的反馈工具:
UALog(@"Error: %@", [error localizedDescription]);
上面的代码将输出类似<UAViewController.m:27> Error: There was a problem loading resource.
的信息,清晰明了。
提升生产环境性能
NSLog
调用会消耗资源。每次写入都需要追加到操作系统文件,涉及定位、打开、追加、保存等同步操作。虽然单个NSLog
不会明显影响性能,但大量使用时,就会有显著的性能损失。
不要担心,使用UALogger,即使在生产环境中,你也不必删掉这些日志。UALogger默认不在生产构建中向控制台输出日志,且能在运行时动态开启或关闭日志功能。
保护敏感信息
NSLog
写出的系统控制台日志可以被任何应用读取,或者被了解设备的人获取。如果其中包含用户的邮件地址、密码或其他私密信息,这可能带来问题。而UALogger在生产环境中不会打印这些日志到系统控制台,确保了你和用户的隐私安全。
改善客户服务
UALogger让你能够获取应用的所有系统日志信息。以我们的旗舰应用Ambiance为例,我们利用这一特性来协助解决客户的疑难问题。当客户报告的问题难以复现时,我们会要求他们通过应用设置中的开关启用日志,然后发送日志给我们进行排查。
日志严重等级
UALogger支持日志严重等级,这样只有重要的日志会在生产环境中传递,有助于处理严重错误和关键信息。
安装
安装UALogger十分简单,可以使用CocoaPods。如果你喜欢手动添加,只需将UALogger.h
和UALogger.m
导入你的项目。
pod 'UALogger', '~> 0.3'
然后在prefix.pch
文件中引入UALogger
。
#import <UALogger.h>
使用
宏定义
UALogBasic
就像NSLog
一样工作,但额外包含了文件名和行号。
UALogBasic(@"Foobar");
UALogFull
会记录调用对象(self),文件名,行号和方法名。
UALogFull(@"Foobar");
UALogPlain
直接像NSLog
那样输出,没有任何附加信息。
UALogPlain(@"Foobar");
UALog
是UALogBasic
的简写形式。
一个快速上手的方式是在整个项目中找到并替换所有NSLog
调用为UALog
。
UALog(@"This used to be an NSLog()");
自定义
默认情况下,UALog
调用UALogBasic
,但你可以根据需求修改。在prefix.pch
文件中#import <UALogger.h>
之后添加以下代码:
#import <UALogger.h>
#undef UALog;
#define UALog( s, ... ) UALogPlain( s, ##__VA_ARGS__);
或者
#import <UALogger.h>
#undef UALog;
#define UALog( s, ... ) UALogFull( s, ##__VA_ARGS__);
如果你设置预处理器宏UALOGGER_SWIZZLE_NSLOG
,无需更改代码即可使用UALogger。
NSLog(@"This NSLog call is actually routing through UALogger.");
但是,只有在已导入UALogger.h
的项目文件中,对NSLog
的调用才会路由至UALogger。
UALogger 类方法
即使方便的宏定义很实用,你也可以直接调用类方法进行日志记录:
[UALogger log:@"I am logging now: %@", [NSDate date]];
不过这种方式不会附带额外信息,因为UALogger
类本身无法获取调用文件名、行号等信息。建议使用宏定义来最大化UALogger的功能。
如果你想改变日志的格式,可以在运行时定制UALogPlain
,UALogBasic
,UALogFull
的格式:
[UALogger setFormat:@"Foobar! %@" forVerbosity:UALoggerVerbosityPlain];
UALogPlain(@"Barfoo%@", @"d");
随后的指定级别日志输出都会使用这个格式。查看setupDefaultFormats
方法了解更多默认格式和变量顺序信息。要重置格式,调用:
[UALogger resetDefaultLogFormats];
生产环境日志
默认情况下,UALogger会在调试环境下输出日志,而在生产环境中不输出。判断依据是DEBUG
预处理器宏是否存在。规则如下:
- 如果不是生产构建并且
shouldLogInDebug
为真 或 - 是生产构建并且
shouldLogInProduction
为真 或 - 用户偏好设置中的日志键值为真。
可以查询这些值并在运行时进行设置。
BOOL isProduction = [UALogger isProduction];
BOOL shouldLogInProduction = [UALogger shouldLogInProduction];
if (shouldLogInProduction)
[UALogger setShouldLogInProduction:NO];
BOOL shouldLogInDebug = [UALogger shouldLogInDebug];
if (!shouldLogInDebug)
[UALogger setShouldLogInDebug:YES];
NSString *userDefaultsKey = [UALogger userDefaultsKey];
if ([userDefaultsKey isEqualToString:UALogger_LoggingEnabled])
[UALogger setUserDefaultsKey:@"CustomizedUserDefaultsKey"];
举例来说,如果你想在特定功能启用时进行日志记录,如带有beta标签的特色功能X:
BOOL featureXIsEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"featureXIsEnabled"];
[UALogger setUserDefaultsKey:@"featureXIsEnabled"];
设置logger使用相同的键意味着当该功能开启时,也会启动日志记录。
BOOL loggingEnabled = [UALogger loggingEnabled];
使用日志严重等级
UALogger还可以配置成使用日志严重等级。三个日志宏(UALogPlain
, UALogBasic
, 和 UALogFull
)都有对应接收UALoggerSeverity
参数的变体:
UASLogPlain
UASLogBasic
UASLogFull
UASLog
// 默认为 UASLogBasic
S
表示严重性,作为这些函数的第一个参数。UALogger识别5种严重程度:
UALoggerSeverityDebug
// 最低日志级别UALoggerSeverityInfo
UALoggerSeverityWarn
UALoggerSeverityError
UALoggerSeverityFatal
// 最高日志级别
要在UALogger中使用严重等级,必须 设置最小严重性:
[UALogger setMinimumSeverity:UALoggerSeverityWarn];
默认情况下,严重程度设为UALoggerSeverityUnset
,此时不用于确定是否记录日志。未设定时,使用[UALogger loggingEnabled]
方法。一旦设置了最小严重性,只会根据严重性 来决定是否输出日志。
示例:
[UALogger setMinimumSeverity:UALoggerSeverityWarn];
UASLog(UALoggerSeverityDebug, @" - Logged with severity => UALoggerSeverityDebug");
UASLog(UALoggerSeverityInfo, @" - Logged with severity => UALoggerSeverityInfo");
UASLog(UALoggerSeverityWarn, @" - Logged with severity => UALoggerSeverityWarn");
UASLog(UALoggerSeverityError, @" - Logged with severity => UALoggerSeverityError");
UASLog(UALoggerSeverityFatal, @" - Logged with severity => UALoggerSeverityFatal");
UASLog(UALoggerSeverityFatal, @" - Only 3 of the above lines are logged because they meet or exceed the configured minimum severity.");
现在,你已经了解到UALogger是如何提供更强大、更灵活的日志管理能力的。赶快把它纳入你的项目,让开发和维护变得更加轻松!
- 国产编程语言蓝皮书《国产编程语言蓝皮书》-编委会工作区017
- nuttxApache NuttX is a mature, real-time embedded operating system (RTOS).C00
- qwerty-learner为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workersTSX027
- 每日精选项目🔥🔥 01.17日推荐:一个开源电子商务平台,模块化和 API 优先🔥🔥 每日推荐行业内最新、增长最快的项目,快速了解行业最新热门项目动态~~026
- Cangjie-Examples本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。Cangjie045
- 毕方Talon工具本工具是一个端到端的工具,用于项目的生成IR并自动进行缺陷检测。Python039
- PDFMathTranslatePDF scientific paper translation with preserved formats - 基于 AI 完整保留排版的 PDF 文档全文双语翻译,支持 Google/DeepL/Ollama/OpenAI 等服务,提供 CLI/GUI/DockerPython05
- mybatis-plusmybatis 增强工具包,简化 CRUD 操作。 文档 http://baomidou.com 低代码组件库 http://aizuda.comJava03
- advanced-javaAdvanced-Java是一个Java进阶教程,适合用于学习Java高级特性和编程技巧。特点:内容深入、实例丰富、适合进阶学习。JavaScript0108
- taro开放式跨端跨框架解决方案,支持使用 React/Vue/Nerv 等框架来开发微信/京东/百度/支付宝/字节跳动/ QQ 小程序/H5/React Native 等应用。 https://taro.zone/TypeScript09