一 为什么要接入日志打印系统?

相信大家在开发应用的时候,总会遇到bug,这个时候,如果bug是在我们本地开发的过程中发现的,那么我们把手机插入android studio进行联调,就可以马上定位到出错的堆栈,报错的信息。但是,在我们的应用发布出去,给用户使用的时候,如果出现了bug,那么,我们就很难定位出问题的所在。一般来说,我们需要使用错误上报系统,把错误上报给我们,比如腾讯的bugly,阿里的友盟等第三方的错误收集插件。但是很多时候,bugly上报的错误并不能正确的把我们需要的错误信息反馈给我们,或者说,我们无法定位在出现了bug的时候,用户之前的操作是什么。在Xlog还没有上线的时候,我们发现一个bug需要怎么做呢?首先,我们需要联系到这个用户,争取获得用户的配合。然后我们就发一个私包给用户,用户安装后,重现刚才的bug,然后我们把操作日志写入本地的错误日志中,让用户通过交流软件发给我们。卧槽,这个步奏,想掀凳子有木有??

二 为什么使用Xlog?

在上面我们的最后一个问题暴露出来后,为什么我们不自己写一个日志系统呢?只是把文本写入本地txt文件中,多么容易的事,一个inputStream OutputStream我们不是很玩的很溜么?何必使用别人的东西??好吧,在回答这个问题的时候,我建议大家先看下这篇文章

如果大家嫌这篇文章太长,那么我可以给大家一个简单的总结,就是:XLog使用流式方式对单行日志进行压缩,压缩加密后写入作为log中间buffer的mmap中。使用xlog方案,除非io损坏或者磁盘没有可用空间,基本可以保证不会丢失任何一行日志。

一个优秀的日志打印系统,需要保证:

1. 不能把用户的隐私信息打印到日志文件里,不能把日志明文打到日志文件里。

2. 不能影响程序的性能。最基本的保证是使用了日志不会导致程序卡顿。

3. 不能因为程序被系统杀掉,或者发生了 crash,crash 捕捉模块没有捕捉到导致部分时间点没有日志, 要保证程序整个生命周期内都有日志。

4. 不能因为部分数据损坏就影响了整个日志文件,应该最小化数据损坏对日志文件的影响。

所以,既然有XLog这种好东西,我们在没有把握自己开发一个更加优秀的xlog打印框架,我们就不要重复造轮子了,哈哈。

三 Xlog接入

step 1: 引入XLog依赖,在我们主工程的build.gradle中加入dependencies {

compile 'com.tencent.mars:mars-xlog:1.0.6'}

step 2:开始初始化Xlog环境private void initXlogEnv(){

System.loadLibrary("stlport_shared");

System.loadLibrary("marsxlog");    final String SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();    final String logPath = SDCARD + "/xlogdemo/log";    final String cachePath = this.getFilesDir() + "/xlogdemo/xlog";    if (BuildConfig.DEBUG) {

Xlog.appenderOpen(Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, cachePath, logPath, "", "");

Xlog.setConsoleLogOpen(true);

} else {

Xlog.appenderOpen(Xlog.LEVEL_INFO, Xlog.AppednerModeAsync, cachePath, logPath, "MarsSample", "");

Xlog.setConsoleLogOpen(false);

}

}

四:开始踩坑之旅

ok到了这里,按照Xlog官方给的接入步奏,我们这个时候应该就可以在我们的sdcard根目录上看到logFile.log文件了。ok,我们开开心心的来run一下看看

couldn't find "libstlport_shared.so"

卧槽,官方文档又来搞事情了

踩坑1:couldn't find "libstlport_shared.so

为什么会出现这个bug?在接入Xlog到我们的项目中时,我建了一个demo,跑出来是不会报错的,但是一旦接入到我们工程中,就抛了这个错。在仔细看了官方文档后,知道了,原来xlog因为考虑依赖包的大小,只提供了armeabi和x86_64两种cpu架构。

xlog官方文档

而我们的工程中,又是只支持armeabi-v7a架构。所以这个时候需要怎么办呢?

解决方法:这个时候,我们只需要先使用armeabi编译打包,然后把生成的libstlport_shared.so和libmasxlog.so拷贝到我们的工程中,放在对应log的module中即可,像这样

xlog手动加载so

踩坑2:没有对应的sdcard没有生成目录文件

如果遇到问题,需要检查一下是否在manifest中有申请sdcard写入权限。还有在android6.0以上系统,有没有动态去申请存储权限。

踩坑3:同一个进程中,xlog不可以使用日志打印文件。

踩这个坑的原因是因为我们在日志上报系统中,会需要重点记录部分用户行为,而这部分日志上报行为是需要上报给服务端的。所以为了尽量减少日志包的大小,同时让为了使重要的日志和其它日志相隔开,我们想把这部分抽离出来一个文件,方便服务端分析和管理。但经过尝试后,这个行为xlog是不允许的,首先xlog会抛错,错误信息是当前的日志文件已经被打开。

分析:其实这种一个进程只能写入一个文件是可以理解的,因为如果一个进程多文件的话,xlog需要频繁的去控制文件流的输出和关闭,这样会导致性能问题,也可能会造成日志丢失。

踩坑4:多进程xlog日志打印

xlog是支持多进程打印的,但是多进程打印需要制定每一个进程对应一个文件。在这里,我建议使用进程的名字作为一个文件夹,然后再放入对应的日志文件。这样便于我们以后日志的管理。当我们开启更多进程的时候,也会自动生成,不用去一一匹配。

作者:gdutkyle

链接:https://www.jianshu.com/p/a5084a1d28dc

android xlog崩溃日志,腾讯Xlog接入指南与踩过的坑相关推荐

  1. Android 异常崩溃日志,捕捉并保存到本地

    Android 异常崩溃日志,捕捉并保存到本地: 前几天因为在省公安厅做一个通讯类之类的应用:碰到个问题,就是download人员信息将信息保存到本地数据库完成的时候,菊花转还没有dismission ...

  2. Android捕捉崩溃日志并输出日志文件

    Android捕捉崩溃日志并输出日志文件 当程序与运行时发生崩溃,可以捕捉到当前崩溃的日志信息并写入文件保存到指定的目录下.这里还做了最大文件数量限制,超过数量即删除旧日志文件. import jav ...

  3. Android 应用崩溃日志的收集和上传

    如何将应用崩溃日志收集起来? Android 应用难以避免的会 crash ,也称为崩溃,无论你的程序多完美,总是无法避免 crash 的发生.这对用户来说是很不友好的,也是开发者所不愿意看到的.更糟 ...

  4. android xlog崩溃日志,Android第三方log库:xlog使用记录

    第一步:由于xlog发布在jitpack 仓库,所以如果android studio没有在project目下的的build.gradle下配置jitpack仓库的话需要配置下 allprojects ...

  5. android查找邮件程序,Android 程序崩溃日志邮件获取

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在我们开发Android应用程序的时候,BUG的出现是难以避免的,时不时还会出现崩溃的情况,这个时候,我们急需知道造成问题的原因是什么,但是,在没 ...

  6. android 记录崩溃日志

    2019独角兽企业重金招聘Python工程师标准>>> 每个android应用都是由一个Application和多个activity或者server构成.应用启动时,会首先启动App ...

  7. Android 保存崩溃日志到本地目录下

    代码如下可以直接复制过去,别人的代码修改了下 package com.hly.rtxt; import android.annotation.SuppressLint; import android. ...

  8. Android手机崩溃日志查看

    1.通过adb连接手机 2.输入adb logcat -v time >d:/log.txt,抓取log 3.打开log,如果是ANR,就搜索[anr],如果是crash就搜索[fatal]

  9. Android设备标准HID协议(外接输入设备)接入蓝牙扫描枪的各种坑与解决办法

    因工作需要最近在做一款蓝牙条码.二维码扫描器枪支持Android设备(执行标准HID协议)的外接输入设备,在开发过程中遇到一些问题,在此记录下来,以便供大家借鉴学习,希望有类似需求的同行少走些弯路.好 ...

最新文章

  1. vigra1.8.0的使用
  2. python连接mongo_Python连接MongoDB操作
  3. 关于MultipleOutputFormat若干小记
  4. 在discuzNT中加入Adsense广告(只在第一楼显示)
  5. input标签的值只能两位小数_Day51 HTML表格表单标签、flask框架
  6. ckedit 3.0 配置(一)
  7. python opencv报错_OpenCV in Python 入门问题,python报错 -问答-阿里云开发者社区-阿里云...
  8. 看了三张照片,这个AI只用20分钟破获六年“悬案”
  9. Java连接Elasticsearch6.xxx 高级检索篇三
  10. MapReduce三种join实例分析
  11. 中国急性髓系白血病药物市场趋势报告、技术动态创新及市场预测
  12. 用Netfilter模块实现基于令牌桶的每IP地址流量控制
  13. MyBatis 安装下载 及入门案例
  14. Gh0st3.6编译和源码免杀问题
  15. 2021年前端部署的灵魂拷问
  16. 2021年质量员-设备方向-通用基础(质量员)考试总结及质量员-设备方向-通用基础(质量员)模拟考试题库
  17. 基于语音控制的智能家居实现
  18. 可自动调节OpenCV弹出窗口大小
  19. 新买的电脑没有免费的office怎么弄?
  20. 如何在Windows上创建,解压,更新.tar.gz压缩包

热门文章

  1. 用c#做的打地鼠小游戏,整理一下上课学的
  2. 如何甄选出一个优秀的软件供应商?by彭文华
  3. 每周全球科技十大新闻(2021.6.21-6.27)
  4. 使用ssh关联github
  5. 1000句英语经典口语(9)
  6. 天池比赛——docker初步尝试
  7. 企业邮箱适用于哪些行业?公司邮箱都用什么?
  8. 新手刚学js遇到的ie6问题
  9. Python Matplotlib设置x轴与y轴相交于心仪的坐标点
  10. 我用Python爬取美食网站3032个菜谱并分析,没有我不会做的菜!