【问题标题】:How to disable os_log debug messages, for certain categories or subsystems?如何禁用某些类别或子系统的 os_log 调试消息?
【发布时间】:2020-04-12 23:49:33
【问题描述】:

我在我的 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, ...)
}

docs 提到能够在 macOS 上执行此操作,但我特意询问的是 iOS。

我不想把它全部关掉。为此,我需要一种按子系统或类别将其关闭的方法。

【问题讨论】:

  • 在我的答案的第一部分添加了一个示例,我认为这很好地解决了它。

标签: ios logging


【解决方案1】:

您正在通过指定一些全局 OSLog 对象来应用 os_log。只需将该对象替换为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 控制台这一事实是次要功能。它们出现的主要位置是控制台应用程序。并且可以过滤控制台消息,以便仅包含您想要的子系统或类别。这是一个非常强大的过滤器,比 Xcode 控制台更强大、更精确。

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

【讨论】:

  • 控制台应用程序很棒,但它给我带来了一个大问题 - 当我使用它以这种方式观察应用程序时,它会影响我的 CPU。你也看到了吗?也许我的笔记本电脑(2012 Macbook Pro)太旧了。顺便说一句,我认为您可以要求它向您显示某些消息,至少在某些方面是这样。如果我控制点击表格/列表区域,我会得到一个带有“显示...”和“隐藏...”过滤器的菜单。
  • 哦,听起来比我想象的还要酷。 :) 我知道它更强大,但我没有意识到它可以做到这一点。
猜你喜欢
  • 2016-04-29
  • 2019-08-21
  • 2016-07-21
  • 2022-01-06
  • 1970-01-01
  • 2015-10-10
  • 2015-04-16
  • 1970-01-01
  • 2016-03-07
相关资源
最近更新 更多