腾讯 Xlog 上手指南

关于Xlog

https://github.com/Tencent/mars

访问 mars 仓库,将代码压缩包下载到本地.下载的过程中可以初步了解 mars 是何方神圣 : https://github.com/Tencent/mars/wiki

以及 Xlog 的性能和基准 : https://github.com/Tencent/mars/wiki/Xlog-Benchmark


下载及编译

打开下载完毕的 mars-master 文件,打开 mars-master\mars\libraries ,双击执行 build_android.py 脚本

Enter menu:

根据提示命令窗口输入选项 3 ,选择编译xlog

  • 3.build xlog shared lib with crypt

Enter the architecture which would like to build:

选择应用使用的cpu架构

  • 1.armeabi

编译成功后会再 mars-master\mars\libraries\mars_xlog_sdk\libs 目录下生成对应的 so 文件夹.



使用

so 建议以文件形式直接导入到项目中,当然也可以使用依赖方式。
(不过只含armeabi-v7,项目可能会导致 couldn’t find "libstlport_shared.so ,没有对应的 so 架构)

dependencies {
    compile 'com.tencent.mars:mars-xlog:1.0.7'
}

初始化

推荐在 程序启动时加载 xlog:

System.loadLibrary("c++_shared");
System.loadLibrary("marsxlog");

在程序启动加载 xlog 后紧接着初始化 xlog:

final String SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
final String logPath = SDCARD + "/marssample/log";

// this is necessary, or may cash for SIGBUS
final String cachePath = this.getFilesDir() + "/xlog"

//init xlog
if (BuildConfig.DEBUG) {
    Xlog.appenderOpen(Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, cachePath, logPath, "MarsSample", PUB_KEY);
    Xlog.setConsoleLogOpen(true);

} else {
    Xlog.appenderOpen(Xlog.LEVEL_INFO, Xlog.AppednerModeAsync, cachePath, logPath, "MarsSample", PUB_KEY);
    Xlog.setConsoleLogOpen(false);
}

Log.setLogImp(new Xlog());

在 程序退出时反初始化:

Log.appenderClose();

使用方式 :

import com.tencent.mars.xlog.Log;

    Log.e(tag, msg);

混淆

-keep class com.tencent.mars.** {
  public protected private *;
}

需要注意:

  • 如果你的程序使用了多进程,不要把多个进程的日志输出到同一个文件中,保证每个进程独享一个日志文件。
  • 保存 log 的目录请使用单独的目录,不要存放任何其他文件防止被 xlog 自动清理功能误删。
  • debug 版本下建议把控制台日志打开,日志级别设为 Verbose 或者 Debug, release 版本建议把控制台日志关闭,日志级别使用 Info.
  • cachePath这个参数必传,而且要data下的私有文件目录,例如 /data/data/packagename/files/xlog, mmap文件会放在这个目录,如果传空串,可能会发生 SIGBUS 的crash。


查看

  1. 使用 adb 命令导出 xlog 文件到桌面

adb pull /storage/emulated/0/Android/data/com.package.xxx/files/xlog C:\Users\admin\Desktop\

  1. mars-master\mars\log\crypt 文件夹下的 decode_mars_nocrypt_log_file.py 文件拷贝到桌面的 xlog 文件夹中, 如果涉及到加密,拷贝 decode_mars_crypt_log_file.py 文件。执行脚本即可查看日志文件

https://github.com/Tencent/mars/wiki/Xlog-加密使用指引



DIY

每次启动时会删除过期文件,只保留十天内的日志文件(该值定义在appender.cc中的 kMaxLogAliveTime ),所以给 Xlog 的目录请使用单独目录,防止误删其他文件。目前不会根据文件大小进行清理。如若想自定义清理逻辑请自行更改appender.cc中的 __del_timeout_file 函数.

mars-master\mars\log\src\appender.cc

__del_timeout_file()修改文件自动删除逻辑


appender_open()方法中可以修改输入的 xlog 文件额外打印的日志,注释掉额外日志打印信息。

// xlog 额外日志打印信息

del time out files time: 0
get mmap time: 1
MARS_URL: 
MARS_PATH: 
MARS_REVISION: 
MARS_BUILD_TIME: 2018-01-19 16:21:36
MARS_BUILD_JOB: default
    if (buffer.Ptr()) {
        //__writetips2file("~~~~~ begin of mmap ~~~~~\n");
        __log2file(buffer.Ptr(), buffer.Length());
        //__writetips2file("~~~~~ end of mmap ~~~~~%s\n", mark_info);
    }

    tickcountdiff_t get_mmap_time = tickcount_t().gettickcount() - tick;


    char appender_info[728] = {0};
    snprintf(appender_info, sizeof(appender_info), "^^^^^^^^^^" __DATE__ "^^^" __TIME__ "^^^^^^^^^^%s", mark_info);

    //xlogger_appender(NULL, appender_info);
    char logmsg[64] = {0};
    snprintf(logmsg, sizeof(logmsg), "del time out files time: %" PRIu64, (int64_t)del_timeout_file_time);
    //xlogger_appender(NULL, logmsg);

    snprintf(logmsg, sizeof(logmsg), "get mmap time: %" PRIu64, (int64_t)get_mmap_time);
    //xlogger_appender(NULL, logmsg);

    //xlogger_appender(NULL, "MARS_URLssssss: " MARS_URL);
    //xlogger_appender(NULL, "MARS_PATH: " MARS_PATH);
    //xlogger_appender(NULL, "MARS_REVISION: " MARS_REVISION);
    //xlogger_appender(NULL, "MARS_BUILD_TIME: " MARS_BUILD_TIME);
    //xlogger_appender(NULL, "MARS_BUILD_JOB: " MARS_TAG);

    snprintf(logmsg, sizeof(logmsg), "log appender mode:%d, use mmap:%d", (int)_mode, use_mmap);
    //xlogger_appender(NULL, logmsg);

	BOOT_RUN_EXIT(appender_close);


// xlog 调用额外信息

[I][2018-02-20 +8.0 12:00:00.001][12345, 1*][com.example.MainActivity][, , 0][number 100

打开 mars-master\mars\log\jniJava2C_Xlog.cc 文件,修改 DEFINE_FIND_STATIC_METHOD()方法

将
xlogger_Write(&xlog_info, NULL == log_cstr ? "NULL == log" : log_cstr);

改为 
xlogger_Write(NULL,log_cstr);

猜你喜欢

转载自blog.csdn.net/qian520ao/article/details/88047573