一、CocoaLumberjack
项目中的日志系统可以通过 CocoaLumberjack 实现,目前使用过 DDTTYLogger 和 DDFileManager
- DDTTYLogger 用来输出日志到控制台,使用 writev(STDDRE, ..)
- DDFileLogger 用来管理本地存储的日志输出
>> 通常有两个日志输出源: sedout 和 stdder
- 其中 print 会向标准的 sedout 打印,而 NSLog 则会向 stdder
>> 如何导出日志文件?
我们需要将 sedout 和 stdder 的打印重定向到沙盒路径中
- freopen("xx.log", "a+", stdout);
- freopen("xx.log", "a+", stdder);
>> 重定向的相关代码
// 沙盒路径 Document
NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
// 获取当前日期
NSDateFormatter *dateformat = [[NSDateFormatter alloc]init];
[dateformat setDateFormat:@"yyyy-MM-dd-HH-mm-ss"];
// 获取 Log 文件路径
NSString *fileName = [NSString stringWithFormat:@"LOG-%@.txt",[dateformat stringFromDate:[NSDate date]]];
NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName];
// 先删除已经存在的文件
NSFileManager *defaultManager = [NSFileManager defaultManager];
[defaultManager removeItemAtPath:logFilePath error:nil];
// 将 Log 输入到文件
freopen([logFilePath cStringUsingEncoding: NSASCIIStringEncoding], "a+", stdout);
freopen([logFilePath cStringUsingEncoding: NSASCIIStringEncoding], "a+", stderr);
在集成了 CocoaLumberjack 第三方框架之后,可以屏蔽掉系统的日志,在 Target->Edit Scheme->Run->Arguments->Enviroment Variables 中添加 key 为 OS_ACTIVITY_MODE,value 为 disabe
DDTTYLogger 日志输出和 NSLog 的格式保持一致,在控制台显示结果如下:
yyyy-MM-dd HH:mm:ss:SSS {APP_NAME} [{PROCESS_ID}:{THREAD_ID}]
2021-05-27 14:30:28:062 Demo[7308:3178314]
通常我们打印日志会使用到以下三个方法中的一个 NSLog、print、OSLog
二、NSLog、Print、OSLog
- NSLog 和 OSLog 会将日志添加到 Xcode Debug Console 和 Console.app
- print 只会将日志添加到 Xcode Debug Console
- NSLog 会将时间戳和标识符添加到输出,print 不会,且相对 print 打印速度慢
>> println 和 print
println 是 print 的变体,println 已在 Swift 2.0 中删除
三、OS Log Framework
WWDC - Unified Logging and Activity Tracing
从 iOS 10 / macOS 10.12 开始,开始使用 OSLog 框架输出日志,并废弃了 Apple System Logger(ASL)
查看日志的方式:Console app、log command-line tool、Xocde debug console
1. os_log 的使用方式
Swift 在 iOS 14.0 之后可以使用 Logger()
Objective-C 和 Swift(iOS 14.0 before)使用 os_log
2. 关于 os_log 的消息类型
分为 .default、.info、.debug、.error、.fault
分析关于几种消息类型的本地数据保存的形式
分析关于几种消息类型的使用场景
3. os_log 的使用方法
os_log_info(OS_LOG_DEFAULT, "Info");
os_log_debug(OS_LOG_DEFAULT, "Debug");
os_log_error(OS_LOG_DEFAULT, "Error");
os_log_fault(OS_LOG_DEFAULT, "Fault");
os_log(OS_LOG_DEFAULT, "Default");
4. os_log 关于隐私信息的使用
5. os_log 内置格式化
6. Terminal 终端命令的使用
// log 只输出 default 等级的日志
log config --mode "level:default" --subsystem "com.company.app"
// 重置系统的默认值
log config -reset --subsystem "com.company.app"
// 检查当前的状态
log config --system "com.company.app"
// 查看指定的日志来源,可查看源代码文件和行数
log stream --source --predicate 'subsystem == "com.company.app"'
7. 如何使用 Console.app 查看日志
Console 不可以看到输出日志所在的源代码文件名及行数
在 mac 中打开 Console.app,在左侧边栏可以看到当前连接的设备,并选择所在 app 对应的设备
如果需要查看 info 和 debug 消息,需要在 Action 中勾选相应的选项,默认是不开的
image该控制台可以通过搜索过滤来进行对 System 和 Category 的过滤
image
网友评论