【问题标题】:Logging data on device and retrieving the log在设备上记录数据并检索日志
【发布时间】:2012-02-24 05:27:50
【问题描述】:

在 Xcode 的调试版本中,无论我使用的是模拟器还是实际设备,NSLog、printf、fprintf assert 和 NSAssert 语句都会出现在控制台上

如果我现在在设备上运行发布版本(假设我发送了一个测试飞行版本并在我的 iPhone 上将其放大;这将是一个发布版本),其中哪些(如果有)会被记录?

我如何检索日志?

NSLog 是否真的在发布构建时输出了一些东西?决定因素是什么?无论是写入标准输出还是标准错误?仅将 stderr 写入设备日志吗?这是否意味着我必须使用 fprintf?是否有任何内容写入设备日志?甚至有这样的事情吗?如果有,如何领取?

有人能澄清一下情况吗?

【问题讨论】:

标签: ios xcode console logging device


【解决方案1】:

在 Xcode 6.1.1 中,您可以通过执行以下操作来查看 NSLog 输出。但是,我不确定它是否可以让您及时查看过早的日志。我只看到它回到了几个小时。

无论如何,以下是步骤:

  1. 在 Xcode 中,转到窗口 -> 设备。
  2. 在左侧面板中选择您的设备。
  3. 点击如下截图所示的小箭头。

【讨论】:

  • 这应该是正确的答案...我花了半个小时寻找日志按钮。感谢您节省我的时间...
  • 只是 NSLog。不要指望 cout 或 printf 在那里。
  • 您无法使用此技术从生产/提交的应用程序中获取日志。它仅在调试时有用。
  • 你成就了我的一天,完美的例子如何不设计 UI 也许他们应该阅读developer.apple.com/library/mac/documentation/UserExperience/…
  • 你刚刚救了我的培根。一直在寻找一个只出现在发布版本中的错误,日志揭示了这个问题。我看过同一个对话框,但从未想过单击小箭头,这显然是“显示实时设备日志”的通用符号。谢谢!
【解决方案2】:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName =[NSString stringWithFormat:@"%@.log",[NSDate date]];
NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName];
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);

只需在应用程序委托文件的application:didFinishLaunchingWithOptions 方法中添加此代码块,它将在iPhone 上的应用程序文档目录中创建一个日志文件,用于记录所有控制台日志事件。您需要从 iTunes 导入此文件才能查看所有控制台事件。

注意:在 .plist 文件中确保 Application supports iTunes file sharing 存在并设置为 YES 以便您可以通过 iTunes 访问。

获取日志文件: 启动 iTunes,在您的设备连接后选择应用程序 - 选择您的应用程序 - 在 Augument 文档中,您将获得您的文件。然后您可以将其保存到您的磁盘中

【讨论】:

  • 这是如何工作的?只需在文档目录中有一个.log 文件,iOS 就会将您的控制台输出写入那里?
  • 如何按日期顺序以编程方式删除日志文件以防止泄漏磁盘内存?
  • 不确定NSDocumentDirectory 是否适用于日志文件 - 它通常用于用户自己生成的内容,但日志文件是应用程序支持的内容,因此它们可能属于NSLibraryDirectory /Logs 子目录。
  • 如何从 windows PC 导出日志详细信息?
  • @Ali 它通过将 stderr (标准错误输出)文件描述符(即文件描述符 2)与打开以供写入的文件相关联来工作。因此,每次打印到 stderr 时,它都会打印到文件中。这样,您就可以捕获应用程序的 stderr 输出。日志系统对此一无所知。
【解决方案3】:

在swift 3.0中,Shyl的代码会变成,

var paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let fileName = "\(Date()).log"
let logFilePath = (documentsDirectory as NSString).appendingPathComponent(fileName)
freopen(logFilePath.cString(using: String.Encoding.ascii)!, "a+", stderr)

所有其他过程与Shyl解释的相同

只需在应用程序委托文件中的 application:didFinishLaunchingWithOptions 方法中添加这段代码,它将在 iPhone 上的应用程序文档目录中创建一个日志文件,用于记录所有控制台日志事件。您需要从 iTunes 导入此文件才能查看所有控制台事件。

注意:在 .plist 文件中确保 Application supports iTunes file sharing 存在并设置为 YES 以便您可以访问 通过 iTunes。

获取日志文件:连接设备后启动 iTunes 选择应用程序 - 选择您的应用程序 - 在 Augument 文档中,您将获得您的 文件。然后您可以将其保存到您的磁盘中

【讨论】:

  • 如果我错了请纠正我:这更改日志的目录,这意味着它最初写在/var/db/diagnostics/。见here
  • @Honey ,此日志将保存在应用文档目录中。
  • 此代码总是在应用启动时创建一个新文件
  • 知道如何在 Watch Extension 中执行日志时让它工作吗?
  • @KiranPNair - 我可以为 print() 语句执行此操作还是仅针对 NSLog 执行此操作?
【解决方案4】:

NSLog 是在生产版本中写入设备日志的,您可以通过将 iPhone 连接到系统并使用 Organizer 来检查这一点。在管理器中选择您的 iPhone,单击设备日志。您会在日志中看到所有 NSLog 输出。

【讨论】:

  • 更新:在 Xcode 6 中,不再可能通过设备日志读取 NSLog 输出。 Window > Organizer 不再列出设备。相反,Window > Devices 会列出设备,但只显示崩溃日志。
  • Robert,在 Xcode 6 的 Window > Devices 屏幕上,屏幕底部边缘附近有一条不可见的线。如果您将其拉起,您将看到所选设备的控制台日志。由于我认为 Xcode 中的 UI 错误,它是不可见的。
【解决方案5】:

我发现这个来自 APPLE 的链接内容丰富且完整。 它几乎为您提供了查看或访问设备日志的所有选项,无论它们是否连接到您的开发机器。

https://developer.apple.com/library/ios/qa/qa1747/_index.html

【讨论】:

  • 这个文档已经过时了。它只提到了 xCode 6。xCode 9 和 10 的方法完全不同
【解决方案6】:

是的,设备上的 NSLog 输出。您可以将设备连接到 Mac 并使用 Xcode Organizer 工具查看它的输出。

【讨论】:

【解决方案7】:

如果您使用Testflight SDK,您可以使用他们的Remote Logging feature捕获所有日志。

【讨论】:

    【解决方案8】:

    我知道这是一个旧线程,但您也可以访问设备日志:

    设置 -> 隐私 -> 分析 -> 数据

    希望有帮助

    问候

    【讨论】:

      【解决方案9】:

      我认为在 Xcode 9.3 中,设备日志屏幕已移至新位置。请参考以下链接。

      Get device logs at runtime in Xcode

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-13
        • 1970-01-01
        • 2014-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多