Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 代理包装IOS14记录器类_Swift_Logging_Ios14 - Fatal编程技术网

Swift 代理包装IOS14记录器类

Swift 代理包装IOS14记录器类,swift,logging,ios14,Swift,Logging,Ios14,我有一个可以在iOS 12上使用的应用程序。在过去,我使用了优秀的CocoaLumberjack,但我想转到本机的Logger类 我很高兴旧版iOS没有收集日志,但我希望应用程序能在那里运行 有没有好办法避免到处都有可用的调用?一般来说,我喜欢可用的`#,但记录起来很麻烦 if #available(iOS 14.0, *) { logger.info("Setting person from \(self.person, privacy: .public) to \(new

我有一个可以在iOS 12上使用的应用程序。在过去,我使用了优秀的CocoaLumberjack,但我想转到本机的
Logger

我很高兴旧版iOS没有收集日志,但我希望应用程序能在那里运行

有没有好办法避免到处都有可用的调用?一般来说,我喜欢可用的`#,但记录起来很麻烦

if #available(iOS 14.0, *) {
     logger.info("Setting person from \(self.person, privacy: .public) to \(newValue, privacy: .public)")
}
如果我包装
Logger
类,我就无法对其进行编译,因为日志系统有编译时限制:

导入操作系统
公共类记录器{
@可用(iOS 14.0,*)
静态let logger=os.logger(子系统:“com.progress”,类别:“ProgressKit”)
公共静态func调试(u输入:字符串){
如果可用(iOS 14.0,*){

debug(OSLogMessage(stringLiteral:input))//问题在于不可用。问题在于,正如您所发现的,Logger log命令的参数不是字符串。它是一个可由文本字符串表示的私有类。因此,您无法将字符串传递到包装器并将其中继到Logger。您必须使用文本字符串直接调用Logger方法


然而,Logger本身只是一个巧妙的包装器,用于
os\u log
,它确实需要一个字符串。因此您可以使用它。或者,正如您所建议的,您可以在任何地方都使用可用性和其他向后兼容性技术。

编译器中有一个特例,确保
OSLogMessage
只能可以从字符串文本构造

这意味着没有办法包装它,您必须:

  • 通过在Big Sur之前放弃对一切的支持,并直接使用闪亮的新API,或
  • 不要使用它,使用os_日志API,尽管它们可能很难看

  • 谢谢@matt!你知道在iOS 14中os_log是否写入磁盘吗?我从你所说的猜出来。除非你告诉它不要这样做,否则它会这样做。和Logger一样。正如我所说,Logger只是一个包装器。当我说“你知道在iOS 14中os_log是否写入磁盘吗?”时,我应该说的是“有API可以访问iOS 14中的日志吗?”虽然API在macOS中可用,在iOS 14 betas中也可用,但它是在GM阶段推出的。对于iOS 15,祈祷好运。“或者,正如你所建议的,你可以在任何地方使用可用性和其他向后兼容性技术。”这太残酷了。到处都是日志代码。我真的很失望他们没有简单地将包装器向后移植,因为它对您编写的一些最常见的代码有全局影响:/