Apple统一日志记录-如何获取文件名和行号

时间:2018-09-17 11:42:44

标签: ios macos logging

Apple的Unified Logging documentation状态:

  

消息中不包括符号信息或源文件行号。系统会自动捕获此信息。

但是在控制台中,我看不到文件名,类名,函数名或行号。

如何将这些记录在日志中?

2 个答案:

答案 0 :(得分:3)

os_log当前未在Console.app中或通过log stream命令提供Swift代码的行号/功能名称。

如果您确实需要它-您可以使用Literal Expressions通过NSLogos_log手动传递信息,如下所示:

os_log(.info, "Log message from file: %s, line: %i, column: %i", #file, #line, #column)

os_log包装为始终包含此信息可能很诱人,但Apple建议出于性能原因不建议这样做。

答案 1 :(得分:1)

实际上,甚至macOS Catalina beta(内部版本19A501i)也没有在 Console.app 中显示源代码行。

但是,log命令行工具确实显示了模拟设备的源信息(从macOS 10.14开始)。

以下命令将显示当前在模拟器中启动(运行)的所有模拟设备的日志信息。如果当前没有正在运行的模拟设备,该命令将失败。

xcrun simctl spawn booted log stream --level debug --color always --source

您可以通过在os_log调用中使用子系统,并对流式记录的数据应用谓词,来过滤掉程序中所有不包含的内容。例如,如果您的子系统是com.subsystem.my,则可以使用

xcrun simctl spawn booted log stream --level debug --color always --predicate '(subsystem BEGINSWITH "com.subsystem.my")' --source

源代码信息将显示在TTL列之后。

如果您未设置子系统,还可以按进程(即目标的名称)进行过滤

xcrun simctl spawn booted log stream --level debug --color always --predicate '(process == "MyProcess")' --source

但是,由于其他框架记录的信息也将包括在内,因此通常会导致日志消息过多。

此外,您可以使用实际模拟设备的名称代替booted(仅从该设备流式传输日志数据)。