如何禁用特定类别或子系统的os_log调试消息?

3

我正在使用iOS应用中的统一日志记录API。

import os
private let log = OSLog(subsystem: "", category: "ThisComponent")
...
os_log(.debug, log:log, "Blah blah blah: %@", str)

当我运行我的应用程序时,这些调试日志调用将显示在Xcode控制台中。一旦我不再关注特定组件,我就不想看到它的大量调试级别日志消息。是否有一种方法可以通过环境变量或类似的方式禁用它们?或者我需要更改代码,要么将它们注释掉,要么定义自己的Bool变量并添加if检查:

if isDebugLogging {
    os_log(.debug, log:log, ...)
}

文档提到了在macOS上可以做到这一点,但我特别询问iOS。

我不想关闭所有内容。为了让它更有用,我需要一种按子系统或类别关闭它的方法。


在我的回答的第一部分中添加了一个示例,我认为这很好地解决了问题,对吧。 - matt
1个回答

3
您正在应用os_log并指定了一些全局的OSLog对象。只需将该对象替换为OSLog.disabled,现在通过它发送的消息将不会被发送到任何地方。
示例:
let _activeLog = OSLog(subsystem: "hey", category: "ho")
let _inactiveLog = OSLog.disabled
var heyHoEnabled = true
var myLog : OSLog { heyHoEnabled ? _activeLog : _inactiveLog }

所以现在:

    os_log(.debug, log: myLog, "hey") // logged
    os_log(.debug, log: myLog, "ho") // logged
    self.heyHoEnabled = false
    os_log(.debug, log: myLog, "hey nonny no") // not logged

假设您仍然想发送这些消息,但只是不希望看到它们。无法在控制台级别上说“不要显示某些消息”。您可以过滤控制台,但只能过滤您想看的内容,而不能过滤您不想看的内容。

顺便说一下,“os_log”消息进入Xcode控制台是次要功能。它们主要出现在Console应用程序中。Console消息可以进行过滤,以仅包括您想要的子系统或类别。这是非常强大、精确的过滤器,比Xcode控制台更强大。

因此,如果您所有的控制台消息都是具有不同子系统或类别的“os_log”消息,则可以使用Console应用程序以非常强大的方式进行过滤。


控制台应用程序很棒,但它给我带来了一个大问题 - 当我用它来观察应用程序时,它会占用我的CPU。你也有这个问题吗?也许是因为我的笔记本电脑(2012款Macbook Pro)太旧了。顺便说一下,我认为你可以要求它在某种程度上不显示某些消息。如果我在表格/列表区域进行控制点击,就会出现一个菜单,其中包括“显示…”和“隐藏…”过滤器。 - Rob N
哇,听起来比我想象的还要酷炫。:) 我知道它更强大,但我没意识到它可以做到那个程度。 - matt

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