如何禁用某个 oslog 日志级别?

How can I disable a certain oslog log level?

对于以下函数:

let authenticationLogger = OSLog(subsystem: "com.Company.AppNameQA" ?? "Empty bundleIdentifier", category: "Authenticaiton)

想disable/enable某个日志级别怎么办?

目前 API 我唯一可以访问的是 isEnabled 功能:

authenticationLogger.isEnabled(.error) 

这只是 returns 是否启用。

我还没有试过这个。但我相信这就是解决方案

正在阅读 docs

下的栏目:

调试时自定义日志记录行为

Logging behavior is normally governed by the system. However, while debugging in macOS, you can enable different logging levels for a subsystem using the log command-line tool’s config argument while logged in as root. See Listing 5, which shows how to enable debug-level logging for a subsystem.

为子系统启用调试级日志记录

$ sudo log config --mode "level:debug" --subsystem com.your_company.your_subsystem_name

使用日志工具的状态参数检查子系统的当前日志记录级别。

检查子系统的日志级别

$ sudo log config --status --subsystem com.your_company.your_subsystem_name
Mode for 'com.your_company.your_subsystem_name'  DEBUG

您还可以通过在 /Library/Preferences/Logging/Subsystems/ 目录中创建和安装日志记录配置文件 属性 列表文件来覆盖特定子系统的日志记录行为。使用标识符字符串命名文件,以反向 DNS 表示法表示子系统。例如,com.your_company.your_subsystem_name.plist。接下来,将一个或多个设置字典添加到文件的顶层。 DEFAULT-OPTIONS 设置字典定义了整个子系统的全局行为设置。类别设置字典定义子系统中特定类别消息的行为。

日志配置文件的顶级结构

<dict>
    <key>DEFAULT-OPTIONS</key>
    <dict>
       <!-- GLOBAL SUBSYSTEM OR PROCESS SETTINGS -->
    </dict>
    <key>CategoryName</key>
    <dict>
       <!-- CATEGORY SETTINGS -->
    </dict>
</dict>

简而言之,您无法通过生产代码更改日志级别。您只能在调试期间更改它。它能有什么用?我不确定!

您可以使用自定义逻辑或环境变量来决定是否通过分配 OSLog.disabled.

禁用 特定日志

来自 WWDC 2018 的示例 session Measuring Performance Using Logging 使用环境变量来确定是否禁用此日志句柄:

let refreshLog: OSLog
if ProcessInfo.processInfo.environment.keys.contains("SIGNPOSTS_FOR_REFRESH") {
    refreshLog = OSLog(subsystem: "com.example.your-app", category: "RefreshOperations")
} else {
    refreshLog = .disabled
}

当您将 .disabled 分配给 OSLog 变量时,它将自动禁用所有使用该日志句柄的日志。

当使用 Logger class (Swift) 时 init(_ logObj: OSLog) initializer 可以用来设置 OSLog.disabled:

static let loggerInstance = Logger(OSLog.disabled)