在Xcode12/ 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)")包装新的Logger结构
因此,让我们将其封装在一个结构中:
struct MyLogger {
let logger = Logger(subsystem: "com.my.app", category: "UI")
func error(_ message: OSLogMessage) {
logger.error(message)
}
}相同的签名,但不幸的是,编译器不允许这样:
ERROR: Argument must be a string interpolation此外,尝试调用我的struct还会导致一个奇怪的特定编译器错误:
let logger = MyLogger()
let value = "value"
logger.error("Some log message \(value, privacy: .public)")收益率:
String interpolation cannot be used in this context; if you are calling an os_log function, try a different overload直接调用os_log(_: OSLogMessage)而不是新的结构会得到相同的结果。
有没有办法解决这个问题?我是不是遗漏了什么?
发布于 2020-07-22 22:38:20
日志API使用特殊的编译器特性在编译时评估隐私级别。正如诊断程序所说,您必须使用静态(即,在编译时已知)方法或“OSLogPrivacy”属性;它不能是在运行时计算的变量。这意味着如果不使用编译器内部特性,就不能为这些API创建自己的包装器。
发布于 2021-12-28 13:19:38
我只是使用类似这样的东西来解决这个限制:
struct MyLogger {
let logger = Logger(subsystem: "com.my.app", category: "UI")
func error(_ message: String) {
logger.error("\(message)")
}
}https://stackoverflow.com/questions/62675874
复制相似问题