转载请注明出处
微信公众号 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 搜索“优读”,为你私人定制的干货阅读器,一线互联网公司大神为你过滤优质的文章,能够订阅各大网站的信息源。高效过滤和推荐算法为了提供给个性化阅读信息流。固然,你也能够分享好的文章给别人,共享优质文章。
点击下载