Android 微信高性能日志存储库Xlog的使用

XLog是什么

腾讯开源的Mars项目中有个XLOG日志库。

XLog是一个高性能文本存储方案,在真实环境中经受了微信数亿级别的考验,具有很好的稳定性。
由于其是使用C语言来实现的,故有占用性能、内存小,存储速度快等优点,
支持多线程,甚至多进程的使用,支持定期删除日志,
同时,拥有特定算法,进行了文件的压缩,甚至可以配置文件加密。

如何使用

1.依赖XLOG

implementation "com.tencent.mars:mars-xlog:1.2.3"

2.依赖so库

新建jniLibs文件夹,将demo项目中的so复制到该文件夹

在这里插入图片描述
然后,在gradle中配置abiFilters
在这里插入图片描述

3.添加权限

在Manifest中添加存储权限

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

然后,在MainActivity中申请权限

ActivityCompat.requestPermissions(this,new String[]{
    
    Manifest.permission.WRITE_EXTERNAL_STORAGE},123);

初始化XLog

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

val logDir = getExternalFilesDir("xlog")
val cacheLogDir = File(logDir, "cache")
Xlog.setConsoleLogOpen(true); //是否把日志打印到控制台
Xlog.appenderOpen(
    Xlog.LEVEL_ALL,
    Xlog.AppednerModeAsync,
    cacheLogDir?.path,
    logDir?.path,
    "XLOG",
    10,
    ""
)
com.tencent.mars.xlog.Log.setLogImp(Xlog())

其中 需要注意

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

打印日志

TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setOnClickListener(new View.OnClickListener() {
    
    
    @Override
    public void onClick(View v) {
    
    
        Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_SHORT).show();
        com.tencent.mars.xlog.Log.i("z-test","hello world!");
    }
});

然后,可以在合适的时机,进行日志的Flush

com.tencent.mars.xlog.Log.appenderFlush(true);

反初始化

在 程序退出时反初始化,比如可以放在MainActivity的onDestory方法内

com.tencent.mars.xlog.Log.appenderClose();

运行程序

然后,我们就可以运行程序,打印日志了。
可以看到,在指定的日志目录,有一个.xlog文件

解码xlog文件

首先,我们要在电脑上安装Python,当前版本需要2.7.12。

然后,我们在源码中的 decode_mars_nocrypt_log_file.py 复制到xlog同一个文件夹下。

运行CMD,进入改文件夹下,执行Python decode_mars_nocrypt_log_file.py 文件名.xlog进行解码,

可以看到,该文件夹下,生成了.xlog.log文件,用记事本即可打开查看日志了。

遇到的问题

No module named zstandard

执行命令的时候,报No module named zstandard错误

Traceback (most recent call last):
  File "decode_mars_nocrypt_log_file.py", line 10, in <module>
    import zstandard as zstd
ImportError: No module named zstandard

这个错误在Github上找到了解决方案 https://github.com/Tencent/mars/issues/903

具体操作就是在Pip官网上下载pip,解压后使用CMD执行如下命令

pip install pip==20.3.4

这里pip版本用的20.3.4,对应于python2.7.18.

然后再执行pip install zstandard,可以看到安装成功

在这里插入图片描述
然后就可以正常执行Python decode_mars_nocrypt_log_file.py 文件名.xlog进行解码了

No module named pyelliptic

如果是使用 Python decode_mars_crypt_log_file.py 文件名.xlog进行解码的话,可以能报No module named pyelliptic的错误,同样,我们需要使用pip来安装pyelliptic

需要注意的是,需要安装1.5.10版本的pyplliptic,不能安装最新版本的,否则会报下面这个错误

Traceback (most recent call last):
  File "decode_mars_crypt_log_file.py", line 9, in <module>
    import pyelliptic
  File "C:\Developer\Python2.7.18\lib\site-packages\pyelliptic\__init__.py", line 43, in <module>
    from .openssl import OpenSSL
  File "C:\Developer\Python2.7.18\lib\site-packages\pyelliptic\openssl.py", line 309, in <module>
    raise Exception("Couldn't load OpenSSL lib ...")
Exception: Couldn't load OpenSSL lib ...

执行如下代码进行安装 (github需要能够正常访问)

pip install https://github.com/mfranciszkiewicz/pyelliptic/archive/1.5.10.tar.gz#egg=pyelliptic

在这里插入图片描述
安装成功后,再执行Python decode_mars_crypt_log_file.py 文件名.xlog就能正常解码了
在这里插入图片描述

进阶

这些是XLog基础的时候,如果想要自定义日志格式,想要对源码做一些修改,那么需要修改后,进行编译,使用生成的so依赖到项目中,具体详见
Android Mars XLog的编译
Android Mars XLog 自定义存储格式

Android Mars XLog Demo示例代码详见 https://download.csdn.net/download/EthanCo/12168054

其他

官方文档
GitHub
Mars Android 接入指南

猜你喜欢

转载自blog.csdn.net/EthanCo/article/details/104374108#comments_28497295