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

image

本文作者 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

在终端进入工程目录输入

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

//  Created by Jinkey on 2017/1/2.
//  Copyright © 2017年 Jinkey. All rights reserved.
//  appender-swift-bridge.h

#include <stdio.h>
#import <Foundation/Foundation.h>
#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 <mars/xlog/appender.h>
#import <mars/xlog/xlogger.h>
#import <sys/xattr.h>

@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 文件,用文本编辑工具打开即可看到打印的日志

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,612评论 4 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,568评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 新秋匆匆,节同时异,已是物是人非。总是有些东西留在记忆里成为一角心境…… 一个村庄,一条老街,一...
    沂荷芝兰阅读 162评论 0 0
  • 筱久阅读 422评论 4 7