ios 苹果统一日志-如何获得文件名和行号

d5vmydt9  于 2023-01-14  发布在  iOS
关注(0)|答案(3)|浏览(190)

苹果的Unified Logging documentation声明:
不要在消息中包含符号化信息或源文件行号。系统会自动捕获此信息。
但是在Console中,我看不到文件名、类名、函数名或行号。
我的日志里怎么会有这些?

dluptydi

dluptydi1#

事实上,即使是macOS Catalina beta(build 19A501i)也不会在 Console.app 中显示源代码行。
但是,log命令行工具会显示模拟设备的源信息(macOS 10.14以上版本)。
以下命令将显示当前在模拟器中启动(运行)的所有模拟设备的日志信息。如果当前没有模拟设备正在运行,则该命令将失败。
xcrun simctl spawn booted log stream --level debug --color always --source
通过在os_log调用中使用子系统,并将 predicate 应用于流记录的数据,可以过滤掉不是来自程序的所有内容。例如,如果子系统是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

ryevplcw

ryevplcw2#

os_log目前没有在www.example.com或通过log stream命令为Swift代码给予行号/函数名Console.app。
如果你真的需要它-你可以使用文字表达式通过NSLogos_log手动传递信息,如下所示:
os_log(.info, "Log message from file: %s, line: %i, column: %i", #file, #line, #column)
Package os_log以始终包含此信息可能很诱人,但Apple建议出于性能原因不要这样做。

mkshixfv

mkshixfv3#

在苹果解决这个问题之前,我创建了一个简单的扩展

import os

extension Logger {
  init(subsystem: String = Bundle.main.bundleIdentifier ?? "", file: String = #file, function: String = #function, line: Int = #line, context: String) {
    let category = "\(file):\(line):\(function), \(context)"
    self.init(subsystem: subsystem, category: category )
  }
}

用途:

Logger(context: "LoginFLow").debug("Hello World")

我们甚至可以删除param name以使其更简洁:

import os

extension Logger {
  init(subsystem: String = Bundle.main.bundleIdentifier ?? "", file: String = #file, function: String = #function, line: Int = #line, _ context: String) {
    let category = "\(file):\(line):\(function), \(context)"
    self.init(subsystem: subsystem, category: category )
  }
}

用途:

Logger("LoginFLow").debug("Hello World")

注意:如果你想使用原始的Logger,只需删除上下文参数,它将使用苹果提供的原始init。

Logger().debug("Hello World")

相关问题