写代码易,调程序难。不论是多么资深的程序员,都不可能在毛线球一般的代码中弄清到底发生了什么,特别是当在程序在N多个线程中来回跳转和涉及到难以理解的内存操作的时候,我们不可避免地需要log的帮助来整理思路,确认到底发生了什么。而这时候,输出log的好坏和时机,往往决定了花在调试上的时间。
其实某种程度上来说,log是一门艺术,而从输出log上往往也能判断程序员的水平。新手往往都很可爱,NSLog(@”Hello World”)会是不变的模式。不得不承认这样的输出如果在恰当的时候也能一击致命,但是它所能带给我们的信息量实在太少了。水平再高一点的程序员大概会在关键事件的时候在保证代码通用性的前提下使用诸如__func__
之类的东西监测程序流程。高级程序员在log方面就会显得大巧若拙,也许会把整个代码流的行为都进行log,而不漏掉任何一个细节,包括所有的内部状态、各种事件、异常等,完全受掌控的代码和预期中的程序行为是他们成功的关键。而传说中的大牛级人物可能把更多的注意力放在线程,网络等时序上可能出错的地方,无谓的内存释放或是某个超时的网络请求都不会遗漏。
其实在面对纷繁芜杂的输出需求的时候,Cocoa环境默认的NSLog基本就是个废品:它不能给输出分门别类,不能按照需求输出除了字符的格式,也不能兼顾线程区别对待。而在高水平log的要求中,这些都应当是提供给开发者最基本、最便利的输出方式。
于是NSLogger出现了,在Florent Pillet的打造下,一个开源强力的输出工具给了log这一古老的工作崭新的生命。标签输出,优先级查找,直接输出图像,多线程标记,时序控制,甚至是通过网络log到别人的终端或者是从别人的终端程序中记录log。在这里,只有想不到没有做不到,堪称是史上最为强大的logger,而且最重要的是他是BSD License的。在我看来,任何apple开发者都不应该错过他。