ios 如何从os_log()中查找源文件和行号

bvpmtnay  于 2023-01-14  发布在  iOS
关注(0)|答案(2)|浏览(141)

iOS 10和macOS Sierra中新日志记录系统的Logging Apple reference明确表示不包括行号和源文件信息,因为它是自动捕获的。
不要在消息中包含符号化信息或源文件行号。系统会自动捕获此信息。
但是我还没有找到任何方法来查看这些应该捕获的值。在控制台应用程序中,我可以看到子系统,类别,进程ID等,但没有关于文件和行的信息。
同样,命令行工具似乎也缺少显示此信息的任何选项(除非我遗漏了什么)。
有人发现了吗?

cu6pst1q

cu6pst1q1#

我不认为它在Swift中可用,尽管你可以在终端中看到C / C++格式的文件和行号。
我尝试了一些类似于论坛内部的东西,创建了一个简单的命令行工具Xcode项目:

import Foundation
import os.log

os_log("rrrr")

并在终端中键入以下内容:log stream --source --predicate 'eventMessage contains "rrrr"',我得到了这个:

Timestamp                       Thread     Type        Activity             PID    
2017-02-18 17:58:46.012381+0700 0x5067d    Default     0x0                  5637   <testLogSwift`_swift_os_log> rrrr

与我在C/C++版本中得到的相反,它显示了文件和行号:

Timestamp                       Thread     Type        Activity             PID    
2017-02-18 17:55:05.056103+0700 0x4aa01    Default     0x0                  5218   <testLogging`main (main.cpp:13)> qqq
zfycwa2u

zfycwa2u2#

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

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")

相关问题