当前位置: 首页 > news >正文

如何设计一个Android端高性能日志监控系统

开发中客户端经常遇到一些线上问题, 无法复现, 但是又的的确确存在; 当线上反馈的时候无从下手; 主要是因为并不知道用户所处的环境,以及所做的操作顺序或者程序运行的顺序; 在排查问题和复现问题上占用了很大的成本; 如果debug时的log日志如果线上也能查看就好了; 基于此, 我们设计了一个客户端日志系统,这为我们发现和解决问题提供了很大的保障;

首先, 一个合格的日志系统需要满足的条件:

  • 触发上传日志的可靠性和便利性, 保证触发后可在最短时间内保证上传成功,并下载到日志文件;
  • 客户端本地高性能记录日志,不可影响app正常运行;
  • 日志支持大量数据, 满足10M文本数据记录和查看;
  • 注重用户隐私,日志专门解压解密才可查看; 不收集用户个人隐私相关,只用于排查应用问题;

1. 后端拉取方案:

步骤描述:

1. 当需要上传某人的日志时,后端触发, 将用户的状态标记为需上传状态;

2. 当用户在线或再次上线时, 通过查询接口得知自己需要上传, 则执行本地上传操作;若接口未返回true,则无需任何操作;

3. 上传成功后, 后端将该用户标记为无需上传状态, 用户下次查询时无需任何操作;

上述方案可保证触发后用户可在最短时间内上传, 测试客户端轮训的间隔为3min

2. 客户端本地日志记录方案:

目前开源的方案有:

  • 腾讯mars XLog组件 https://github.com/Tencent/mars
  • 美团Logan https://github.com/Meituan-Dianping/Logan

XLog 只实现日志写入操作,后续上传,解密需自己定制;

Logan 包含客户端与服务端,写入,上传,解密等一套服务, 解密查看不支持客户端查看,只能自己部署Logan后台查看;

为保证灵活性,暂时两个都进行接入,并用一套接口封装; Logan需搭建前后端,并不支持自己解析日志,为先验证可行性,目前只使用XLog;

XLog优点:

  • mars 的日志模块 xlog 可以做到:高性能高压缩率、不丢失任何一行日志、避免系统卡顿和 CPU 波峰。

官方benchmark测试: https://github.com/Tencent/mars/wiki/Xlog-Benchmark

本地测试无间隔无限循环写入情况下, 测试内存表现,未有明显异常;

Xlog接入:

也可以直接参考下文章: 开源系列 | 基于微信XLog的日志框架&&对于XLog的分析 - 掘金

引入依赖

dependencies {compile 'com.tencent.mars:mars-xlog:1.2.5'
}

初始化:

System.loadLibrary("c++_shared");
System.loadLibrary("marsxlog");final String SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
final String logPath = SDCARD + "/marssample/log";// this is necessary, or may crash for SIGBUS
final String cachePath = this.getFilesDir() + "/xlog"//init xlog
Xlog xlog = new Xlog();
Log.setLogImp(xlog);if (BuildConfig.DEBUG) {Log.setConsoleLogOpen(true);Log.appenderOpen(Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, "", logPath, logFileName, 0);
} else {Log.setConsoleLogOpen(false);Log.appenderOpen(Xlog.LEVEL_INFO, Xlog.AppednerModeAsync, "", logPath, logFileName, 0);
}

退出程序时关闭:

Log.appenderClose();​​​​​​​ 

1. 需要注意的是, 默认使用的异步写入文件, 需要上传的时候需要同步一下内存到文件中; 调用appenderFlush(true), 不然最近记录的日志可能未同步到文件中;

2. 一些其他配置, 比如log写入目录,缓存目录等, 参考https://github.com/Tencent/mars/wiki/Mars-Android-%E6%8E%A5%E5%8F%A3%E8%AF%A6%E7%BB%86%E8%AF%B4%E6%98%8E

3. 日志文件的获取和查看

通过上面步骤, 我们成功拉取到xlog日志zip包, 但是普通的文本查看器无法查看,需要特殊的查看方法;

xlog文件查看步骤一般要经过

1. 解压zip,得到多个xlog

2. 解压并解密(如果加密了的话)xlog,得到xlog.log

3. 文本查看器查看

3.1 xlog的解密工具

官方提供了解密工具

https://github.com/Tencent/mars/wiki/Xlog-%E5%8A%A0%E5%AF%86%E4%BD%BF%E7%94%A8%E6%8C%87%E5%BC%95

https://github.com/yann2192/pyelliptic/tree/1.5.7

我自己用的是第三方一个可视化工具, 可以参考这篇文章

我用Flutter Deskstop做了一个Mars Xlog日志解析工具 - 掘金

工具的下载地址在这里https://github.com/JerryFans/mars_xlog_decoder_gui

3.2 大日志文件查看

得到xlog.log文件后, 往往日志文件非常大; 例如 10MB的xlog解码后的xlog.log文件高达99.8MB, 纯文本文件使用subline或电脑自带软件打开卡顿非常明显, 无法滚动;

这里推荐几个大日志文本查看工具:

大log文件查看器:

https://gitee.com/compilelife/loginsight/releases/tag/v1.0

好用的工具

https://github.com/variar/klogg/releases

我自己使用的klogg这个工具,使用起来很流畅, 搜索过滤功能也很方便,可以把搜索到的关键字记录聚集到一起, 并和原始记录分屏查看;

至此, 客户端日志拉取, 上传, 查看已形成闭环, 后面根据业务上传需要的日志就可以了,请大家多提意见;

相关文章:

如何设计一个Android端高性能日志监控系统

开发中客户端经常遇到一些线上问题, 无法复现, 但是又的的确确存在; 当线上反馈的时候无从下手; 主要是因为并不知道用户所处的环境,以及所做的操作顺序或者程序运行的顺序; 在排查问题和复现问题上占用了很大的成本; 如果debug时的log日志如果线上也能查看就好了; 基于此, 我们…...

maven下载按照及初次使用相关配置

maven下载按照及初次使用相关配置 一、下载 与安装 依赖Java,需要配置JAVA_HOME设置MAVEN自身的运行环境,需要配置MAVEN_HOME测试环境配置结果 MVN测试成功!!! 二、本地仓库配置 Maven启动后,会自动保…...

opencv05-掩膜

参考&#xff1a; https://blog.csdn.net/shuiyixin/article/details/88825549 #include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> #include <vector> #include <array> #include <algorithm>u…...

通讯软件013——分分钟学会Kepware OPC AE Server仿真配置

本文介绍如何使用Kepware软件仿真OPC AE Server配置。相关软件可登录网信智汇&#xff08;wangxinzhihui&#xff09;下载。 1、创建1个数据源&#xff1a;本案例采用“Graybox.Simulator.1”作为数据源。连接OPC Server数据源“Graybox.Simulator.1”。 右键点击“连通性”&am…...

Windows下安装Hive(包安装成功)

Windows下安装Hive Hive与Hadoop的版本选择很关键&#xff0c;千万不能选错&#xff0c;否则各种报错。一、Hive下载1.1、官网下载Hive1.2、网盘下载Hive 二、解压安装包&#xff0c;配置Hive环境变量2.1、环境变量新增&#xff1a;HIVE_HOME2.2、修改Path环境变量&#xff0c;…...

count(列名) ,count(1)与count(*) 有何区别?

Mysql版本&#xff1a;8.0.26 可视化客户端&#xff1a;sql yog 文章目录 一、Mysql之count函数简介二、count(列名) &#xff0c;count(常量)与count(*) 有何区别&#xff1f;2.1 统计字段上的区别2.2 执行效率上的区别 一、Mysql之count函数简介 &#x1f449;表达式 COUNT(…...

node.js判断元素是否包括

在Node.js中&#xff0c;可以使用Array.prototype.some()方法来判断数组中是否包含某个元素。下面是一个示例代码&#xff1a; const arr [ { ‘_android:name’: ‘com.eg.android.AlipayGphone’ }, { ‘_android:name’: ‘com.eg.android.AlipayGphoneRC’ }, { ‘_andro…...

基于SpringBoot+Vue的地方废物回收机构管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…...

【SAP MII学习】Day01--Overview, Security Services, and Workbench

1. Module 1: Overview 1.1 问题存在的原因 上图展示的是在工厂中IT的架构图&#xff0c;主要分为一下的三个层次&#xff1a; Shop Floor Automation and Control Systems (SFAC):collect data from the PLCs and sensors that are connected to the machinery on the facto…...

枚举类常见用法,A Guide to Java Enums

目录 啥是枚举类Custom Enum MethodsComparing Enum Types Using “” OperatorUsing Enum Types in Switch StatementsFields, Methods and Constructors in EnumsEnumSetEnumMapStrategy PatternSingleton PatternJava 8 and EnumsJSON Representation of EnumRead More Java…...

Vue Baidu Map--vue引入百度地图

1.安装 npm方式安装 $ npm install vue-baidu-map --save2.局部注册 <template> <div class"map-content" v-if"iscollegeRole"><baidu-map class"bm-view map":ak"mapAK" :scroll-wheel-zoom"true" :cen…...

使用Express部署Vue项目

使用Express部署Vue项目 目录 1. 背景 2. 配置Vue CLI 1.1 安装nodejs 1.2 创建vue-cli 1.3 创建vue项目 1.4 构建vue项目3. 配置Express 2.1 安装express 2.2 创建项目4. 使用express部署vue项目 1&#xff0c;背景 我们想要做一个前后端分离的课程项目&#xff0c;前端…...

344.翻转字符串+387.字符串中的第一个唯一字符

目录 一、翻转字符串 二、字符串中的第一个唯一字符 一、翻转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:void reverseString(vector<char>& s) {int start0;int end s.size()-1;while(start < end){swap(s[sta…...

安装mmcv

安装MMCV 创建虚拟环境gupao ,并激活nvcc -V 查看cuda版本 打开当前项目文件主页查看环境配置Prerequisites — MMPretrain 1.0.1 documentation 4. 安装合适的torch版本&#xff0c;原来的版本会自动卸载 pip install torch1.13.1cu117 torchvision0.14.1cu117 torch…...

什么是服务网格?

背景&#xff1a; 服务网格这个概念出来很久了&#xff0c;从 2017 年被提出来&#xff0c;到 2018 年正式爆发&#xff0c;很多云厂商和互联网企业都在纷纷向服务网格靠拢。像蚂蚁集团、美团、百度、网易等一线互联 网公司&#xff0c;都有服务网格的落地应用。服务网格是微服…...

8.1作业

文件IO函数实现拷贝文件。子进程先拷贝后半部分&#xff0c;父进程再拷贝前半部分&#xff0c;允许使用sleep函数 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<head.h> int main(int argc, const char *argv[]) {pid_t cpidfo…...

linux-安全技术

文章目录 安全机制墨菲定理信息安全防护的目标安全防护环节常见的安全攻击STRIDE 安全机制 墨菲定理 摘自百度百科 墨菲定律是一种心理学效应&#xff0c;1949年由美国的一名工程师爱德华墨菲&#xff08;Edward A. Murphy&#xff09;提出的&#xff0c;亦称墨菲法则、墨菲…...

如何在免费版 pycharm 中使用 github copilot (chatGPT)?

起因 在 vscode 中使用了 github copilot 以后&#xff0c;感觉这个人工智能还不错。 但 vscode 对于 python 项目调试并不是特别方便&#xff0c;所以想在 Pycharm 中也能使用同一个 github 账号&#xff0c;用上 copilot 的功能。 不需要等待&#xff0c;安装即用&#xff…...

SSD202D-UBOOT-FDT-获取DTB

因为一些需求,我们决定给uboot添加一个功能,在boot阶段识别获取出dtb,然后获取dts参数 DTS引脚是这样设置的 /* * infinity2m-ssc011a-s01a-padmux-display.dtsi- Sigmastar * * Copyright (c) [2019~2020] SigmaStar Technology. * * * This software is licensed under the …...

【Maven】Setting文件分享

<?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding …...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...