Swift:OSLog / os_log未显示在控制台应用中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift:OSLog / os_log未显示在控制台应用中相关的知识,希望对你有一定的参考价值。

我正在使用XCode 10.3构建Swift 5应用程序。为此,我有一个框架,其中包含一个用于日志系统的实现(用于调试)。该日志系统的默认实现基于OSLog / os_log。在使用应用程序中使用系统时,控制台应用程序中不会显示任何日志。但是,在放置断点时,我可以看到到达了os_log语句(请参见下面的代码示例),并且正确的参数已传递给os_log函数。但是,当我在主机应用程序中使用os_log或NSLog时,它们确实会显示。

我已验证LogSystem / DefaultLogImplementation类型不是问题,因为所有需要命中的断点均已命中,并且所有单元测试均为绿色。另外,到达并执行了os_log语句,但是没有出现日志。我已经验证所有消息都显示在控制台应用程序中,已经验证我选择了正确的设备,已经尝试了多个过滤器(甚至在未启用过滤器的情况下浏览了所有日志)...

任何人都可以帮助/指出问题的根源吗?我目前怀疑OSLog / os_log的执行中存在错误。

代码示例

应用程序端代码,使用的代码类似于下面提供的示例

class SomeClass 
    private let logSystem = LogSystem()

    func doSomethingImportant() 
        // Do important stuff and log the result
        logSystem.debug("Finished process with result \(result)")
    


框架端代码,由应用程序使用

public class LogSystem 

    private let logImplementation: LogImplementation

    init(_ logImplementation: LogImplementation = DefaultLogImplementation()) 
        self.logImplementation = logImplementation
    

    public func debug(_ message: String) 
        logImplementation.log(message, type: .debug) // And some other parameters...
    

    public func error(_ message: String) 
        // Similar to debug(:)...
    



public protocol LogImplementation 
    func log(_ message: String, type: LogType, ...other parameters...)


public class DefaultLogImplementation: LogImplementation 
    func log(_ message: String, type: LogType, ...other parameters...) 
        let parsedType = parseLogType(type) // Function that parses LogType to OSLogType
        let log = OSLog(subsystem: "my.subsystem.domain", category: "myCategory")
        os_log("%private@", log: log, type: parsedType, message) // Breakpoint here is reached, but log does not appear in console app (even with debugger attached, which should remove the effect of "%private%". Either way, at the very least censored logs should still appear in console app.
    

其他信息

快速版本:5.0

XCode版本:10.3

目标设备:ios 12.2 iPhone X模拟器

NSLog出现在控制台应用程序中:是

在控制台应用中选择正确的设备:是

正确的过滤器:是

更新2019-08-16 13:00(阿姆斯特丹时间)

[看来,.debug级消息未出现在控制台应用程序中。当将任何模拟器设备与OSLog结合使用时,会发生此错误。我已经尝试了几个命令来解决此问题:

sudo log config --mode level:debug,persist:debug

sudo log config --subsystem my.reverse.domain.name --mode level:debug,persist:debug

他们都没有解决此问题。实际上,控制台应用程序中没有显示模拟器的任何调试级别消息(甚至不是来自iOS本身)。是的,已启用显示.info和.debug级消息的选项。

我尝试通过以下命令专门设置模拟器的日志级别:

xcrun simctl spawn booted log config --mode level:debug

但是这会导致错误:

log: Simulator unable to set system mode

答案

我已经与Apple DTS工程师进行过交谈,这是一个已知问题,无法使用模拟器查看调试消息(也在Xcode 11中:打开反馈

以上是关于Swift:OSLog / os_log未显示在控制台应用中的主要内容,如果未能解决你的问题,请参考以下文章

从 iOS 设备获取统一系统日志

xcodebuild 在调试级别不显示 OSLog 的输出

如何在 Xcode 12.5.1 或 Xcode 13 中使用 OSLog?

使用 Swift 启动应用程序的次数?

如何从 Apple Watch 检索 os_log 条目?

Swift、iOS 14:在哪里可以找到设备日志?