Swift 接入微信 Mars_Xlogger 填坑指南——Jinkey 原创

前端之家收集整理的这篇文章主要介绍了Swift 接入微信 Mars_Xlogger 填坑指南——Jinkey 原创前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文作者 Jinkey(微信公众号 jinkey-love,官网 https://jinkey.ai
原文链接 https://jinkey.ai/post/tech/swift-jie-ru-wei-xin-mars_xlogger-tian-keng-zhi-nan
文章允许非篡改署名转载,删除修改本段版权信息转载的,视为侵犯知识产权,我们保留追求您法律责任的权利,特此声明!

示例代码地址:
https://github.com/Jinkeycode/XloggerSwiftDemo

支持开源,但吐槽一句,作为公司级开源项目,文档有点少哦,希望微信的开发大大能尽快补上。

Step 1 下载代码

使用 git clone 或者直接下载 zip,解压后进入目录 mars-master/mars/libraries,看到有一个 build_apple.py 的文件

Step 2 编译Mars

在终端进入工程目录输入

  1. python build_apple.py

然后回答一系列问题
第一个问题

input prefix for save directory. like trunk,br,tag:
输入保存目录的前缀

第二个问题

Enter menu:

  1. build mars for iphone.

  2. build mars for iphone with bitcode.

  3. build xlog for iphone

  4. build mars for macosx.

  5. build all.

  6. 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.hLogHelper.mmLogUtil.hLogUtil.m 拖入 Xcode 左侧目录结构,弹出的对话框勾选 “Copy items if needed”
为了整洁,对几个文件进行了分组

最终的文件目录和工程目录如下:(忽略 Appender2SwiftBridge), 下文会说到)

Step 5 桥接 Objective-C 和 C++ 代码

新建两个文件(不想写的可以直接下载 Github 下的示例代码拖入工程)
appender-swift-bridge.h

  1. // Created by Jinkey on 2017/1/2.
  2. // Copyright © 2017年 Jinkey. All rights reserved.
  3. // appender-swift-bridge.h
  4.  
  5. #include <stdio.h>
  6. #import <Foundation/Foundation.h>
  7. #import "LogUtil.h"
  8.  
  9. typedef NS_ENUM(NSUInteger,XloggerType) {
  10. debug,info,warning,error,};
  11.  
  12. @interface JinkeyMarsBridge: NSObject
  13.  
  14. - (void)initXlogger: (XloggerType)debugLevel releaseLevel: (XloggerType)releaseLevel path: (NSString*)path prefix: (const char*)prefix;
  15. - (void)deinitXlogger;
  16.  
  17. - (void)log: (XloggerType) level tag: (const char*)tag content: (NSString*)content;
  18.  
  19. @end

appender-swift-bridge.mm

  1. // Created by Jinkey on 2017/1/2.
  2. // Copyright © 2017年 Jinkey. All rights reserved.
  3. // appender-swift-bridge.mm
  4.  
  5. #import "appender-swift-bridge.h"
  6. #import <mars/xlog/appender.h>
  7. #import <mars/xlog/xlogger.h>
  8. #import <sys/xattr.h>
  9.  
  10. @implementation JinkeyMarsBridge
  11.  
  12. // 封装了初始化 Xlogger 方法
  13. // initialize Xlogger
  14. -(void)initXlogger: (XloggerType)debugLevel releaseLevel: (XloggerType)releaseLevel path: (NSString*)path prefix: (const char*)prefix{
  15. NSString* logPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0] stringByAppendingString:path];
  16. // set do not backup for logpath
  17. const char* attrName = "io.jinkey";
  18. u_int8_t attrValue = 1;
  19. setxattr([logPath UTF8String],attrName,&attrValue,sizeof(attrValue),0);
  20. // init xlog
  21. #if DEBUG
  22. switch (debugLevel) {
  23. case debug:
  24. xlogger_SetLevel(kLevelDebug);
  25. case info:
  26. xlogger_SetLevel(kLevelInfo);
  27. case warning:
  28. xlogger_SetLevel(kLevelWarn);
  29. case error:
  30. xlogger_SetLevel(kLevelError);
  31. default:
  32. break;
  33. }
  34. appender_set_console_log(true);
  35. #else
  36. switch (releaseLevel) {
  37. case debug:
  38. xlogger_SetLevel(kLevelDebug);
  39. case info:
  40. xlogger_SetLevel(kLevelInfo);
  41. case warning:
  42. xlogger_SetLevel(kLevelWarn);
  43. case error:
  44. xlogger_SetLevel(kLevelError);
  45. default:
  46. break;
  47. }
  48. appender_set_console_log(false);
  49. #endif
  50. appender_open(kAppednerAsync,[logPath UTF8String],prefix);
  51. }
  52.  
  53. // 封装了关闭 Xlogger 方法
  54. // deinitialize Xlogger
  55. -(void)deinitXlogger {
  56. appender_close();
  57. }
  58.  
  59.  
  60. // 利用微信提供的 LogUtil.h 封装了打印日志的方法
  61. // print log using LogUtil.h provided by Wechat
  62. -(void) log: (XloggerType) level tag: (const char*)tag content: (NSString*)content{
  63. NSString* levelDescription = @"";
  64. switch (level) {
  65. case debug:
  66. LOG_DEBUG(tag,content);
  67. levelDescription = @"Debug";
  68. break;
  69. case info:
  70. LOG_INFO(tag,content);
  71. levelDescription = @"Info";
  72. break;
  73. case warning:
  74. LOG_WARNING(tag,content);
  75. levelDescription = @"Warn";
  76. break;
  77. case error:
  78. LOG_ERROR(tag,content);
  79. levelDescription = @"Error";
  80. break;
  81. default:
  82. break;
  83. }
  84. #if DEBUG
  85. NSLog(@"[%s][%s]%@%@",levelDescription,tag,content,@">>>该行 log 由于目前Xlogger 在控制台输出中文会乱码而使用 NSlog 输出的,不会记录到 Xlogger 文件中且在 Release 版本中不会输出到控制台");
  86. #endif
  87. }
  88.  
  89. @end

Xlogger 目前在 Xcode 的控制台输出中文会乱码,不清楚是 Xcode 还是 Xlogger 的问题,待官方解决
补充更新,微信在20170103下午已经修复了中文乱码的问题,所以示例代码中我去掉了:

  1. #if DEBUG
  2. NSLog(@"[%s][%s]%@%@",不会记录到 Xlogger 文件中且在 Release 版本中不会输出到控制台");
  3. #endif

Step 6 桥接 Swift 和 Objective-C

新建文件 <工程名>-Bridging-Header.h,我这里的示例工程名为XloggerSwiftDemo 所以新建文件XloggerSwiftDemo-Bridging-Header.h
写入以下代码

  1. #import "appender-swift-bridge.h"

至此,Xlogger 的基本方法已暴露给 Swift 使用了。

Step 7 初始化和反初始化 Xlogger

打开 AppDelegate.swift
在 didFinishLaunchingWithOptions 方法中加入以下代码初始化

  1. var jmb = JinkeyMarsBridge()
  2. jmb.initXlogger(.debug,releaseLevel: .info,path: "/jinkeylog",prefix: "Test")

其中 initXlogger 的第一个参数是开发环境显示日志的级别;第二个参数是生产环境显示日志的级别;第三个是储存路径日志的级别,我在示例代码中封装了 debug,info,warning,error 四个级别;第四个参数是输入日志文件的前缀。

在 applicationWillTerminate 方法中加入以下代码反初始化

  1. JinkeyMarsBridge().deinitXlogger()

Step 8 打印日志

在想要打印日志的地方写入以下代码

  1. var jmb = JinkeyMarsBridge()
  2. jmb.log(.debug,tag: "JinkeyIO",content: "我的公众号是 jinkey-love")

这里为了说明方便而在打印日志的地方实例化,生产环境使用建议使用单例模式实例化JinkeyMarsBridge

Xcode8 默认会在控制台打印一大堆日志,为了演示效果最佳,可以点击 Xcode 选择Product->Scheme->Edit Scheme

在弹出的窗口中Environment Variables 下添加 0S_ACTIVITY_MODE disable,如下图

Step 9 分析日志

通过以下代码在控制台打印出模拟器中示例程序沙盒所在的目录

  1. var logPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)[0]
  2. 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 命令进入桌面,再输入命令

  1. python decode_mars_log_file.py Test_20170103.xlog

接着会在桌面生成一个 Test_20170103.xlog.log 文件,用文本编辑工具打开即可看到打印的日志

猜你在找的Swift相关文章