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阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • 个人战略能力之清晰价值观 这本书可以说是对史蒂芬柯维《高效能人士七个习惯》中要事第一的详细解读。 本书有两个主题,...
    kidII阅读 205评论 0 1
  • 作为一个被“金融传销”的骗局坑过的大学生,我暗暗下定决心,一定要学会甄别就业信息,一定要去靠谱的公司面试实习。于是...
    陈曦明阅读 346评论 0 13
  • 文/沙罗木头 楔子 “孩子,别走,呵呵...” “我看见你了,你逃不掉的......” “逃不掉的,因为你是我选中...
    沙罗木头阅读 561评论 2 8
  • “当时,马孔多是个二十户人家的村庄,一座座土房都盖在河岸上,河水清澈,沿着遍布石头的河床流去,河里的石头光滑、洁白...
    听万壑鸟鸣阅读 574评论 0 2