iOS - Log

作者: ienos | 来源:发表于2021-05-31 00:16 被阅读0次

一、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

相关文章

网友评论

    本文标题:iOS - Log

    本文链接:https://www.haomeiwen.com/subject/wrapsltx.html