iOS開發(fā)日志輸出NSLogger配置

Why NSLogger ?

NSLogger是一個便捷好用的第三方日志庫临梗,Github官方鏈接:https://github.com/fpillet/NSLogger

來自官方的介紹:
NSLogger is a high performance logging utility which displays traces emitted by client applications running on macOS, iOS and Android. It replaces traditional console logging traces (NSLog(), Java Log).

The NSLogger Viewer runs on macOS and replaces Xcode, Android Studio or Eclipse consoles. It provides powerful additions like display filtering, defining log domain and level, image and binary logging, message coloring, traces buffering, timing information, link with source code, etc.


demo_video.gif
個人認為其比起iOS自帶的NSLog直接好處為:
  • 不需要有線連接猫十,基于Bonjour service服務(wù)發(fā)現(xiàn)協(xié)議在局域網(wǎng)內(nèi)自動捕捉客戶端發(fā)送的log信息(也能配置在廣域網(wǎng)接受遠程internet客戶端的日志輸出)
  • 有自己獨立的桌面軟件查看日志,故而支持給log加tag谆沃,過濾等高階日志查看操作傻挂,甚至支持輸出圖片作為日志;
  • 解決了NSLog終端日志輸出不完整問題(NSLog輸出超長文本等經(jīng)常會有長度限制)
  • 安裝使用方便,提供現(xiàn)成的宏替換(重定向)NSLog的日志輸出到NSLogger
//提供的NSLogger.h頭文件已經(jīng)預(yù)定義了很多現(xiàn)有的宏
//可根據(jù)實際需求更改定義自己的宏來使用
#ifdef DEBUG
    #define NSLog(...)                      LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"NSLog", 0, __VA_ARGS__)
    #define LoggerError(level, ...)         LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"Error", level, __VA_ARGS__)
    #define LoggerApp(level, ...)           LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"App", level, __VA_ARGS__)
    #define LoggerView(level, ...)          LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"View", level, __VA_ARGS__)
    #define LoggerService(level, ...)       LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"Service", level, __VA_ARGS__)
    #define LoggerModel(level, ...)         LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"Model", level, __VA_ARGS__)
    #define LoggerData(level, ...)          LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"Data", level, __VA_ARGS__)
    #define LoggerNetwork(level, ...)       LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"Network", level, __VA_ARGS__)
    #define LoggerLocation(level, ...)      LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"Location", level, __VA_ARGS__)
    #define LoggerPush(level, ...)          LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"Push", level, __VA_ARGS__)
    #define LoggerFile(level, ...)          LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"File", level, __VA_ARGS__)
    #define LoggerSharing(level, ...)       LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"Sharing", level, __VA_ARGS__)
    #define LoggerAd(level, ...)            LogMessageF(__FILE__, __LINE__, __FUNCTION__, @"Ad and Stat", level, __VA_ARGS__)

#else
    #define NSLog(...)                      LogMessageCompat(__VA_ARGS__)
    #define LoggerError(...)                while(0) {}
    #define LoggerApp(level, ...)           while(0) {}
    #define LoggerView(...)                 while(0) {}
    #define LoggerService(...)              while(0) {}
    #define LoggerModel(...)                while(0) {}
    #define LoggerData(...)                 while(0) {}
    #define LoggerNetwork(...)              while(0) {}
    #define LoggerLocation(...)             while(0) {}
    #define LoggerPush(...)                 while(0) {}
    #define LoggerFile(...)                 while(0) {}
    #define LoggerSharing(...)              while(0) {}
    #define LoggerAd(...)                   while(0) {}

#endif

安裝使用基于Github官方的文檔走就行奔害,CocoaPods安裝依賴庫,然后Mac安裝一個日志查看桌面軟件即可地熄。

存在的問題

由于該日志輸出是基于Bonjour service這個服務(wù)發(fā)現(xiàn)協(xié)議來尋找日志的接收端(即發(fā)出日志的應(yīng)用為client华临,接收查看日志的桌面Viewer軟件為Server),默認情況下App輸出日志時端考,會作為client會在局域網(wǎng)內(nèi)自動搜索日志接收server雅潭,找到的第一個server則建立日志輸出連接,日志查看軟件Viewer會自動打開一個新窗口顯示日志却特。

但是當(dāng)公司的局域網(wǎng)內(nèi)有多個日志輸出客戶端(多個App使用該日志庫)和日志接收查看Viewer Server(多個測試人員開著日志查看Viewer看log)扶供,日志輸出連接會錯亂,A輸出的日志可能會連接顯示到B的日志查看Viewer軟件上裂明。

問題解決

官方目前新版本也已經(jīng)給使用CocoaPods安裝庫的童鞋們內(nèi)置了一個方案:Using NSLogger on a Shared Network

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    //在應(yīng)用啟動時調(diào)用其定義的宏
    LoggerSetupBonjourForBuildUser();
    return YES;
}

LoggerSetupBonjourForBuildUser();為展示該宏具體實現(xiàn)椿浓,下面手動做一個配置,明白其配置原理便于做出更高階更適合自身使用場景的配置:

Step 1: 添加Run Pre-action Scheme

配置Xcode運行Run命令的前置腳本闽晦,使得每次運行Run命令自動打開NSlogger Viewer日志查看軟件扳碍。


編輯Scheme

添加打開NSLogger腳本

Step 2 : 修改Build Setting添加PREPROCESSOR MACROS

添加自定義的預(yù)處理宏

類似經(jīng)常使用的DEBUG宏,這里加一個自定義的LOGGER_TARGET宏
LOGGER_TARGET=@\"$(USER)\"即定義LOGGER_TARGET為當(dāng)前系統(tǒng)登錄用戶的用戶名仙蛉。

Step 3 : Config LoggerSetupBonjour

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    //在應(yīng)用啟動時調(diào)用其定義的宏
    #ifdef LOGGER_TARGET
    LoggerSetupBonjour(NULL, NULL, (CFStringRef)LOGGER_TARGET);
   //LoggerSetupBonjour(LoggerGetDefaultLogger(), NULL, (CFStringRef)LOGGER_TARGET);
    #endif
    return YES;
}

配置日志輸出的目標Bonjour Service為指定的名稱笋敞,即配置該日志只會輸出到名為LOGGER_TARGET(編譯該App的電腦的系統(tǒng)賬戶名稱)

Step 4 : NSLogger Viewer日志查看軟件配置

配置日志查看軟件Viewer的Bonjour Service Name

配置NSLogger Viewer日志查看軟件的Bonjour Service名字為當(dāng)前系統(tǒng)賬戶名。

上述配置即完成了指定日志輸出到編譯該App電腦的賬戶名稱的日志查看客戶端荠瘪,測試可以修改日志查看軟件的Bonjour Service Name可以指定接收查看對應(yīng)App的日志輸出夯巷。

高階拓展

追蹤官方提供的內(nèi)置宏,發(fā)現(xiàn)其實也是通過CocoaPods內(nèi)置一個NSLOGGER_BUILD_USERNAME哀墓,然后通過LoggerSetupBonjour配置輸出到指定的日志接收服務(wù)趁餐。

void LoggerSetupBonjourForBuildUser() {
    LoggerSetupBonjour(LoggerGetDefaultLogger(), NULL, CFSTR(nslogger_xstr(NSLOGGER_BUILD_USERNAME)));
}

上述方案也只是簡單解決了單個項目可以通過不同研發(fā)電腦的賬戶名區(qū)分日志輸出,若是都是通過Jekins在同一臺機器上編譯打包麸祷,那也是難以區(qū)分接收不同的日志澎怒;所以更多的需要結(jié)合Jekins參數(shù)化打包,在打包時手動配置一個日志targetName參數(shù)(例如打包任務(wù)創(chuàng)建者的名字),然后在App啟動時喷面,didFinishLaunchingWithOptions函數(shù)內(nèi)讀取該targetName參數(shù)星瘾,配置LoggerSetupBonjour。
例如:每個測試輸入自己的名字配置jekins打包targetName參數(shù)惧辈,然后該測試打包出來的App就可以通過配置Viewer軟件的Bonjour Service Name來指定接收查看自己正在測試的App的日志輸出琳状;若有多個需要測試的項目也可以使用“姓名_appName”來唯一限定日志輸出目標.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盒齿,隨后出現(xiàn)的幾起案子念逞,更是在濱河造成了極大的恐慌,老刑警劉巖边翁,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翎承,死亡現(xiàn)場離奇詭異,居然都是意外死亡符匾,警方通過查閱死者的電腦和手機叨咖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啊胶,“玉大人甸各,你說我怎么就攤上這事⊙嫫海” “怎么了趣倾?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長某饰。 經(jīng)常有香客問我儒恋,道長,這世上最難降的妖魔是什么露乏? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任碧浊,我火速辦了婚禮,結(jié)果婚禮上瘟仿,老公的妹妹穿的比我還像新娘箱锐。我一直安慰自己,他們只是感情好劳较,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布驹止。 她就那樣靜靜地躺著,像睡著了一般观蜗。 火紅的嫁衣襯著肌膚如雪臊恋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天墓捻,我揣著相機與錄音抖仅,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛撤卢,可吹牛的內(nèi)容都是我干的环凿。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼放吩,長吁一口氣:“原來是場噩夢啊……” “哼智听!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渡紫,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤到推,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惕澎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莉测,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年集灌,在試婚紗的時候發(fā)現(xiàn)自己被綠了悔雹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡欣喧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梯找,到底是詐尸還是另有隱情唆阿,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布锈锤,位于F島的核電站驯鳖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏久免。R本人自食惡果不足惜浅辙,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阎姥。 院中可真熱鬧记舆,春花似錦、人聲如沸呼巴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衣赶。三九已至诊赊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間府瞄,已是汗流浹背碧磅。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲸郊。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓敲街,卻偏偏與公主長得像,于是被迫代替她去往敵國和親严望。 傳聞我的和親對象是個殘疾皇子多艇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,093評論 1 32
  • 個人戰(zhàn)略能力之清晰價值觀 這本書可以說是對史蒂芬柯維《高效能人士七個習(xí)慣》中要事第一的詳細解讀。 本書有兩個主題像吻,...
    kidII閱讀 207評論 0 1
  • 作為一個被“金融傳銷”的騙局坑過的大學(xué)生拨匆,我暗暗下定決心姆涩,一定要學(xué)會甄別就業(yè)信息,一定要去靠譜的公司面試實習(xí)惭每。于是...
    陳曦明閱讀 361評論 0 14
  • 文/沙羅木頭 楔子 “孩子骨饿,別走,呵呵...” “我看見你了台腥,你逃不掉的......” “逃不掉的宏赘,因為你是我選中...
    沙羅木頭閱讀 569評論 2 8
  • “當(dāng)時,馬孔多是個二十戶人家的村莊黎侈,一座座土房都蓋在河岸上察署,河水清澈,沿著遍布石頭的河床流去峻汉,河里的石頭光滑贴汪、潔白...
    聽萬壑鳥鳴閱讀 592評論 0 2