對于iOS開發(fā)的同學(xué)們隆圆,iOS系統(tǒng)除了NSLog打印API之外,沒有提供任何log規(guī)范镀岛。因此弦牡,在實際iOS客戶端開發(fā)工作中,尤其當團隊中開發(fā)人員較多漂羊、項目模塊較豐富時驾锰。開發(fā)同學(xué)每次聯(lián)機進行debug調(diào)試時,控制臺便是各種log走越,甚至不得不通過查找的方式尋找關(guān)鍵信息椭豫。
甚至有些log直接打印在release環(huán)境中,如果沒有規(guī)范化的log管理旨指,難免一些敏感信息會被泄露赏酥。
針對上述可能存在的問題,F(xiàn)irefly_iOS一開始就定義了明確的log規(guī)范
- 1.所有的log只在debug環(huán)境下輸出谆构,release環(huán)境除了某些三方SDK無法控制外裸扶,原則上自己的代碼不建議產(chǎn)生任何log輸出。
- 2.log嚴格功能模塊進行管理搬素,日志的輸出或關(guān)閉要做到模塊粒度的控制姓言。
一瞬项、詳解可插拔式的log規(guī)范:
- 1蔗蹋、先看一組宏定義:
#define INFO_NEW_FMT(fmt) \
[NSString stringWithFormat:@"[INFO] %s(%d) %@", \
__FUNCTION__, \
__LINE__, \
fmt]
上述宏定義的其實核心就是輸出一組log信息何荚,包括三個參數(shù)信息: 函數(shù)名、代碼行號以及真正打印的NSString格式的log猪杭。
- 2餐塘、類似的,我們定義另外一個ERROR級別的宏:
#define ERROR_NEW_FMT(fmt) \
[NSString stringWithFormat:@"[ERROR] %s(%d) %@", \
__FUNCTION__, \
__LINE__, \
fmt]
不難發(fā)現(xiàn)這兩組宏的差別僅在于log的模板開頭一個是"[INFO]"皂吮,一個是"[ERROR]"
- 3戒傻、基于上述的基本規(guī)則,項目組還可以根據(jù)實際的項目要求作一些個性化的定制蜂筹。
例如: 有的項目組可能要求內(nèi)測階段需纳,debug環(huán)境下要打印所有的warning級別的信息。這時候艺挪,我們只需要根據(jù)的根據(jù) #ifdef DEBUG作進一步判斷定制即可不翩。
二、實際使用示例
客戶端要新開發(fā)一個TEST功能模塊麻裳。
- 1口蝠、根據(jù)模塊化log原則,我們首先基于上述的宏定義津坑,定義TEST模塊的相關(guān)log接口定義妙蔗。
#define TEST_LOG
#ifdef TEST_LOG
#define TestLog_i(fmt,...) NSLog(INFO_NEW_FMT(fmt),##__VA_ARGS__,nil)
#define TestLog_e(fmt,...) NSLog(ERROR_NEW_FMT(fmt),##__VA_ARGS__,nil)
#else
#define TestLog_i(fmt,...)
#define TestLog_e(fmt,...)
#endif
特別注意宏開關(guān)#define TEST_LOG才是可插拔的核心,通過TEST_LOG的定義與否即可實現(xiàn)該模塊的log是否被輸出疆瑰。
- 2眉反、TEST模塊需要輸出log時,調(diào)用相應(yīng)級別的log輸出接口即可.
- (void)testModule
{
TestLog_i(@"getStringCache:%@", [localCache getStringCache]);
TestLog_i(@"getArrayCache:%@", [[localCache getArrayCache] description]);
TestLog_e(@"getArrayCache:%@", [[localCache getDictionaryCache] description]);
}
- 3穆役、調(diào)用函數(shù)testModule時寸五,最后打印出如下日志信息:
2015-01-27 14:25:32.926 MSZXFramework[2888:85719] [INFO] +[MSZXModuleTest testModule](88) getStringCache:(null)
2015-01-27 14:25:32.927 MSZXFramework[2888:85719] [INFO] +[MSZXModuleTest testModule](90) getArrayCache:(null)
2015-01-27 14:25:32.928 MSZXFramework[2888:85719] [ERROR] +[MSZXModuleTest testModule](92) getArrayCache:(null)
- 4、相應(yīng)的功能模塊完成孵睬,需要發(fā)布到release環(huán)境時播歼,將相應(yīng)log的宏開關(guān)關(guān)掉即可,如代碼所示:
//#define TEST_LOG
#ifdef TEST_LOG
#define TestLog_i(fmt,...) NSLog(INFO_NEW_FMT(fmt),##__VA_ARGS__,nil)
#define TestLog_e(fmt,...) NSLog(ERROR_NEW_FMT(fmt),##__VA_ARGS__,nil)
#else
#define TestLog_i(fmt,...)
#define TestLog_e(fmt,...)
#endif
三掰读、使用原則總結(jié)
- 1.每次新增一個功能模塊FUNC秘狞,單獨定義一個模塊的log宏定義:FuncLog_i,FuncLog_e,并使用宏FUNC_LOG進行開關(guān)控制蹈集。
- 2.如果要追蹤FUNC模塊的log信息烁试,只需將宏開關(guān)FUNC_LOG打開即可。
- 3拢肆、如果已經(jīng)調(diào)試完畢减响,可以正式合并代碼了靖诗,支付將宏開關(guān)FUNC_LOG關(guān)閉,那么該功能模塊的日志信息就不會打印了支示。