前言
Mars 是微信官方的跨平臺跨業(yè)務(wù)的終端基礎(chǔ)組件衙耕,基于C++語言開發(fā)巩梢,可支持Android涯曲、iOS芽卿、Mac寺枉、Windows 平臺抑淫。
包含四大模塊
- comm:可以獨立使用的公共庫,包括 socket姥闪、線程始苇、消息隊列、協(xié)程等筐喳;
- xlog:高可靠性高性能的運行期日志組件催式;
- SDT: 網(wǎng)絡(luò)診斷組件函喉;
- STN: 信令分發(fā)網(wǎng)絡(luò)模塊,也是 Mars 最主要的部分蓄氧。
本篇主要介紹iOS下集成mars 的 xlog日志系統(tǒng)指南函似。
iOS接入項目全過程
一、Clone mars 項目
這里用的ssh方式克制喉童, 如果沒有配置github ssh,可以選擇https的撇寞,這里不多贅述。
git clone git@github.com:Tencent/mars.git
二堂氯、 編譯Mars
由于 Mars 是采用C++編寫蔑担,我們需要編譯Mars才可以導入到iOS項目中。這里我分步講解咽白。
- 檢查是否安裝cmake
如果沒有則需要安裝
which cmake
/usr/local/bin/cmake
安裝cmake 采用brew 安裝,如果沒有安裝brew 請自行百度安裝啤握。
brew install cmake
- 編譯mars
mars項目有許多py腳本一鍵編譯,這里采用ios的腳本
// 進去項目的 mars 文件夾中
cd ./mars/mars
python build_ios.py
//然后選擇 2 Clean && build xlog (由于只集成xlog 我們選2即可) 等待編譯
當看到如下文案既是編譯成功
==================Output========================
cmake_build/iOS/Darwin.out/mars.framework
三晶框、 導入framework到項目中
將/mars/mars/cmake_build/iOS/Darwin.out/mars.framework 拖入到iOS項目中
[圖片上傳失敗...(image-969f3e-1658282875387)]
導入如下系統(tǒng)Frameworks
[圖片上傳失敗...(image-de8429-1658282875387)]
- 將AppDelegate.m 改為 AppDelegate.mm 兼容c++
[圖片上傳失敗...(image-e7982f-1658282875387)]
四排抬、編寫Helper方法,可以參考Mars iOS Demo
[圖片上傳失敗...(image-44eab0-1658282875387)]
JRXlogManager 為基于Mars中 ios demo Helper類編寫的單例子
@interface JRXlogManager : NSObject
+ (instancetype)shared;
- (void)initXlog:(const char *)prefixName pathName:(NSString *)pathName;
/** 關(guān)閉Xlog */
- (void)closeXlog;
- (void)log:(XLoggerType)level tag:(const char *)tag content:(NSString *)content;
- (void)infoLogWithTag:(const char *)tag Content:(NSString *)content;
- (void)debugLogWithTag:(const char *)tag Content:(NSString *)content;
- (void)errorLogWithTag:(const char *)tag Content:(NSString *)content;
- (void)warningLogWithTag:(const char *)tag Content:(NSString *)content;
@end
- 初始化Xlog
這里我選擇在app didfinish中初始化授段, 實際應(yīng)該在登錄中切換蹲蒲,demo項目就隨意一點了。
[[JRXlogManager shared] closeXlog];
[[JRXlogManager shared] initXlog:[@"test_xlog_userId" UTF8String] pathName:XlogDirName];
[[JRXlogManager shared] infoLogWithTag:JRDebugMessage Content:@"App init()"];
- 核心方法
其中pub_key 對應(yīng) 一個private_key 到時解碼xlog文件的時候 要替換腳本里面的一個private_key 侵贵, mars 也提供了 gen_key.py 腳本 生成 RSA Key届搁。在 /mars/mars/log/crypt 目錄中
- (void)initXlog:(const char *)prefixName pathName:(NSString *)pathName {
NSString* logPath = getXlogPath(pathName);
// set do not backup for logpath
const char* attrName = "com.apple.MobileBackup";
u_int8_t attrValue = 1;
setxattr([logPath UTF8String], attrName, &attrValue, sizeof(attrValue), 0, 0);
// init xlog
#if DEBUG
xlogger_SetLevel(kLevelDebug);
mars::xlog::appender_set_console_log(true);
#else
xlogger_SetLevel(kLevelInfo);
appender_set_console_log(false);
#endif
mars::xlog::XLogConfig config;
config.mode_ = mars::xlog::kAppenderAsync;
config.logdir_ = [logPath UTF8String];
config.nameprefix_ = prefixName;
config.compress_mode_ = mars::xlog::kZlib;
config.compress_level_ = 0;
config.cachedir_ = "";
config.cache_days_ = 0;
// config.pub_key_ = "";
config.pub_key_ = "572d1e2710ae5fbca54c76a382fdd44050b3a675cb2bf39feebe85ef63d947aff0fa4943f1112e8b6af34bebebbaefa1a0aae055d9259b89a1858f7cc9af9df1";
// PRIV_KEY = "145aa7717bf9745b91e9569b80bbf1eedaa6cc6cd0e26317d810e35710f44cf8"
// PUB_KEY = "572d1e2710ae5fbca54c76a382fdd44050b3a675cb2bf39feebe85ef63d947aff0fa4943f1112e8b6af34bebebbaefa1a0aae055d9259b89a1858f7cc9af9df1"
appender_open(config);
}
五、上傳日志
xlog日志已經(jīng)存到到你設(shè)置的沙盒路徑窍育,正常來說你要拿這個沙盒路徑上傳到自己服務(wù)器卡睦,你可以選擇定時上傳 也可以選擇強拉用戶數(shù)據(jù)(依賴socket 推送到客戶端)。 當然開發(fā)模式情況下 我們可以選擇自己上傳漱抓,使用蘋果自帶的UIActivityViewController 就可以很輕松的使用Air Drop發(fā)到自己mac 或者 復(fù)制到微信表锻。具體代碼可以看我下面的demo地址源碼
[圖片上傳失敗...(image-b8921d-1658282875387)]
六、解析日志
方法一
mars 目錄/mars/mars/log/crypt 下 提供了三個腳本乞娄,我們?nèi)ソ馕鰔log日志浩嫌。但是如果你直接使用應(yīng)該會報錯,它有很多模塊依賴补胚,需要你一一用pip去安裝码耐。
分別是
- decode_mars_crypt_log_file.py
此為加密的解析方式溶其,需要替換里面的private_key 參數(shù)
- decode_mars_nocrypt_log_file.py
此為不加密的解析骚腥,如果你ios項目中的pub_key 為空傳,也就是不加密束铭,就用這個py腳本解析廓块。
- gen_key.py
生成一對新的RSA 可以
方法二
使用我用Flutter Desktop開發(fā)的 XlogDecoder解析桌面工具。目前只支持Mac契沫, 稍后會支持window带猴。 無需任何py環(huán)境,直接把xlog日志,或文件夾拖到窗口即可懈万。 會自動給你解析出相應(yīng)日志拴清。支持加密與不加密,加密的話需要你手動輸入private_key
[圖片上傳失敗...(image-394be2-1658282875387)]
七会通、附件地址
末尾
后續(xù)我編寫的xlog docoder GUI 也會編寫相應(yīng)文章口予,詳細說明原理 歡迎git hub star 以及 掘金點贊。