轉載請註明出處
微信公衆號 jinkey-love
簡書 JinkeyBlog
Github Jinkeycode
示例代碼地址:
github.com/Jinkeycode/…python
使用 git clone 或者直接下載 zip,解壓後進入目錄 mars-master/mars/libraries,看到有一個 build_apple.py 的文件
git
在終端進入工程目錄輸入github
python build_apple.py複製代碼
而後回答一系列問題
第一個問題objective-c
input prefix for save directory. like
trunk
,br
,tag
:
輸入保存目錄的前綴算法
第二個問題shell
Enter menu:macos
- build mars for iphone.
- build mars for iphone with bitcode.
- build xlog for iphone
- build mars for macosx.
- build all.
- exit.
選擇 3 回車,報錯:swift
xcodebuild: error: Unknown build action 'Center/marsmaster/mars/libraries/../marslogiphone.xcodeproj'.
!!!!clean iphoneos10.0 failed!!!xcode
看看控制檯打印的記錄發現路徑和我目錄的路徑不一致:緩存
Download\ Center/mars-master/mars/mars-log-iphone.xcodeproj
對比以後發現一個大坑:build_apple.py 的路徑不能有空格!!!
編譯成功以後生成一個以你自定義前綴的目錄,裏面就有 framwork:
將 mars.framework 拖入 Linked Frameworks and Libraries 而且加入其餘四個系統庫,弄好以後以下:
20170102 早上的 mars.framework 漏了一個斜槓,會致使沒法編譯,20170102 下午官方已修復,請確保你把版本更新到你看這篇文章時候的最新版本。
將編譯獲得的 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), 下文會說到)
新建兩個文件(不想寫的能夠直接下載 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複製代碼
新建文件 <工程名>-Bridging-Header.h,我這裏的示例工程名爲XloggerSwiftDemo 因此新建文件XloggerSwiftDemo-Bridging-Header.h
寫入如下代碼
#import "appender-swift-bridge.h"複製代碼
至此,Xlogger 的基本方法已暴露給 Swift 使用了。
打開 AppDelegate.swift
在 didFinishLaunchingWithOptions 方法中加入如下代碼初始化
var jmb = JinkeyMarsBridge()
jmb.initXlogger(.debug, releaseLevel: .info, path: "/jinkeylog", prefix: "Test")複製代碼
其中 initXlogger 的第一個參數是開發環境顯示日誌的級別;第二個參數是生產環境顯示日誌的級別;第三個是儲存路徑日誌的級別,我在示例代碼中封裝了 debug,info,warning,error 四個級別;第四個參數是輸入日誌文件的前綴。
在 applicationWillTerminate 方法中加入如下代碼反初始化
JinkeyMarsBridge().deinitXlogger()複製代碼
在想要打印日誌的地方寫入如下代碼
var jmb = JinkeyMarsBridge()
jmb.log(.debug, tag: "JinkeyIO", content: "個人公衆號是 jinkey-love")複製代碼
這裏爲了說明方便而在打印日誌的地方實例化,生產環境使用建議使用單例模式實例化JinkeyMarsBridge
Xcode8 默認會在控制檯打印一大堆日誌,爲了演示效果最佳,能夠點擊 Xcode 選擇Product->Scheme->Edit Scheme
經過如下代碼在控制檯打印出模擬器中示例程序沙盒所在的目錄
var logPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
print(logPath)複製代碼
經過 MacOS 的 Finder-前往文件夾粘貼該路徑打開
python decode_mars_log_file.py Test_20170103.xlog複製代碼
接着會在桌面生成一個 Test_20170103.xlog.log 文件,用文本編輯工具打開便可看到打印的日誌
你以爲這篇文章對您有用嗎?有用的話但願您能夠打賞支持我
在 AppStore 搜索「優讀」,爲你私人定製的乾貨閱讀器,一線互聯網公司大神爲你過濾優質的文章,能夠訂閱各大網站的信息源。高效過濾和推薦算法爲了提供給個性化閱讀信息流。固然,你也能夠分享好的文章給別人,共享優質文章。
點擊下載