关于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。
查看
- 使用 adb 命令导出 xlog 文件到桌面
adb pull /storage/emulated/0/Android/data/com.package.xxx/files/xlog C:\Users\admin\Desktop\
- 将 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);