iOS/Mac OS 调试信息输出(二)
三 13
Apple技术 Apple System Log facility, ASL, console, Facility, NSLog, printf, stderr 8 Comments
NSLog,没那么简单
在前一篇《iOS/Mac OS 调试信息输出(一)》中介绍了输出调试信息的方法。现在讲主角:NSLog。
1.NSLog工作流程
前面已经说过我们很多时候都只是讲NSLog当做是printf,比printf好就好在:1. 自动添加了换行符;2. 在信息头还添加了一些其他更易于阅读和标示的信息,如“2011-03-12 20:18:34.000 Test14[40871:903]”。但其实NSLog更重要的功能是Log功能。看了下面这幅图你也许久明白了NSLog的工作原理了。
NSLog工作流程图
所以从图中可以看出NSLog的工作主要是分为:1. 输出信息到终端,2. 输出信息到System Log中去。
一般开发的时候程序都是从Xcode中启动,所以这个时候NSLog就具有打印信息到终端的能力就像printf一样(说fprintf(stderr, ….) 更合适一点)。而且很自然也就认为NSLog只是用来打印这些调试信息用的。
但是当程序不是从xcode或者ternimal启动等时,因为stderr不是被定向到标准终端这个时候NSLog的功能就是把信息输入到System Log中去。如果这个时候你也用的stderr输入信息,这个时候stderr会被定向到System Log中去。
2. Log结构
{
ASLMessageID = 3827200;
“CFLog Local Time” = “2011-03-12 16:31:02.592″;
“CFLog Thread” = 903;
Facility = “com.apple.console”;
GID = 20;
Level = 4;
Message = “Hello World!”;
PID = 27692;
ReadUID = 501;
Sender = Test14;
Time = 1299918662;
TimeNanoSec = 593334000;
UID = 501;
}
其中我们比较关注的有这几项:
- Facility:用一个反链接形式字符串标示发送Log的来源,比如NSLog内部就使用的是com.apple.console
- Level: 等级,NSLog的等级是4,也就是Warnning,根据之前我们多/private/etc/syslog.conf 查看,只要是在Notice(5)之上的Log都可以被记录到/private/var/system.log中去。所以你调用一个NSLog你就可以去看看你的system.log文件
- Message: 就是消息本省
- Sender:你的应用程序名称
3. 查看Log的方法
Mac
- 如果你的systemlog.conf配置正确,就可以直接去查看这个文件 /private/var/log/system.log
- 打开/Applications/Utilities/Console这个程序,在Log List中选Console Messages就可以查看所有程序的NSLog打印出来的信息了。如图:
如图所示,Console中也提供了查看system.log的快捷方式。这里可能对你造成困惑,为什么有了system.log还有一个Console Messages。其实说白了Console Messages只是讲system log 中facility为“com.apple.console”的都筛选出来了,所以你就姑且可以把Console Messages中的信息认识全部是NSLog产生的。但是其实如果你自己发送一个facility=“com.apple.console”的日志,同样会出现在Console Messages中。
iOS
在真机上调试程序的时候打开Xcode 中的Oganizer, 然后在你当前的device下选取Console就可以看到这个Device的System Log了,如图。
这里我用的是xcode 4,所以界面和你的也许会不一样。
4. 程序员使用NSLog注意事项
- NSLog在打印信息的同时要发送日志,效率低
- 程序一些调试信息通过NSLog发送到System Log之后,很容易被其他人查看到,对你程序的安全性造成了直接的威胁。除了通过xcode的oganizer可以查看console,在iPhone上有一个叫ConsoleLog的程序可以查看你的这些日志(http://itunes.apple.com/us/app/consolelog/id415116252?mt=8)。
三 14, 2011 @ 10:39:56
这笔迹。。真清秀
三 17, 2011 @ 20:04:52
这也是清秀?
三 14, 2011 @ 10:40:45
奇怪啊,明明我是沙发,为啥显示“2 comments”?
三 15, 2011 @ 11:01:35
下了一个晚上的xcode 4 看博主的xcode 4中的organizer还挺犀利
八 02, 2011 @ 23:10:34
你好,我刚开始在Xcode中调试程序,
现在使用的是 Xcode 4.1 (Lion上),有个很奇怪的情况,就是程序中使用了 NSLog 之后,应该打印出我写的信息,但是我找不到哪里去看这个信息,已经查找了 Xcode 的 Debug 区域,没有信息,在 console 中也没有相关信息。在网上搜来搜去,都没有相关的问题,所以我想可能是我自己还不知道 Xcode 该如何使用⋯⋯ [但是看了你的文章,觉得我是用了 NSLog,应该会在系统 console 中有信息的啊⋯⋯还是没看到⋯⋯],只要留言咨询了:)
八 12, 2011 @ 10:34:47
你看以下你的console 的output设置正确没有。。。。我估计你是选了debugger output了。。。
