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

String logPath = Environment.getExternalStorageDirectory().getPath() + "/123logsample/xlog";
String cachePath = Environment.getExternalStorageDirectory().getPath() + "/123logsample/xlog/cache";
Log.d("XLOG", logPath);
Xlog.setConsoleLogOpen(true); //是否把日志打印到控制台
Xlog.appenderOpen(Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, cachePath, logPath, "LOGSAMPLE", 10, "");
com.tencent.mars.xlog.Log.setLogImp(new 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() {@Overridepublic 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 pyellipticFile "C:\Developer\Python2.7.18\lib\site-packages\pyelliptic\__init__.py", line 43, in <module>from .openssl import OpenSSLFile "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 接入指南

Android 微信高性能日志存储库Xlog的使用相关推荐

  1. Android高性能日志模块-Xlog 正篇

    Android高性能日志模块-Xlog 前言 日志可以帮助我们定位问题,记录当前程序的运行状态.与后端开发不同的是,Android中的Log原生支持的仅是本地调试和信息记录,并不能很方便地定位远程问题 ...

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

    学习网站:微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog 其中涉及知识: 垃圾回收机制 垃圾回收(garbage collection,简称GC)可以自动清空堆中不再使用的对象. ...

  3. 微信 日志服务器 并发大,微信高性能线上日志系统xlog剖析

    微信高性能线上日志系统xlog剖析 做移动开发的同学经常会遇到一个头疼的问题,就是当用户反馈一些问题,又比较冷僻难以复现的时候(不是Crash),常常就会陷入一筹莫展的境地.因此,很多人就研发了相关的 ...

  4. android根目录无权访问,关于android:已注册为Git根目录,但未在其中找到任何Git存储库...

    在Android Studio中,当我从链接导入项目下载时 我得到的错误 "Invalide VCS root mapping" The directory C:\Users\us ...

  5. 解密android日志xlog,安卓开发技巧2:自定义日志工具类XLog的实现

    安卓开发技巧二:自定义日志工具类XLog的实现 我们在开发过程中,打印日志是必不可少的一个调试环节,然而,直接使用系统自带的Log日志类,并不能满足我们实际项目的需求:假如我们现在在开发一款比较大的项 ...

  6. DLedger —基于 raft 协议的 commitlog 存储库

    尊敬的阿里云用户: 您好!为方便您试用开源 RocketMQ 客户端访问阿里云MQ,我们申请了专门的优惠券,优惠券可以直接抵扣金额.请填写下您公司账号信息,点击上图,了解更多哦. 一.DLedger引 ...

  7. 注意!今日起 GitHub 新建存储库的默认分支就不叫“master”了!

    整理 | 郑丽媛 头图 | CSDN下载自东方IC GitHub 宣布,自2020年10月1日起,在 GitHub 平台上创建的所有源代码存储库都将默认命名为 main ,而非原本的 master . ...

  8. 尝试远程添加Git存储库时收到“致命错误:不是git存储库”

    我通过遵循本教程向自己介绍Git: 让jekyll在Nearlyfreespeech.net上运行 一切正常,直到将回购添加到本地计算机的部分为止: git remote add nfsn ssh:/ ...

  9. Subversion存储库中“分支”,“标记”和“主干”的含义是什么?

    我已经在Subversion(我猜通用存储库)讨论中看到了很多这样的话. 在过去的几年里,我一直在为我的项目使用SVN,但我从未掌握过这些目录的完整概念. 他们的意思是什么? #1楼 现在这就是软件开 ...

  10. 将子目录分离(移动)到单独的Git存储库中

    我有一个Git存储库,其中包含许多子目录. 现在,我发现一个子目录与另一个子目录无关,应该将其分离到单独的存储库中. 如何在保留子目录中文件历史记录的同时执行此操作? 我想我可以制作一个克隆并删除每个 ...

最新文章

  1. 泛架构之于外包IT工程
  2. 从frame跳转到一个新的页面
  3. java spring框架 注解_spring框架之注解的使用
  4. 【EOJ Monthly 2019.01 - E】唐纳德先生与假骰子(假概率问题)
  5. String类以及String与基本数据类型/char[]/byte[]之间的转换
  6. 解读2015之大数据篇:大数据的黄金时代
  7. 对抗生成网络(Generative Adversarial Net)
  8. 《大数据之路:阿里巴巴大数据实践》-第1章 总述
  9. BaiduPan百度网盘不限速教程
  10. 高中信息技术python及答案_(完整)高中信息技术《Python语言》模块试卷
  11. vue引入 wps在线编辑版
  12. 信息收集之通过JS拓展信息面
  13. 康奈尔大学对博士生的要求
  14. matlab电解电容在哪,基于MATLAB的电容器直流局部放电检测.pdf
  15. 生鲜电商运营框架的对比和分析
  16. ffmpeg缩放视频尺寸
  17. cdn有几种加速方式
  18. 记录一下使用nodejs爬取双色球历史开奖数据并写入文件过程,仅自己做着玩玩
  19. 【Linux运维-集群技术进阶】集群/分布式环境下5种session处理策略
  20. 免费合同管理软件有哪个好用?有哪些功能?

热门文章

  1. 0x00007FF73361E515 处(位于 基于多态的职工管理系统.exe 中)引发的异常: 0xC0000005: 职工岗位输入不是1,2,3,而是其他乱七八糟的
  2. matlab 无刷电机,无刷直流电机MATLAB仿真模型
  3. wps批量删除sheet 批量删除工作簿
  4. WPS Word添加或删除页面上/下方的横线
  5. 万能获取随机数公式 取1-100的随机数
  6. 【JAVA高级技术】Java 处理结构化数据多种解决方案
  7. python123随机密码生成器_python密码生成器的3种方法
  8. Python相关分析—一个金融场景的案例实操
  9. [转载]使用 JDBC 连接不同版本 DB2 数据库的兼容性问题
  10. 2020年阴历二月二十六 投资理财~读万科财报有感