騰訊Xlog接入指南與踩過的坑

weixin_34253539發表於2017-12-25

一 為什麼要接入日誌列印系統?

相信大家在開發應用的時候,總會遇到bug,這個時候,如果bug是在我們本地開發的過程中發現的,那麼我們把手機插入android studio進行聯調,就可以馬上定位到出錯的堆疊,報錯的資訊。但是,在我們的應用釋出出去,給使用者使用的時候,如果出現了bug,那麼,我們就很難定位出問題的所在。一般來說,我們需要使用錯誤上報系統,把錯誤上報給我們,比如騰訊的bugly,阿里的友盟等第三方的錯誤收集外掛。但是很多時候,bugly上報的錯誤並不能正確的把我們需要的錯誤資訊反饋給我們,或者說,我們無法定位在出現了bug的時候,使用者之前的操作是什麼。在Xlog還沒有上線的時候,我們發現一個bug需要怎麼做呢?首先,我們需要聯絡到這個使用者,爭取獲得使用者的配合。然後我們就發一個私包給使用者,使用者安裝後,重現剛才的bug,然後我們把操作日誌寫入本地的錯誤日誌中,讓使用者通過交流軟體發給我們。臥槽,這個步奏,想掀凳子有木有??

二 為什麼使用Xlog?

在上面我們的最後一個問題暴露出來後,為什麼我們不自己寫一個日誌系統呢?只是把文字寫入本地txt檔案中,多麼容易的事,一個inputStream OutputStream我們不是很玩的很溜麼?何必使用別人的東西??好吧,在回答這個問題的時候,我建議大家先看下這篇文章

https://mp.weixin.qq.com/s/cnhuEodJGIbdodh0IxNeXQ

如果大家嫌這篇文章太長,那麼我可以給大家一個簡單的總結,就是:XLog使用流式方式對單行日誌進行壓縮,壓縮加密後寫入作為log中間buffer的mmap中。使用xlog方案,除非io損壞或者磁碟沒有可用空間,基本可以保證不會丟失任何一行日誌

一個優秀的日誌列印系統,需要保證:

1. 不能把使用者的隱私資訊列印到日誌檔案裡,不能把日誌明文打到日誌檔案裡。

2. 不能影響程式的效能。最基本的保證是使用了日誌不會導致程式卡頓。

3. 不能因為程式被系統殺掉,或者發生了 crash,crash 捕捉模組沒有捕捉到導致部分時間點沒有日誌, 要保證程式整個生命週期內都有日誌。

4. 不能因為部分資料損壞就影響了整個日誌檔案,應該最小化資料損壞對日誌檔案的影響。

所以,既然有XLog這種好東西,我們在沒有把握自己開發一個更加優秀的xlog列印框架,我們就不要重複造輪子了,哈哈。

三 Xlog接入

step 1: 引入XLog依賴,在我們主工程的build.gradle中加入

dependencies {
    compile 'com.tencent.mars:mars-xlog:1.0.6'
}   

step 2:開始初始化Xlog環境

private void initXlogEnv(){
    System.loadLibrary("stlport_shared");
    System.loadLibrary("marsxlog");
    final String SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
    final String logPath = SDCARD + "/xlogdemo/log";
    final String cachePath = this.getFilesDir() + "/xlogdemo/xlog";
    if (BuildConfig.DEBUG) {
        Xlog.appenderOpen(Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, cachePath, logPath, "", "");
        Xlog.setConsoleLogOpen(true);

    } else {
        Xlog.appenderOpen(Xlog.LEVEL_INFO, Xlog.AppednerModeAsync, cachePath, logPath, "MarsSample", "");
        Xlog.setConsoleLogOpen(false);
    }

}  

四:開始踩坑之旅

ok到了這裡,按照Xlog官方給的接入步奏,我們這個時候應該就可以在我們的sdcard根目錄上看到logFile.log檔案了。ok,我們開開心心的來run一下看看

1729513-45814e8afdecb5c1.png
couldn't find "libstlport_shared.so"

臥槽,官方文件又來搞事情了

踩坑1:couldn't find "libstlport_shared.so

為什麼會出現這個bug?在接入Xlog到我們的專案中時,我建了一個demo,跑出來是不會報錯的,但是一旦接入到我們工程中,就拋了這個錯。在仔細看了官方文件後,知道了,原來xlog因為考慮依賴包的大小,只提供了armeabi和x86_64兩種cpu架構。

1729513-fbfb6625dad2c42d.png
xlog官方文件

而我們的工程中,又是隻支援armeabi-v7a架構。所以這個時候需要怎麼辦呢?
解決方法:這個時候,我們只需要先使用armeabi編譯打包,然後把生成的libstlport_shared.solibmasxlog.so拷貝到我們的工程中,放在對應log的module中即可,像這樣

1729513-d4f97f107688c117.png
xlog手動載入so

踩坑2:沒有對應的sdcard沒有生成目錄檔案

如果遇到問題,需要檢查一下是否在manifest中有申請sdcard寫入許可權。還有在android6.0以上系統,有沒有動態去申請儲存許可權。

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

踩坑3:同一個程式中,xlog不可以使用日誌列印檔案。

踩這個坑的原因是因為我們在日誌上報系統中,會需要重點記錄部分使用者行為,而這部分日誌上報行為是需要上報給服務端的。所以為了儘量減少日誌包的大小,同時讓為了使重要的日誌和其它日誌相隔開,我們想把這部分抽離出來一個檔案,方便服務端分析和管理。但經過嘗試後,這個行為xlog是不允許的,首先xlog會拋錯,錯誤資訊是當前的日誌檔案已經被開啟。
分析:其實這種一個程式只能寫入一個檔案是可以理解的,因為如果一個程式多檔案的話,xlog需要頻繁的去控制檔案流的輸出和關閉,這樣會導致效能問題,也可能會造成日誌丟失。

踩坑4:多程式xlog日誌列印

xlog是支援多程式列印的,但是多程式列印需要制定每一個程式對應一個檔案。在這裡,我建議使用程式的名字作為一個資料夾,然後再放入對應的日誌檔案。這樣便於我們以後日誌的管理。當我們開啟更多程式的時候,也會自動生成,不用去一一匹配。

相關文章