最近了解到微信的开源框架
Mars
,感觉挺有意思的于是自己写了个Demo尝试了一下,此贴为记录贴 (传说中的十分钟学会如何使用xLog
)
本文主要使用Kotlin
语言实现,但使用java
的朋友应该也不难看懂,总体的使用是差不多的
啥是XLog
首先简简单单介绍一下XLog
吧,因为我个人也不是特别了解,所以就简简单单说一下,作为微信开源框架Mars
的一部分,XLog
可以实现的就是高性能高压缩地去写日志,避免程序在写日志时发生卡顿等影响性能。
配置依赖
添加相应的依赖,这里使用的是1.2.3
版本而不是1.2.4
,不过总体而言差别并不大,主要就是config
的使用不一样而已
implementation 'com.tencent.mars:mars-xlog:1.2.3'
权限
需要写入权限,可在AndroidManifest
中添加以下
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
so文件加载
务必在初始化代码中加入以下内容(Kotlin自觉把分号去掉)
System.loadLibrary("stlport_shared");
System.loadLibrary("marsxlog");
这里提示一下,如果遇到couldn't find "libstlport_shared.so"
错误,有可能是因为xlog的两个so包是存放在arm64-v8a
和armeabi-v7a
下,部分模拟机因为x86等的兼容问题,会报错而导致错误,一般在gradle的android下添加以下代码可以解决问题,实在解决不了就用真机调试。
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
初始化
初始化,其中System.loadLibrary(xxx)
是加载两个so文件的必需语句,而传入参数中的LEVEL
可以设置成DEBUG
或者ALL
等属性,分别可以让日志中打印出不同的Log
信息
这里需要注意的是cachePath
尽量不要为空,因为如果为空的话容易引发SIGBUS信号的错误。
//1.2.3版本下
System.loadLibrary("c++_shared")
System.loadLibrary("marsxlog")
val SDCARD =
getExternalFilesDir("XLogF").toString()
val logPath = SDCARD+"/Xlog"
// this is necessary, or may crash for SIGBUS
val cachePath = this.getCacheDir().toString() + "/xlog"
if (BuildConfig.DEBUG) {
Xlog.appenderOpen(Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, cachePath, logPath, "MarsSample", 0, "");
Xlog.setConsoleLogOpen(true);
} else {
Xlog.appenderOpen(Xlog.LEVEL_INFO, Xlog.AppednerModeAsync, cachePath, logPath, "MarsSample", 0, "");
Xlog.setConsoleLogOpen(false);
}
Log.setLogImp(Xlog())
关闭XLog
XLog
的使用除了Open
外,当然还需要关闭,这两者不能缺少其中任意一部分,当XLog
关闭后,才会生成对应的日志文件。于日志写入结束的地方添加以下语句
com.tencent.mars.xlog.Log.appenderClose()
此时我们可以到对应的Path
下找到对应的xlog
日志文件,但是目前的日志文件仍不可直接打开,我们需要使用对应的程序对其进行解码生成。
日志生成
此时我们将xlog
拉到本地,接着我们从Mars源码中log/crypt/
下获取decode_mars_nocrypt_log_file.py
文件,把xlog
与其放置于同一文件夹下,在Python版本为2.7.x
的情况下,我们cmd到对应目录,执行以下语句进行日志文件生成
Python decode_mars_nocrypt_log_file.py 文件名.xlog
执行之后会生成一个log
文件,我们可以使用记事本或者其他程序打开并查看日志。
这里需要注意一点是,XLog
只会记录Mars
组件中的Log
,而不会记录系统util
中的Log
,所以如果我们需要在日志中写入Log
,要留意使用的Log
是哪个库的组件
(至于日志内容我就懒得贴了)
总结
也是花了挺长时间在项目中接入这个组件的,总体而言对组件的接入和操作了解更深了,写个文章记录一下之前踩过的坑吧,也能帮帮大家解决一下问题这样子,菜还是很菜,继续加油!