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

gut*_*tte 5 macos logging ios

苹果的Unified Logging文档指出:

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

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

我该如何记录在日志中?

Mar*_*pek 7

事实上,即使是 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您可以使用实际模拟设备的名称(仅从该设备流式传输日志数据)来代替。


lob*_*tah 4

os_log目前没有在 Console.app 中或通过log stream命令给出 Swift 代码的行号/函数名称。

如果您确实需要它 - 您可以使用文字表达式通过以下方式NSLog手动传递信息:os_log

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

总是包含这些信息可能很诱人os_log,但苹果建议出于性能原因不要这样做。