轉載請註明出處
微信公眾號 jinkey-love
簡書 JinkeyBlog
Github Jinkeycode
示例程式碼地址:
github.com/Jinkeycode/…
Step 1 下載程式碼
使用 git clone 或者直接下載 zip,解壓後進入目錄 mars-master/mars/libraries,看到有一個 build_apple.py 的檔案
Step 2 編譯Mars
在終端進入工程目錄輸入
python build_apple.py複製程式碼
然後回答一系列問題
第一個問題
input prefix for save directory. like
trunk
,br
,tag
:
輸入儲存目錄的字首
第二個問題
Enter menu:
- build mars for iphone.
- build mars for iphone with bitcode.
- build xlog for iphone
- build mars for macosx.
- build all.
- exit.
選擇 3 回車,報錯:
xcodebuild: error: Unknown build action 'Center/marsmaster/mars/libraries/../marslogiphone.xcodeproj'.
!!!!clean iphoneos10.0 failed!!!
看看控制檯列印的記錄發現路徑和我目錄的路徑不一致:
Download\ Center/mars-master/mars/mars-log-iphone.xcodeproj
對比之後發現一個大坑:build_apple.py 的路徑不能有空格!!!
編譯成功之後生成一個以你自定義字首的目錄,裡面就有 framwork:
從 mars-log-iphone.xcodeproj 的 iOS deployment target 來看,最低支援 iOS 7.
Step 3 引入專案
將 mars.framework 拖入 Linked Frameworks and Libraries 並且加入其他四個系統庫,弄好之後如下:
20170102 早上的 mars.framework 漏了一個斜槓,會導致無法編譯,20170102 下午官方已修復,請確保你把版本更新到你看這篇文章時候的最新版本。
Step 4 引入輔助庫
將編譯得到的 log_crypt.cc
(log_crypt.cc.rewriteme 直接重新命名去掉 .rewriteme)、log_crypt.h
拖入 Xcode 左側目錄結構,彈出的對話方塊勾選“Copy items if needed”
把mars-master/samples/iOS/iOSDemo/Component
目錄下的 LogHelper.h
、LogHelper.mm
、LogUtil.h
、LogUtil.m
拖入 Xcode 左側目錄結構,彈出的對話方塊勾選 “Copy items if needed”
為了整潔,對幾個檔案進行了分組
最終的檔案目錄和工程目錄如下:(忽略 Appender2SwiftBridge), 下文會說到)
Step 5 橋接 Objective-C 和 C++ 程式碼
新建兩個檔案(不想寫的可以直接下載 Github 下的示例程式碼拖入工程)
appender-swift-bridge.h
// Created by Jinkey on 2017/1/2.
// Copyright © 2017年 Jinkey. All rights reserved.
// appender-swift-bridge.h
#include
#import
#import "LogUtil.h"
typedef NS_ENUM(NSUInteger, XloggerType) {
debug,
info,
warning,
error,
};
@interface JinkeyMarsBridge: NSObject
- (void)initXlogger: (XloggerType)debugLevel releaseLevel: (XloggerType)releaseLevel path: (NSString*)path prefix: (const char*)prefix;
- (void)deinitXlogger;
- (void)log: (XloggerType) level tag: (const char*)tag content: (NSString*)content;
@end 複製程式碼
appender-swift-bridge.mm
// Created by Jinkey on 2017/1/2.
// Copyright © 2017年 Jinkey. All rights reserved.
// appender-swift-bridge.mm
#import "appender-swift-bridge.h"
#import
#import
#import
@implementation JinkeyMarsBridge
// 封裝了初始化 Xlogger 方法
// initialize Xlogger
-(void)initXlogger: (XloggerType)debugLevel releaseLevel: (XloggerType)releaseLevel path: (NSString*)path prefix: (const char*)prefix{
NSString* logPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingString:path];
// set do not backup for logpath
const char* attrName = "io.jinkey";
u_int8_t attrValue = 1;
setxattr([logPath UTF8String], attrName, &attrValue, sizeof(attrValue), 0, 0);
// init xlog
#if DEBUG
switch (debugLevel) {
case debug:
xlogger_SetLevel(kLevelDebug);
case info:
xlogger_SetLevel(kLevelInfo);
case warning:
xlogger_SetLevel(kLevelWarn);
case error:
xlogger_SetLevel(kLevelError);
default:
break;
}
appender_set_console_log(true);
#else
switch (releaseLevel) {
case debug:
xlogger_SetLevel(kLevelDebug);
case info:
xlogger_SetLevel(kLevelInfo);
case warning:
xlogger_SetLevel(kLevelWarn);
case error:
xlogger_SetLevel(kLevelError);
default:
break;
}
appender_set_console_log(false);
#endif
appender_open(kAppednerAsync, [logPath UTF8String], prefix);
}
// 封裝了關閉 Xlogger 方法
// deinitialize Xlogger
-(void)deinitXlogger {
appender_close();
}
// 利用微信提供的 LogUtil.h 封裝了列印日誌的方法
// print log using LogUtil.h provided by Wechat
-(void) log: (XloggerType) level tag: (const char*)tag content: (NSString*)content{
NSString* levelDescription = @"";
switch (level) {
case debug:
LOG_DEBUG(tag, content);
levelDescription = @"Debug";
break;
case info:
LOG_INFO(tag, content);
levelDescription = @"Info";
break;
case warning:
LOG_WARNING(tag, content);
levelDescription = @"Warn";
break;
case error:
LOG_ERROR(tag, content);
levelDescription = @"Error";
break;
default:
break;
}
#if DEBUG
NSLog(@"[%s][%s]%@%@", levelDescription, tag, content, @">>>該行 log 由於目前Xlogger 在控制檯輸出中文會亂碼而使用 NSlog 輸出的, 不會記錄到 Xlogger 檔案中且在 Release 版本中不會輸出到控制檯");
#endif
}
@end 複製程式碼
Xlogger 目前在 Xcode 的控制檯輸出中文會亂碼,不清楚是 Xcode 還是 Xlogger 的問題,待官方解決吧
補充更新,微信在20170103下午已經修復了中文亂碼的問題,所以示例程式碼中我去掉了:#if DEBUG NSLog(@"[%s][%s]%@%@", levelDescription, tag, content, @">>>該行 log 由於目前Xlogger 在控制檯輸出中文會亂碼而使用 NSlog 輸出的, 不會記錄到 Xlogger 檔案中且在 Release 版本中不會輸出到控制檯"); #endif複製程式碼
Step 6 橋接 Swift 和 Objective-C
新建檔案 <工程名>-Bridging-Header.h,我這裡的示例工程名為XloggerSwiftDemo 所以新建檔案XloggerSwiftDemo-Bridging-Header.h
寫入以下程式碼
#import "appender-swift-bridge.h"複製程式碼
至此,Xlogger 的基本方法已暴露給 Swift 使用了。
Step 7 初始化和反初始化 Xlogger
開啟 AppDelegate.swift
在 didFinishLaunchingWithOptions 方法中加入以下程式碼初始化
var jmb = JinkeyMarsBridge()
jmb.initXlogger(.debug, releaseLevel: .info, path: "/jinkeylog", prefix: "Test")複製程式碼
其中 initXlogger 的第一個引數是開發環境顯示日誌的級別;第二個引數是生產環境顯示日誌的級別;第三個是儲存路徑日誌的級別,我在示例程式碼中封裝了 debug,info,warning,error 四個級別;第四個引數是輸入日誌檔案的字首。
在 applicationWillTerminate 方法中加入以下程式碼反初始化
JinkeyMarsBridge().deinitXlogger()複製程式碼
Step 8 列印日誌
在想要列印日誌的地方寫入以下程式碼
var jmb = JinkeyMarsBridge()
jmb.log(.debug, tag: "JinkeyIO", content: "我的公眾號是 jinkey-love")複製程式碼
這裡為了說明方便而在列印日誌的地方例項化,生產環境使用建議使用單例模式例項化JinkeyMarsBridge
Xcode8 預設會在控制檯列印一大堆日誌,為了演示效果最佳,可以點選 Xcode 選擇Product->Scheme->Edit Scheme
在彈出的視窗中Environment Variables 下新增 0S_ACTIVITY_MODE disable,如下圖
Step 9 分析日誌
通過以下程式碼在控制檯列印出模擬器中示例程式沙盒所在的目錄
var logPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
print(logPath)複製程式碼
通過 MacOS 的 Finder-前往資料夾貼上該路徑開啟
可以看到以下目錄結構
Test.mmap2 是快取檔案,不用關心,我們需要的是 Test_20170103.xlog 檔案,我們把這個檔案使用Mars提供的 Python 指令碼進行解密。指令碼在mars-master/mars/log/crypt/decode_mars_log_file.py
把 decode_mars_log_file.py 和 Test_20170103.xlog 拉到桌面,從 MacOS 的終端使用 cd 命令進入桌面,再輸入命令
python decode_mars_log_file.py Test_20170103.xlog複製程式碼
接著會在桌面生成一個 Test_20170103.xlog.log 檔案,用文字編輯工具開啟即可看到列印的日誌
你覺得這篇文章對您有用嗎?有用的話希望您可以打賞支援我
賣個廣告支援我大學好基友的專案
在 AppStore 搜尋“優讀”,為你私人定製的乾貨閱讀器,一線網際網路公司大神為你過濾優質的文章,可以訂閱各大網站的資訊源。高效過濾和推薦演算法為了提供給個性化閱讀資訊流。當然,你也可以分享好的文章給別人,共享優質文章。
點選下載