ios 通过OSLog启用调试日志记录

eblbsuwk  于 2023-10-21  发布在  iOS
关注(0)|答案(2)|浏览(205)

我已经在iOS应用程序中设置了通过OSLog进行日志记录,并添加了一个按钮来使用OSLogStore导出日志:

extension OSLog {
    private static let subsystem = Bundle.main.bundleIdentifier!
   
    @available(iOS 15.0, *)
    static func getLogs(inLast: TimeInterval) -> [OSLogEntryLog]? {
        guard let store = try? OSLogStore(scope: .currentProcessIdentifier) else { return nil }
        let startTime = store.position(timeIntervalSinceEnd: -inLast)
        guard let entries = try? store.getEntries(at: startTime).compactMap({ $0 as? OSLogEntryLog }).filter({ $0.subsystem == subsystem }) else { return nil }
        return entries
    }
}

这在本地测试时工作正常,即使在发布版本中也会导出所有日志。但是,当我们的团队通过TestFlight测试构建时,不会导出调试日志。是否有方法导出所有日志,包括调试日志?

6yoyoihd

6yoyoihd1#

您需要将其添加到Info.plist

<key>OSLogPreferences</key>
<dict>
    <key>your.subsystem.key.here</key>
    <dict>
        <key>your-category-here</key>
        <dict>
            <key>Level</key>
            <dict>
                <key>Enable</key>
                <string>Debug</string>
                <key>Persist</key>
                <string>Debug</string>
            </dict>
        </dict>
    </dict>
</dict>

另外,您可能需要添加

<key>Enable-Private-Data</key>
<true/>

到同一个字典中,而不是编辑所有参数。
最后,不要在getEntries()结果上使用.filter,它非常慢。相反,将matching重载与NSPredicate一起使用,例如。

try? store
    .getEntries(
        at: startTime, 
        matching: NSPredicate(format: "subsystem == \"\(subsystem)\"")
    )
    .compactMap({ $0 as? OSLogEntryLog })
bfnvny8b

bfnvny8b2#

Claus Jørgensen的回答是有效的。人们可以将设置添加到Info.plist中,并且调试级别消息会出现在iOS上的OSLogStore中。通过阅读Apple的文档,我假设这些东西的配置只有在macOS中才可能。
如果它能帮助任何人:有关Info.plist的一些信息在man 5 os_log中:
特定于应用程序的配置文件位于应用程序的Info.plist文件中的OSLogPreferences字典中。此字典中的键对应于子系统名称,其值是子系统字典。
我怀疑,从OSLogStore无法访问调试级别消息-至少目前iOS 17 / Xcode 15是这样。来自Apple的文档([Generating Log Messages from Your Code][1]):
通常,系统只在内存中存储调试和信息消息,...
以及:
日志级别的严重性会影响系统记录信息的速度。由于系统只将它们存储在内存中,因此日志的开销非常低。
从在iOS上玩OSLogStore时可以看到的内容来看,OSLogStore似乎不包括调试消息。

相关问题