騰訊Xlog接入指南與踩過的坑
一 為什麼要接入日誌列印系統?
相信大家在開發應用的時候,總會遇到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一下看看
臥槽,官方文件又來搞事情了
踩坑1:couldn't find "libstlport_shared.so
為什麼會出現這個bug?在接入Xlog到我們的專案中時,我建了一個demo,跑出來是不會報錯的,但是一旦接入到我們工程中,就拋了這個錯。在仔細看了官方文件後,知道了,原來xlog因為考慮依賴包的大小,只提供了armeabi和x86_64兩種cpu架構。
而我們的工程中,又是隻支援armeabi-v7a架構。所以這個時候需要怎麼辦呢?
解決方法:這個時候,我們只需要先使用armeabi編譯打包,然後把生成的libstlport_shared.so和libmasxlog.so拷貝到我們的工程中,放在對應log的module中即可,像這樣
踩坑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是支援多程式列印的,但是多程式列印需要制定每一個程式對應一個檔案。在這裡,我建議使用程式的名字作為一個資料夾,然後再放入對應的日誌檔案。這樣便於我們以後日誌的管理。當我們開啟更多程式的時候,也會自動生成,不用去一一匹配。
相關文章
- Flutter 接入iOS蘋果內購支付踩坑過程FlutteriOS蘋果
- phppresentation 踩坑指南PHP
- mpvue“踩坑”指南Vue
- 騰訊 iOS 三面-這是我踩過的坑!iOS
- GeoServer 踩過的坑Server
- ?踩坑指南——onnx系列
- 與webview打交道中踩過的那些坑WebView
- stylelint 接入實戰踩坑總結
- iOS私有Pod, 指南+踩坑iOS
- PX4配置過程與踩坑
- 我踩過的聽過的那些坑
- Flutter接入現有Android工程踩坑之旅FlutterAndroid
- Swift 使用微信 Mars/Xlog 填坑指南 —— Jinkey原創Swift
- 你踩過flutter的坑嗎Flutter
- JasperReport 中踩過的坑
- 解析資料踩過的坑
- VUE 使用中踩過的坑Vue
- 微信小程式踩坑指南【一】微信小程式
- Druid監控踩坑指南UI
- 親自踩過的vue的坑Vue
- 安裝 Laravel/horizon 踩過的坑Laravel
- wepy小程式踩過的坑(1)
- 那些年使用Hive踩過的坑Hive
- Hexo6 升級踩坑指南Hexo
- Webpack的踩坑與彙總Web
- 【踩坑指南】執行緒池使用不當的五個坑執行緒
- uniapp之那些年踩過的坑APP
- Redis 叢集部署及踩過的坑Redis
- 除錯py程式碼踩過的坑除錯
- C++之那些年踩過的坑C++
- 談談出入React框架踩過的坑React框架
- Vue2.0構建——踩過的坑Vue
- 淺談重構中踩過的坑
- Compose 延遲列表踩過的坑
- 踩過的坑(一)——web容器升級Web
- sonarqube配置全指南,sonarqube踩坑記錄
- Flutter開發環境搭建-踩坑指南Flutter開發環境
- SM 國密演算法踩坑指南演算法