在设备上记录数据并检索日志


81

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

如果我现在在设备上运行发布版本(例如,我发送了试飞版本并将其放到我的iPhone上;这将是发布版本),那么正在记录其中的哪些(如果有)?

以及如何检索日志?

NSLog实际上在发行版上输出什么吗?决定因素是什么?无论是写到stdout还是stderr?仅将stderr写入设备日志?这是否意味着我必须使用fprintf?是否将任何内容写入设备日志?甚至有这样的事情吗?如果是这样,如何捡起来?

有人可以澄清情况吗?


1
对于刚刚输出保存为文件中使用此:stackoverflow.com/questions/28114110/...
基兰普耐尔

Answers:


93
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 Document中,您将获取文件。然后可以将其保存到磁盘


1
这是如何运作的?只是通过.log在documents目录中有一个文件iOS会将控制台输出写入那里?
阿里

2
如何按日期顺序以编程方式删除日志文件,以防止磁盘内存泄漏?
hkaraoglu

4
不确定是否NSDocumentDirectory适合日志文件-通常是指用户自己生成的内容,但是日志文件是应用程序支持的内容,因此它们可能属于NSLibraryDirectory/ Logs子目录。
JustAMartin

如何从Windows PC导出日志详细信息?
Vineesh TP

1
@Ali通过将stderr(标准错误输出)文件描述符(即文件描述符2)与打开的写入文件关联来工作。因此,每次打印到stderr时,它都会打印到文件中。这样,您可以捕获应用程序的stderr输出。日志系统对此一无所知。
Ammo Goettsch

140

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

无论如何,以下是步骤:

  1. 在Xcode中,转到“窗口”->“设备”。
  2. 在左侧面板中选择您的设备。
  3. 单击小箭头,如下面的屏幕快照所示。

在此处输入图片说明


3
这应该是正确的答案。。。我花了半个小时寻找日志按钮。感谢您节省我的时间...
PrimaryChicken

1
只是NSLog。不要期望在那里有cout或printf。
基兰2015年

10
您无法使用此技术从生产/提交的应用程序中获取日志。它仅在调试时有用。
萨蒂扬2015年

7
你让我很快乐,完美的例子,如何不来设计UI,也许他们应该读 developer.apple.com/library/mac/documentation/UserExperience/...
HOFI

1
您刚刚保存了我的培根。一直在追寻只在发行版中出现的错误,日志显示了该问题。我曾经看过同一对话框,却从未想过要单击小箭头,该小箭头显然是“显示实时设备日志”的通用符号。谢谢!
chacmool

23

在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 Document中,您将获取文件。然后可以将其保存到磁盘


如果我错了,请纠正我:这会更改日志的目录,这意味着该日志最初是在中写入的/var/db/diagnostics/。看这里
亲爱的

@Honey,此日志将保存在应用程序文档目录中。
Kiran P Nair

此代码总是创建一个新的文件时,应用程序启动
DURGESH

知道在Watch Extension中执行日志时如何使它工作吗?
user2623825 '02年

1
@KiranPNair-我是否可以对print()语句执行此操作,也可以对NSLog做到这一点?
弗拉

12

NSLog已写入生产版本的设备日志中,您可以通过将iPhone连接到系统并使用Organizer进行检查。在管理器中选择您的iPhone,然后单击“设备日志”。您将在日志中看到所有NSLog输出。


4
更新:在Xcode 6中,不再可以通过设备日志读取NSLog输出。窗口>管理器不再列出设备。相反,“窗口”>“设备”会列出设备,但仅显示崩溃日志。
罗伯特

1
Robert,在Xcode 6的“窗口”>“设备”屏幕上,屏幕底部边缘附近有一条不可见的线。如果将其拉起,将会看到所选设备的控制台日志。由于我认为Xcode中存在UI错误,因此它是不可见的。
oradyvan 2014年




2

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

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

希望这个帮助

问候


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.