App技術選型--日志框架

title: App技術選型--日志框架

版 本 歷 史

版本 責任人 日期 備注
V1.0 曾維銘 2017-04-12 創(chuàng)建文檔蝉揍。

日志對于開發(fā)來說是非常重要的,不管是調(diào)試數(shù)據(jù)查看盹牧、bug問題追蹤定位钞瀑、數(shù)據(jù)信息收集統(tǒng)計沈撞,日常工作運行維護等等,都大量的使用到雕什。

功能需求

  • 線程的信息
  • 類的信息
  • 方法的信息
  • 格式打印JSON缠俺、XML等
  • 點擊鏈接跳轉(zhuǎn)到源碼打印處
  • 擁有默認TAG和自定義TAG
  • release包中不能泄漏Log
  • 使用友好,使用高效
  • 日志持久化到本地
  • 日志框架的擴展性

Xlog

mars 是微信官方的終端基礎組件贷岸,是一個使用C編寫的業(yè)務性無關壹士,平臺性無關的基礎組件。Xlog是mars中可以獨立使用的日志模塊偿警。

優(yōu)勢:

  • 性能好:使用了中間層躏救,減少了讀寫磁盤的次數(shù)。使用mmap進行邏輯內(nèi)存對磁盤文件進行映射螟蒸,中間只是進行映射沒有任何拷貝操作盒使,避免了寫文件的數(shù)據(jù)拷貝,操作內(nèi)存就相當于在操作文件七嫌,避免了內(nèi)核空間和用戶空間的頻繁切換少办。占用內(nèi)存CPU資源少。
  • 功能豐富:與原生Log使用幾乎一致诵原,但增加了寫入文件功能英妓,同時自帶加密
  • 穩(wěn)定:騰訊微信團隊正在使用,久經(jīng)考驗皮假。

面臨的問題:

  • Xlog是用C寫的,出問題調(diào)試起來不太友好骂维。
  • so庫比較大惹资,導入后APK增大1.5M。

解決方案:

  • 只能通過 xlog 輸出的信息進行排查航闺。不過日志作為輔助系統(tǒng)褪测,出問題可能性低,而且問題影響不大潦刃。
  • 如果很在乎APK包大小的話侮措,可以只集成armeabi的so包。

持久化的實現(xiàn)

為了提高日志的性能乖杠,Xlog引入了 mmap作為中間buff層分扎,當buff層滿足一定條件時,才將日志寫到存儲空間胧洒。

日志存儲位置

初始化時畏吓,寫在logPath中墨状。
logPath = Environment.getExternalStorageDirectory().getAbsolutePath()/sdcard/PhiComm/app name/logs

日志文件命名

APP名_日期

日志格式

一般內(nèi)容:[日志級別][日期][PID][TAG(類名)][線程---日志內(nèi)容]
方法棧:[日志級別][日期][PID][TAG(類名)][線程---方法棧]

日志使用策略

每次啟動時會刪除過期文件,只保留十天內(nèi)的日志文件(該值定義在appender.cc中的 kMaxLogAliveTime )菲饼,所以給 Xlog 的目錄請使用單獨目錄肾砂,防止誤刪其他文件。目前不會根據(jù)文件大小進行清理宏悦。如若想自定義清理邏輯請自行更改appender.cc中的 __del_timeout_file 函數(shù)镐确。

日志使用級別

<table><tr><th></th><th colspan="2">debug</th><th colspan="2">release</th></tr><tr><td></td><td>控制臺</td><td>持久化</td><td>控制臺</td><td>持久化</td></tr><tr><td>v</td><td>程序說明</td><td>null</td><td>null</td><td>程序說明</td></tr><tr><td>d</td><td>需要調(diào)試的代碼</td><td>null</td><td>null</td><td>null</td></tr><tr><td>i</td><td>程序正常運行時日志</td><td>程序正常運行時日志</td><td>null</td><td>程序正常運行時日志</td></tr><tr><td>w</td><td>會出現(xiàn)潛在錯誤的情形</td><td>會出現(xiàn)潛在錯誤的情形</td><td>null</td><td>會出現(xiàn)潛在錯誤的情形</td></tr><tr><td>e</td><td>catch塊中,程序狀態(tài)檢查語句</td><td>catch塊中饼煞,程序狀態(tài)檢查語句</td><td>null</td><td>catch塊中源葫,程序狀態(tài)檢查語句</td></tr></table>

日志混淆問題

類名,方法名等參數(shù)使用的是Java lang包下的StackTraceElement和Throwable獲得派哲。具體混淆策略需要在原型中測試后才能確定臼氨。

LogUtils

由于Xlog提供的功能有限,為了滿足使用需求芭届,這里對Xlog進行了封裝储矩。

實現(xiàn)的功能:

  • 支持打印字符串,集合褂乍,JSON持隧,日志級別,日期逃片,線程ID屡拨,線程名,異常信息褥实,堆棧信息呀狼,源代碼跳轉(zhuǎn)。
  • 日志持久化到外部存儲损离,自動清理過期日志哥艇,保存最近十天的日志文件。

使用指南

1.添加讀寫權限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2.在Application的onCreate中初始化

初始化:

LogUtils.init();

注:

  1. 為了不造成混亂僻澎,這里初始化時不提供自定義配置貌踏。如日志默認TAG,保存路徑窟勃,日志方法棧打印數(shù)量等在代碼中寫死祖乳。
  2. 根據(jù)BuildConfig.DEBUG參數(shù),debug下會打印到控制臺秉氧,release下控制臺輸出關閉眷昆。

3.打印日志

    public static void d(Object message) 
    public static void d(Object message, boolean isPrStack) 
    public static void d(String tag, Object message, boolean isPrStack) {
    public static void d(String tag,final String message, boolean isPrStack, final Object... args)
    public static void json(String json, boolean isPrStack) 
    public static void log(int priority, String tag, Object message, boolean isPrStack, @Nullable Throwable throwable, Object...args)


注:

  1. message為打印內(nèi)容,可接收任意參數(shù)。
  2. isPrStack控制是否打印堆棧信息隙赁。
  3. 支持對日志字符串格式化垦藏,args為參數(shù)。內(nèi)部會調(diào)用String.format(String format伞访, Object args)掂骏。
  4. JSON輸出的縮進默認為2,可自行修改厚掷。
  5. 打印異常信息可調(diào)用log弟灼,傳入Throwable。
  6. 堆棧打印的方法數(shù)通過METHOD_CCOUNT控制冒黑,默認為8田绑。可以自行修改(可能要考慮線程安全問題抡爹,不過影響也不大)掩驱。

打印JSON結(jié)果

[I][2017-04-20 +8.0 15:52:40.412][12502, 1*][PhiComm][, , 0][Thread:main---{
  "name": "BeJson",
  "url": "http:\/\/www.bejson.com",
  "page": 88,
  "isNonProfit": true,
  "address": {
    "street": "科技園路.",
    "city": "江蘇蘇州",
    "country": "中國"
  },
  "links": [
    {
      "name": "Google",
      "url": "http:\/\/www.google.com"
    },
    {
      "name": "Baidu",
      "url": "http:\/\/www.baidu.com"
    },
    {
      "name": "SoSo",
      "url": "http:\/\/www.SoSo.com"
    }
  ]
}

字符串,堆棧,Throwable打印結(jié)果

[D][2017-04-20 +8.0 15:52:40.411][12502, 1*][Throw][, , 0][Thread:main---{i=zwm, love=joyce}
VMStack.java/dalvik.system.VMStack/getThreadStackTrace/-2
Thread.java/java.lang.Thread/getStackTrace/580
LogUtils.java/com.example.weimingzeng.myapplication.LogUtils/getThreadStack/206
LogUtils.java/com.example.weimingzeng.myapplication.LogUtils/log/232
MainActivity.java/com.example.weimingzeng.myapplication.MainActivity/onCreate/31
Activity.java/android.app.Activity/performCreate/6323
Instrumentation.java/android.app.Instrumentation/callActivityOnCreate/1108
ActivityThread.java/android.app.ActivityThread/performLaunchActivity/2385:java.lang.Throwable
    at com.example.weimingzeng.myapplication.MainActivity.onCreate(MainActivity.java:31)
    at android.app.Activity.performCreate(Activity.java:6323)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2385)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2492)
    at android.app.ActivityThread.access$900(ActivityThread.java:153)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1358)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5458)

在程序退出時反初始化:

LogUtils.unLoad();

4.解析Log

Log生成完畢后冬竟,會在指定的路徑下生成相應的日志文件:

shell@R7:/sdcard/marssample/log $ ll
-rw-rw---- root     sdcard_r   153600 2016-12-30 17:06 MarsSample.mmap2
-rw-rw---- root     sdcard_r    29633 2016-12-30 17:06 MarsSample_20161230.xlog

由于使用緩存欧穴,日志只有在應用退出時才會將日志寫入外部存儲。其中MarsSample.mmap2是緩存文件泵殴,不用關心涮帘,我們需要的是.xlog文件,我們把這個文件pull出來笑诅,使用Mars提供的Python腳本進行解密调缨。

找到Mars源碼log/crypt/decode_mars_log_file.py下的這個文件,用python執(zhí)行吆你,生成log文件:

mars_xlog_sdk python decode_mars_log_file.py ~/Downloads/log/MarsSample_20161230.xlog

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弦叶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妇多,更是在濱河造成了極大的恐慌伤哺,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砌梆,死亡現(xiàn)場離奇詭異默责,居然都是意外死亡贬循,警方通過查閱死者的電腦和手機咸包,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杖虾,“玉大人烂瘫,你說我怎么就攤上這事。” “怎么了坟比?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵芦鳍,是天一觀的道長。 經(jīng)常有香客問我葛账,道長柠衅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任籍琳,我火速辦了婚禮菲宴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趋急。我一直安慰自己喝峦,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布呜达。 她就那樣靜靜地躺著谣蠢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪查近。 梳的紋絲不亂的頭發(fā)上眉踱,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音嗦嗡,去河邊找鬼勋锤。 笑死,一個胖子當著我的面吹牛侥祭,可吹牛的內(nèi)容都是我干的叁执。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼矮冬,長吁一口氣:“原來是場噩夢啊……” “哼谈宛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胎署,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤吆录,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琼牧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恢筝,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年巨坊,在試婚紗的時候發(fā)現(xiàn)自己被綠了撬槽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡趾撵,死狀恐怖侄柔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤暂题,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布移剪,位于F島的核電站,受9級特大地震影響薪者,放射性物質(zhì)發(fā)生泄漏纵苛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一言津、第九天 我趴在偏房一處隱蔽的房頂上張望赶站。 院中可真熱鬧,春花似錦纺念、人聲如沸贝椿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烙博。三九已至,卻和暖如春烟逊,著一層夾襖步出監(jiān)牢的瞬間渣窜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工宪躯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乔宿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓访雪,卻偏偏與公主長得像详瑞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子臣缀,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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