码农的世界程序员工程架构

Mars-日志模块xlog for iOS

2018-05-10  本文已影响20人  Jonrencxr

一、业务背景

用户使用客户端应用过程中,会遇到各种bug, 包括奔溃、数据显示错误、交互出现问题等等,虽然APP已经接入腾讯bugly和友盟统计,但是依然无法解决部分实际问题。
因此引入了日志的概念,为了准确的获取APP使用过程中的日志,目前采用更加成熟的组件:腾讯Mars。

二、Mars介绍

Mars 是微信官方的跨平台跨业务的终端基础组件,基于C++语言开发,可支持Android、iOS、Mac、Windows 平台。

四大模块
xlog三大特性

三、Mars-iOS接入项目

1. 编译

项目在接入mars.framework之前需要先编译,在下载下来的mars文件夹下找到/mars/libraries/build_apple.py,执行

python build_apple.py

之后会生成对应的引入文件,包括mars.framework。

2. 添加相应文件和库到项目中,具体参考下图:
apple_linker.png

其中红色部分为 mars 提供的部分(可根据业务情况引入相应文件,如只使用xlog模块的话只引用log_crypt.h和log_crypt.cc即可),黄色部分是使用 mars 需要的系统库,绿色部分为需要开发者自行实现的 callback 部分。

四、xlog使用方法

1. 初始化和反初始化

需要在main.mm文件初始化
    NSString *logPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingString:@"/log"];    
    NSLog(@"logPath: %@", logPath);
    //不备份日志路径
    const char* attrName = "com.apple.MobileBackup";
    u_int8_t attrValue = 1;
    setxattr([logPath UTF8String], attrName, &attrValue, sizeof(attrValue), 0, 0);

#if DEBUG
    xlogger_SetLevel(kLevelDebug);
    appender_set_console_log(true);
#else
    xlogger_SetLevel(kLevelInfo);
    appender_set_console_log(false);
#endif
    /*
     * 设置日志目录、日志文件前缀
     * 特别强调一点pubkey,设置后才会对日志进行加密,若Debug模式下不希望加密,可以设置空"",pubkey在decode_mars_crypt_log_file.py脚本中。
     */
    appender_open(kAppednerAsync, [logPath UTF8String], "fileNameprefix", "pubkey"); 
需要在APP终止方法applicationWillTerminate中反初始化

appender_close();

2. 打印日志

LOG_DEBUG(@"模块名称", @"日志描述:%@", 需要打印的具体信息); //开发模式
LOG_INFO(@"模块名称", @"日志描述:%@", 需要打印的具体信息); //发布模式

以上方法为打印日志的接口方法宏定义,具体实现如下:

+ (void)logWithLevel:(TLogLevel)logLevel moduleName:(const char*)moduleName fileName:(const char*)fileName lineNumber:(int)lineNumber funcName:(const char*)funcName message:(NSString *)message {
  XLoggerInfo info;
  info.level = logLevel;
  info.tag = moduleName;
  info.filename = fileName;
  info.func_name = funcName;
  info.line = lineNumber;
  gettimeofday(&info.timeval, NULL);
  info.tid = (uintptr_t)[NSThread currentThread];
  info.maintid = (uintptr_t)[NSThread mainThread];
  info.pid = g_processID;
  xlogger_Write(&info, message.UTF8String);
}

3. 获取日志并上传到服务器

4. 解压解密日志文件

  • 解压未加密文件:decode_mars_nocrypt_log_file.py
  • 解压加密文件:decode_mars_crypt_log_file.py

五、注意事项

参考:

Mars官方GitHub地址

微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog

上一篇 下一篇

猜你喜欢

热点阅读