推荐使用: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参数的变体:
UASLogPlainUASLogBasicUASLogFullUASLog// 默认为 UASLogBasic
S表示严重性,作为这些函数的第一个参数。UALogger识别5种严重程度:
UALoggerSeverityDebug// 最低日志级别UALoggerSeverityInfoUALoggerSeverityWarnUALoggerSeverityErrorUALoggerSeverityFatal// 最高日志级别
要在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是如何提供更强大、更灵活的日志管理能力的。赶快把它纳入你的项目,让开发和维护变得更加轻松!
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0559
MiniMax-H3MiniMax H3 是一个通用的全模态生成系统。它支持对由文本、图像、视频和音频组成的多模态上下文进行统一理解,并能生成分辨率高达 2K、时长可达 15 秒的带原生立体声音频的视频。得益于面向任务泛化的系统设计,H3 在预训练阶段就已具备广泛的多模态上下文理解与生成能力,能够出色地执行复杂的多模态指令。Python00
DataFlow基于大模型算子和工作流的高效文本大模型训练数据合成框架Python07
doraDORA (Dataflow-Oriented Robotic Architecture 面向数据流的机器人架构) 是为 AI 与具身智能机器人打造的高性能开发框架,以数据流范式重构开发逻辑,原生支持分布式部署与端边云协同 —— 无需复杂适配,即可实现一体端到端具身大小脑、VLA等模型部署,无缝衔接感知、推理、控制全链路,让 AI 能力与机器人动作深度融合。 依托 Rust 内核与零拷贝通信技术,它将具身大小脑、VLA等模型推理、多模态数据融合延迟压缩至微秒级,同时兼容 ROS2 生态与国产 AI 芯片,彻底降低具身智能机器人的开发门槛,让分布式部署下的 AI 赋能创新更高效、更灵活。Rust02
源启盛夏_AtomGit暑期开发者成长计划「源启盛夏」暑期校园开发者成长计划旨在激活校园开源力量,通过积分激励、认证扶持、资源倾斜等形式,引导高校组织和开发者完成「入驻 — 建项目 — 做贡献 — 获认证 — 得资源」的完整闭环。无论你是想带领社团入驻平台的组织者,还是希望用代码贡献证明自己的开发者,都能在这里找到属于你的成长路径。Markdown01
py-xiaozhi基于Python的Xiaozhi AI,适用于想要完整Xiaozhi体验而无需拥有专用硬件的用户。Python01