苹果的Unified Logging documentation声明:不要在消息中包含符号化信息或源文件行号。系统会自动捕获此信息。但是在Console中,我看不到文件名、类名、函数名或行号。我的日志里怎么会有这些?
Unified Logging
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。
log
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
xcrun simctl spawn booted log stream --level debug --color always --predicate '(process == "MyProcess")' --source
booted
ryevplcw2#
os_log目前没有在www.example.com或通过log stream命令为Swift代码给予行号/函数名Console.app。如果你真的需要它-你可以使用文字表达式通过NSLog或os_log手动传递信息,如下所示:os_log(.info, "Log message from file: %s, line: %i, column: %i", #file, #line, #column)Package os_log以始终包含此信息可能很诱人,但Apple建议出于性能原因不要这样做。
log stream
NSLog
os_log(.info, "Log message from file: %s, line: %i, column: %i", #file, #line, #column)
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")
3条答案
按热度按时间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
。ryevplcw2#
os_log
目前没有在www.example.com或通过log stream
命令为Swift代码给予行号/函数名Console.app。如果你真的需要它-你可以使用文字表达式通过
NSLog
或os_log
手动传递信息,如下所示:os_log(.info, "Log message from file: %s, line: %i, column: %i", #file, #line, #column)
Package
os_log
以始终包含此信息可能很诱人,但Apple建议出于性能原因不要这样做。mkshixfv3#
在苹果解决这个问题之前,我创建了一个简单的扩展
用途:
我们甚至可以删除param name以使其更简洁:
用途:
注意:如果你想使用原始的Logger,只需删除上下文参数,它将使用苹果提供的原始init。