标签: oslog

适用于Swift的Apple推荐日志记录方法

注意:

这不是链接问题的重复

目标:

  • 我不是在寻找printvs NSLog差异
  • 事实上我不想使用其中任何一个(目前使用print)
  • 我正在寻找一种Apple推荐的方式,似乎无法找到命令/文档,我只知道它存在.

目前的实施:

目前我正在使用print具有一些全局功能的语句

  1. 处理错误的推荐方法/方法是什么(我不想使用NSLog,因为他们会写入设备的控制台)
  2. 这仅用于开发期间的调试目的

xcode error-logging ios swift oslog

16
推荐指数
1
解决办法
5527
查看次数

Xcode 日志记录:“启用金属 API 验证”

我正在通过 Xcode 构建一个 macOS 应用程序。每次构建时,我都会得到日志输出:

启用金属 API 验证

据我所知,我的应用程序没有使用任何 Metal 功能。我没有使用硬件加速的 3D 图形或着色器或视频游戏功能或类似的东西。

为什么Xcode打印Metal API日志输出?

我的应用程序中是否使用了 Metal?我可以还是应该禁用它?

如何禁用此“启用金属 API 验证”日志消息?

macos xcode ios metal oslog

16
推荐指数
2
解决办法
1万
查看次数

使用 Swift Logger 时,有没有办法默认公开内插字符串?

在 Swift 中,我使用这样的代码:

let logger = Logger()
let someInfo = "information"
logger.warning("blah: \(someInfo)")
Run Code Online (Sandbox Code Playgroud)

但控制台输出显示: blah: \<private>

除非我将最后一行更改为:

logger.warning("blah: \(someInfo, privacy: .public)")
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种方法可以将默认设置为.public- 当我开发应用程序时,我想查看所有消息 - 而不必包含privacy: .public所有消息。

编辑。 我现在正在使用解决方法,但我不喜欢该解决方案,并希望有一些官方支持,我使用的解决方法是这样的方法:

static func logwarn(_ message: String) {
    let logger = Logger()
    logger.warning("\(message, privacy: .public)")
}
Run Code Online (Sandbox Code Playgroud)

然后我调用logwarn, 并可以#ifdef使其在发布代码中以不同的方式实现(即不公开)。

console logging swift oslog

9
推荐指数
0
解决办法
385
查看次数

如何使用统一日志记录系统从远程 iOS 设备查看日志?

首先,重要的是要知道OSLogStore 在 iOS 中不起作用就在 4 个月前,由于那是最近的事,而且文档又非常稀少,一年前可能正确的内容今天可能并不正确。

\n

这是我的问题的一些背景(几乎是从这个 reddit 帖子中盗来的):

\n
\n

我开发的开源应用程序大约有 1000 个用户,用户时不时会报告一些奇怪的行为。

\n

该应用程序使用[记录器 ] 来记录重要事件...是否可以使用远程日志记录服务,以便我可以获取此信息并为用户解决问题?

\n
\n

我只关心是否有统一的日志系统是否有解决这个问题的方法。假设我能够与具有“奇怪行为”的用户交谈,并且他们不是技术人员。

\n

我得到了一些提示,表明 OSLogStore 可能是一种获取远程日志的方法,但官方文档太少了,我无法判断。具体来说,init(url:)看起来很有趣,但也许它只接受file://协议或其他东西。

\n

日志记录文档说它可以用于“当您无法将调试器附加到应用程序时,例如当您\xe2\x80\x99在用户\xe2\x80\x99s机器上诊断问题时”,但没有任何地方说这个怎么做。

\n

ios swift oslog swiftui ios15

8
推荐指数
1
解决办法
3291
查看次数

通过 OSLog 启用调试日志记录

我已经在 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
    }
}
Run Code Online (Sandbox Code Playgroud)

这在本地测试时效果很好,即使在发布版本中也会导出所有日志。但是,当我们的团队通过 TestFlight 测试构建时,不会导出调试日志。有没有办法导出所有日志,包括调试日志?

ios oslog

7
推荐指数
1
解决办法
1283
查看次数

如何使用 Console.app 从模拟器中运行的 iOS 应用程序的 os_log 查看调试级别日志?

这是一个关于如何使用 Apple 的统一日志框架(也称为“os_log”)的问题,该框架是您从 Swift 调用的函数。

具体来说,我想知道是否可能:

  1. 在 Console.app 中查看日志(不使用log命令行工具)...
  2. 查看debug级别日志(不仅仅是info级别日志)...
  3. 对于在模拟器中运行的 iOS 应用程序(不仅仅是在设备上运行)。

您不能仅通过运行 Console.app、指向模拟器并选择Action / Include Debug Message来完成此操作,这是显而易见的事情。

本文建议debug-level 日志不会显示,因为“‘系统’日志级别设置为info”,但我无法在任何地方找到解释这意味着什么的讨论。

ios ios-simulator oslog

6
推荐指数
1
解决办法
930
查看次数

os_log 调试和发布版本

我将以下辅助方法与 OS_Log 一起使用,但我不确定是否有必要。

我想在我的调试版本中记录内容,但(不一定)在我的发布版本中记录内容。

我对编译器是否删除发布版本中的 os_log 语句感到困惑

public func DLog(_ string: String, subsystem: OSLog, type: OSLogType) {
  #if DEBUG
  os_log("%{PUBLIC}@", log: subsystem, type: type, string)
  #endif
}
Run Code Online (Sandbox Code Playgroud)

我可以直接使用它并在发布版本中删除日志吗?

os_log("%{PUBLIC}@", log: subsystem, type: type, string)
Run Code Online (Sandbox Code Playgroud)

我很困惑...

logging swift oslog

6
推荐指数
1
解决办法
1266
查看次数

如何从iPad/iPhone检索使用os_log记录的消息?

我在Swift中使用新的统一日志API.

所以我创建了一个记录器并使用它如下:

let testLogger = OSLog(subsystem: "my.subsystem", category: "test")
os_log("just a test: %@", log: testLogger, type: .error, "error")
Run Code Online (Sandbox Code Playgroud)

如果iOS设备与Mac断开连接,如何检索记录的消息?

我知道新的控制台应用程序会显示设备连接到Mac时记录的消息.但是,我想检索设备与计算机断开连接时记录的消息.我怎样才能做到这一点?

谢谢.

logging ios swift oslog sysdiagnose

5
推荐指数
1
解决办法
2458
查看次数

os_log-使用无法解析的标识符错误

我正在尝试通过记录一条简单的语句来使用新的os_log API:os_log(“ Hello”)

我收到os_log的错误消息:使用未解析的标识符'os_log'

我也尝试将它包装成一个块

if #available(iOS 10.0, *) {
    let foo: StaticString = "Something happened."
    os_log(foo)
}
Run Code Online (Sandbox Code Playgroud)

而且我仍然遇到相同的错误。我想在Swift 4中使用它。

我寻找了可能需要的框架,但没有找到可能的候选人。

我也没有从这些链接找到任何解决方案:

https://developer.apple.com/documentation/os/logging

https://developer.apple.com/videos/play/wwdc2016/721/

logging ios swift4 oslog

5
推荐指数
1
解决办法
1235
查看次数

Xcode 12 和 OSLog (os.log):包装 OSLogMessage 导致编译错误:参数必须是字符串插值

在 Xcode 12 / iOS 14 中,OSLog 获得了对字符串插值的支持(是的!)。但是仍然无法附加钩子来轻松登录到其他渠道,例如 Crashlytics。

所以我想我会做一个简单的包装器并传递参数。然而,字符串插值似乎发生了一些神奇的事情。

提供的新 Logger 类,它接受一个OSLogMessage作为参数,可以按如下方式使用:

let someVar = "some var"
let logger = Logger(subsystem: "com.my.app", category: "UI")

logger.error("some message")
logger.error("some message with default var: \(someVar)")
logger.error("some message with private var: \(someVar, privacy: .private)")
logger.error("some message with private var: \(someVar, privacy: .private(mask: .hash))")
logger.error("some message with public var: \(someVar, privacy: .public)")
Run Code Online (Sandbox Code Playgroud)

包装新的 Logger 结构

所以让我们把它包装在一个结构中:

struct MyLogger {
    let logger = Logger(subsystem: "com.my.app", category: "UI")

    func error(_ message: OSLogMessage) {
        logger.error(message) …
Run Code Online (Sandbox Code Playgroud)

string xcode string-interpolation swift oslog

5
推荐指数
2
解决办法
1468
查看次数