首先嘁圈,我們?nèi)ニ阉饕幌?Apple 關(guān)于 NSLog 的文檔。我們會(huì)發(fā)現(xiàn) NSLog 方法中調(diào)用的是 NSLogv 方法刀脏。Apple 文檔中對(duì)于 NSLogv 函數(shù)是這樣寫(xiě)的 :Logs an error message to the Apple System Log facility(參見(jiàn)https://developer.apple.com/reference/foundation/1395074-nslogv?language=objc)局荚。
這句話有兩個(gè)信息我們需要重點(diǎn)關(guān)注下,一個(gè)就是 error message ,還有一個(gè)就是 Apple System Log ,為啥 NSLog 是記錄錯(cuò)誤信息的愈污,而不是日志信息呢耀态?Apple System Log 又是個(gè)什么鬼?
不急暂雹,我們?cè)偎阉飨?CocoaLumberjack 的文檔首装,我們會(huì)發(fā)現(xiàn) CocoaLumberjack 的文檔說(shuō)了這么兩句話 :
NSLog does 2 things: It writes log messages to the Apple System Logging (asl) facility. This allows log messages to show up in Console.app. It also checks to see if the application's stderr
stream is going to a terminal (such as when the application is being run via Xcode). If so it writes the log message to stderr (so that it shows up in the Xcode console).
參見(jiàn)https://github.com/CocoaLumberjack/CocoaLumberjack/blob/b1a3837366bc286ee24671ef1042b7214a8aa0ca/Documentation/Performance.md
CocoaLumberjack 的文檔告訴我們,當(dāng)我們寫(xiě)了一句 NSLog 的時(shí)候杭跪,他會(huì)做兩件事情:
把日志寫(xiě)到 Apple System Log 里面仙逻。
把日志展示到 Xcode 的控制臺(tái)上面。
兩個(gè)文檔都提到了 Apple System Log 涧尿,那這個(gè) Apple System Log 到底是個(gè)什么鬼系奉。其實(shí) Apple System Log 可以理解為就是一個(gè)我們?cè)O(shè)備的日志數(shù)據(jù)庫(kù),這里存放了所有應(yīng)用所有進(jìn)程產(chǎn)生的日志姑廉。也就是說(shuō)缺亮,不管在哪,只要你調(diào)用了 NSLog ,系統(tǒng)就會(huì)把它寫(xiě)到 Apple System Log 中桥言。
那為啥 NSLog 是記錄錯(cuò)誤信息的萌踱,而不是日志信息呢?其實(shí) Apple 設(shè)計(jì) NSLog 的時(shí)候就是一個(gè)記錄錯(cuò)誤日志的 API号阿,不然他也不會(huì)把日志寫(xiě)到一個(gè)叫 Apple System Log 的數(shù)據(jù)庫(kù)里面并鸵,要知道記錄日志是一個(gè)高頻發(fā)的操作,如果每條都放到數(shù)據(jù)庫(kù)中倦西,是一件很浪費(fèi)性能的事情能真。所以我覺(jué)得應(yīng)該叫 NSLogError 才更合適。
NSLog 耗性能的一個(gè)原因也是因?yàn)樾枰讶罩緮?shù)據(jù)寫(xiě)到 Apple System Log 數(shù)據(jù)庫(kù),所以大伙的 App 線上 Release 版本盡量不要寫(xiě) NSLog 粉铐,不但耗性能疼约,而且不安全。Swift 的 print 方法就不會(huì)把日志寫(xiě)到數(shù)據(jù)庫(kù)中蝙泼。當(dāng)然在 Swift 中并沒(méi)有廢棄掉 NSLog 方法程剥,但是 Swift 對(duì) NSLog 方法做了優(yōu)化,只有在模擬器環(huán)境下才會(huì)將日志寫(xiě)入 Apple System Log 汤踏。
未完待續(xù)