iOS開發日志輸出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服務發現協議在局域網內自動捕捉客戶端發送的log信息(也能配置在廣域網接受遠程internet客戶端的日志輸出)
  • 有自己獨立的桌面軟件查看日志,故而支持給log加tag,過濾等高階日志查看操作,甚至支持輸出圖片作為日志;
  • 解決了NSLog終端日志輸出不完整問題(NSLog輸出超長文本等經常會有長度限制)
  • 安裝使用方便,提供現成的宏替換(重定向)NSLog的日志輸出到NSLogger
//提供的NSLogger.h頭文件已經預定義了很多現有的宏
//可根據實際需求更改定義自己的宏來使用
#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這個服務發現協議來尋找日志的接收端(即發出日志的應用為client,接收查看日志的桌面Viewer軟件為Server),默認情況下App輸出日志時,會作為client會在局域網內自動搜索日志接收server,找到的第一個server則建立日志輸出連接,日志查看軟件Viewer會自動打開一個新窗口顯示日志。

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

問題解決

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

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

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

Step 1: 添加Run Pre-action Scheme

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


編輯Scheme

添加打開NSLogger腳本

Step 2 : 修改Build Setting添加PREPROCESSOR MACROS

添加自定義的預處理宏

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

Step 3 : Config LoggerSetupBonjour

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

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

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

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

配置NSLogger Viewer日志查看軟件的Bonjour Service名字為當前系統賬戶名。

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

高階拓展

追蹤官方提供的內置宏,發現其實也是通過CocoaPods內置一個NSLOGGER_BUILD_USERNAME,然后通過LoggerSetupBonjour配置輸出到指定的日志接收服務。

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

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,120評論 1 32
  • 個人戰略能力之清晰價值觀 這本書可以說是對史蒂芬柯維《高效能人士七個習慣》中要事第一的詳細解讀。 本書有兩個主題,...
    kidII閱讀 214評論 0 1
  • 作為一個被“金融傳銷”的騙局坑過的大學生,我暗暗下定決心,一定要學會甄別就業信息,一定要去靠譜的公司面試實習。于是...
    陳曦明閱讀 403評論 0 19
  • 文/沙羅木頭 楔子 “孩子,別走,呵呵...” “我看見你了,你逃不掉的......” “逃不掉的,因為你是我選中...
    沙羅木頭閱讀 591評論 2 8