这不是链接问题的重复
printvs NSLog差异print)目前我正在使用print具有一些全局功能的语句
我正在通过 Xcode 构建一个 macOS 应用程序。每次构建时,我都会得到日志输出:
启用金属 API 验证
据我所知,我的应用程序没有使用任何 Metal 功能。我没有使用硬件加速的 3D 图形或着色器或视频游戏功能或类似的东西。
为什么Xcode打印Metal API日志输出?
我的应用程序中是否使用了 Metal?我可以还是应该禁用它?
如何禁用此“启用金属 API 验证”日志消息?
在 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使其在发布代码中以不同的方式实现(即不公开)。
首先,重要的是要知道OSLogStore 在 iOS 中不起作用就在 4 个月前,由于那是最近的事,而且文档又非常稀少,一年前可能正确的内容今天可能并不正确。
\n这是我的问题的一些背景(几乎是从这个 reddit 帖子中盗来的):
\n\n\n我开发的开源应用程序大约有 1000 个用户,用户时不时会报告一些奇怪的行为。
\n该应用程序使用[记录器 ] 来记录重要事件...是否可以使用远程日志记录服务,以便我可以获取此信息并为用户解决问题?
\n
我只关心是否有统一的日志系统是否有解决这个问题的方法。假设我能够与具有“奇怪行为”的用户交谈,并且他们不是技术人员。
\n我得到了一些提示,表明 OSLogStore 可能是一种获取远程日志的方法,但官方文档太少了,我无法判断。具体来说,init(url:)看起来很有趣,但也许它只接受file://协议或其他东西。
日志记录文档说它可以用于“当您无法将调试器附加到应用程序时,例如当您\xe2\x80\x99在用户\xe2\x80\x99s机器上诊断问题时”,但没有任何地方说这个怎么做。
\n我已经在 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 测试构建时,不会导出调试日志。有没有办法导出所有日志,包括调试日志?
这是一个关于如何使用 Apple 的统一日志框架(也称为“os_log”)的问题,该框架是您从 Swift 调用的函数。
具体来说,我想知道是否可能:
log命令行工具)...debug级别日志(不仅仅是info级别日志)...您不能仅通过运行 Console.app、指向模拟器并选择Action / Include Debug Message来完成此操作,这是显而易见的事情。
本文建议debug-level 日志不会显示,因为“‘系统’日志级别设置为info”,但我无法在任何地方找到解释这意味着什么的讨论。
我将以下辅助方法与 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)
我很困惑...
我在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时记录的消息.但是,我想检索设备与计算机断开连接时记录的消息.我怎样才能做到这一点?
谢谢.
我正在尝试通过记录一条简单的语句来使用新的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中使用它。
我寻找了可能需要的框架,但没有找到可能的候选人。
我也没有从这些链接找到任何解决方案:
在 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)
所以让我们把它包装在一个结构中:
struct MyLogger {
let logger = Logger(subsystem: "com.my.app", category: "UI")
func error(_ message: OSLogMessage) {
logger.error(message) …Run Code Online (Sandbox Code Playgroud)