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

8
在iOS 10和macOS Sierra的新日志系统中,苹果参考文献明确表示不要包含行号和源文件信息,因为它会被自动捕获。
“不要在消息中包含符号化信息或源文件行号。系统会自动捕获此信息。”
但我还没有找到任何查看这些所谓已捕获值的方法。在Console应用程序中,我可以看到子系统、类别、进程ID等,但没有关于文件和行数的信息。
类似地,命令行工具似乎也缺乏显示此信息的选项(除非我错过了什么)。有人解决了吗?
2个回答

6

我认为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

有趣!我也试图从Swift中使用它。没想到要检查它是否对Cs有不同的反应。 - sobri
3
我向苹果提交了漏洞报告,他们已经为Swift修复了这个问题。很快就会发布 :-) - HuaTham
9
这个问题有解决吗?我正在将我的iOS 11应用程序(使用Swift 4和Xcode 9.4.1编写)转换为使用os_log,但是在Console应用程序中查看日志时,我的os_log调用不会显示行号或文件名。 - bruce1337
1
仍然无法在Xcode 10.1上工作。请参见https://dev59.com/IK7la4cB1Zd3GeqPc3L6#52376227以了解手动执行的丑陋方式 - 但我认为我会等待并希望最终能够解决这个问题。 - Austin

0

在苹果修复这个问题之前, 我创建了一个简单的扩展程序

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

我们甚至可以删除参数名称,使其更加简洁:

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,只需删除上下文参数,它将使用由苹果提供的原始初始化。
Logger().debug("Hello World")

每次想要记录日志时都创建一个新的“Logger”不是一个好的解决方案! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接