xlog使用

2023-11-13

对移动开发者来说,最头疼的莫过于线上出现问题,本地无法复现又没有任何日志的场景。但是考虑到应用性能和安全性,无法打印和保存过多的日志。颇有一种书到用时方恨少的感觉。

一、xlog介绍

xlog 是腾讯 Mars 终端基础组件中的通用日志模块,它有下面几个优点:

  • 使用mmap的方案进行日志写入,mmap 是使用逻辑内存对磁盘文件进行映射,中间只是进行映射没有任何拷贝操作,避免了写文件的数据拷贝。操作内存就相当于在操作文件,避免了内核空间和用户空间的频繁切换。提升了效率同时也保证了日志的完整性。下图是官方提供的写入效率对比图
    在这里插入图片描述
  • 日志支持加密,提高日志信息的安全性
  • 底层使用c++实现,支持Android和iOS平台
  • 支持设置单个日志文件的保存天数和大小,基本满足日常的开发需求

二、xlog 使用

参考官方提供的 demo

2.1 引入xlog

 configurations {
 	//定义一个新的依赖方式
    cmake_depends
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    implementation 'com.android.support:appcompat-v7:26.1.0'
    testImplementation 'junit:junit:4.12'
    implementation "com.tencent.mars:mars-xlog:${VERSION_NAME}${VERSION_NAME_SUFFIX}"
    cmake_depends "com.tencent.mars:mars-xlog:${VERSION_NAME}${VERSION_NAME_SUFFIX}"
}

//获取xlog中的.so文件,用于ndk编译使用,如果项目中不包括ndk代码,可以不需要
task resolveDependencies {
    project.configurations.each { configuration ->
        if ("cmake_depends".equalsIgnoreCase(configuration.name)) {
            def lib = configuration.resolve()[0]
            copy {
                from zipTree(lib)
                into "${project.rootDir}/${project.name}/src/main/jniLibs/"
                include "jni/**/*.so"
            }
        }
    }
}

//build 依赖 resolveDependencies task
build.dependsOn resolveDependencies

导入xlog头文件
在这里插入图片描述
cmake 中 查找并链接 xlog 动态库

cmake_minimum_required(VERSION 3.4.1)

include_directories(export_include)

add_library(native-lib SHARED native-lib.cpp)

find_library(log-lib log)

set(XLOG_PATH ../jniLibs/jni/${ANDROID_ABI}/)

find_library(XLOG_LIB marsxlog PATHS ${XLOG_PATH} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)

target_link_libraries(native-lib ${log-lib} ${XLOG_LIB})

2.2 使用xlog

初始化xlog
    static {
        System.loadLibrary("c++_shared");
        System.loadLibrary("marsxlog");
        System.loadLibrary("native-lib");
    }

public void initLog(boolean isDebug) {
    String logPath = getExternalFilesDir(null).getPath() + "/logsample/xlog";
    Xlog xlog = new Xlog();
//    xlog.setMaxFileSize(0, 1024*1024);
//    xlog.setMaxAliveTime(0, 1);
    Log.setLogImp(xlog);
    Log.setConsoleLogOpen(true);
    Log.appenderOpen(isDebug ? Xlog.LEVEL_DEBUG : Xlog.LEVEL_INFO, Xlog.AppednerModeAsync, "",
        logPath, "LOGSAMPLE", 0);
  }

主要是appenderOpen 方法:

appenderOpen(int level, int mode, String cacheDir, String logDir, String nameprefix, int cacheDays)

level:日志等级,如果使用xlog,日志等级就比较好控制,不需要再传递给openvpn debug开关
mode: 写入的模式,支持同步和异步写入,同步写入可能会导致卡顿,release版本一定要异步写入
cacheDir:设置缓存目录
logDir:设置写入的文件目录,
nameprefix:设置日志文件名的前缀,
cacheDays:在多少天以后 从缓存目录移到日志目录 一般情况下填0即可

xlog 使用

直接使用xlog相关的api进行打印日志,日志会自动写入文件中。

        com.tencent.mars.xlog.Log.d(TAG, "test");
        com.tencent.mars.xlog.Log.e(TAG, "test");
#include "xlogger/android_xlog.h"

	LOGI("test", "111111111111");
	LOGD("test", "111111111111");
  • 生成的日志文件
    在这里插入图片描述
    .xlog 文件是无法直接查看的,需要使用xlog对应的python脚本进行处理。
python decode_mars_nocrypt_log_file.py 日志文件

请添加图片描述
转换后的日志内容:
在这里插入图片描述

xlog加解密
  • 生成加密秘钥,执行 python gen_key.py 命令
    在这里插入图片描述在这里插入图片描述
    其中 private key 是私钥,appender_open's parameter 是公钥。

  • 代码中设置公钥,初始化方式和上面有些差异

    public void initLog(boolean isDebug) {
        String logPath = getExternalFilesDir(null).getPath() + "/logsample/xlog";


        Xlog xlog = new Xlog();
        xlog.setMaxAliveTime(0, 24 * 60 * 60);

        Xlog.open(false, isDebug ? Xlog.LEVEL_DEBUG : Xlog.LEVEL_INFO, Xlog.AppednerModeAsync, "",
            logPath, "LOGSAMPLE", LOG_PUB_KEY);

        xlog.setMaxFileSize(0, 1024 * 120);
        xlog.setConsoleLogOpen(0, true);
        Log.setLogImp(xlog);
    }

Log.appenderOpen() 方法没有 pubKey 参数,需要使用 Xlog.open() 方法初始化。

  • 修改解密脚本 decode_mars_crypt_log_file.py,替换刚才生成的私钥和公钥。
    在这里插入图片描述
其他使用细节
  1. 由于使用异步模式,所以日志并不会实时同步到文件中,当执行日志上报操作时,需要调用 appenderFlush 方法将内存中的日志写入文件中,避免日志不完整。
  2. 单条日志大小限制16kb,超过16kb会被截取,目前没有其他解决方法,需要自行判断日志大小进行拆分写入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xlog使用 的相关文章

随机推荐

  • Acwing 2. 01背包问题

    f i j 表示从前i个物品选 总体积 lt j的所有选法中的最大值 注意 当j
  • JS设计模式

    目录 前言 单例设计模式 Command 命令模式 Constructor构造器模式 工厂模式Factory 发布订阅设计模式 publish subscribe 观察者模式 中介者模式 前言 JS设计模式是一种思想 更规范更合理的管理代码
  • R语言对苏州天气的分析及预测 温度篇

    温度篇 前面已经讲了苏州的天气特点 还是用相同的数据 做接下来的苏州气温特点的分析预测 是的预测在这里 首先看下2011年到2015年苏州整体的温度表现是什么样的 plot suzhou highestTemp type l col red
  • cherry-pick如何使用?

    多分支开发 然后从测试分支合并到生产分支 测试分支有些内容此次不上线 所以不能全量merge 此时该如何操作呢 这时候就需要使用git cherry pick 下面是阮一峰的教程http www ruanyifeng com blog 20
  • React基础讲解

    文章目录 前言 一 React是什么 二 如何使用 1 基于浏览器的模式 babel 代码如下 2 利用react 创建视图 3 JSX 4 插值表达式 代码示例 5 条件输出 输出数据类型 列表渲染 条件渲染 6 列表循环 基于自动化的集
  • 【C语言编程练习】使用循环,计算1至100的和

    题目 使用循环结构 计算从1加到100的和 题目分析 可以使用for while do while进行设计 1 for循环 使用for循环时 需要注意循环变量的值要从1到100 不要写成了i lt 100导致没加100 2 while循环
  • centos切换到root登录

    具体操作方法 1 在centos系统桌面下通过快捷键 Ctrl Alt T 打开终端命令行模式 2 在centos终端命令行模式下输入以下命令切换到root用户登录 su root 切换到root用户 3 登录过程中如果怎么输入密码都出错
  • glTF模型转3D Tiles

    将 glTF 模型转换为 3D Tiles 格式需要使用一些工具来完成 其中一种方法是使用 Cesium 的 3D Tiles 工具 Cesium 是一个开源的 3D 地球浏览器 它提供了一个命令行工具 可以将 glTF 模型转换为 3D
  • nginx压缩ttf文件 mine.types的作用

    最近在运维过程中 前端提到发现在linux上下载某ttl文件 字体文件 太大 传输过程比较慢 于是就想着使用nginx的gzip进行压缩 经过不断尝试 终于发现在nginx的配置目录 etc nginx mine types 文件中少了 f
  • 如何把C盘Program Files(x86)中的google文件删除

    1 打开任务管理器 杀掉google相关的所有进程 2 参考以下文章更改权限 29条消息 需要来自administrators的权限才能对此文件夹进行更改 欧晨eli的博客 CSDN博客 你需要来自计算机管理员的权限才能对此文件夹进行更改
  • Pytorch Pytorch+深度学习神经网络相关学习收获

    文章目录 一 基础知识 二 Pytorch 三 如何实现一个神经网络 四 pytorch的数据类型 五 常用结构 六 构造神经网络的相关知识 七 数据集处理 一 基础知识 机器学习 本质就是通过 数据 答案的数据集 经过机器学习的训练 得到
  • 第四章 分支结构程序设计(二)

    5 已有预处理命令和定义如下 define N 8 intx 2 z 1 double y 1 2 下述程序段正确的是 C A switch x case z x break case N gt 0 x break B switch x c
  • Anaconda常用命令汇总

    Conda是Anaconda中一个强大的包和环境管理工具 可以在Windows系统中的的Anaconda Prompt命令行使用 也可以在macOS或者Linux系统的终端窗口的命令行使用 本文简单介绍conda的一些常用命令命令 仅供参考
  • 基于ant.design4.3.1实现table的编辑

    以下内容其实是当时不太会的一种无可奈何之举 建议使用实现form table编辑校验新链接的方法更为恰当 实现效果如图所示 import React useState from react import Table Input InputN
  • C#登录的实现(权限)

    只要涉及到软件的使用 最根本的会存在有登录 通过个人唯一的标志性账户登入使用软件 可以存有每个人独有的数据信息 制作一款软件最基础的前端操作页面等一系列模块只是最基础的框架 通过独有账户信息进入可通过后台数据处理显示以及操作个人最高权限的信
  • ESP8266-NodeMCU网络服务器(一)- 数字时钟制作

    文章目录 效果 所需环境 实现步骤 原理 HTML JS代码 上传文件到闪存系统 上传程序 效果 所需环境 ESP8266 NodeMCU 开发板 以下简称NodeMCU ESP8266库 Arduino IDE 代码编写工具 无线 热点
  • 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)

    目录 概念 C 源码 OtsuThreshold 主函数 效果 完整源码 平台 Windows 10 20H2 Visual Studio 2015 OpenCV 4 5 3 本文所用源码修改自C opencv 图片二值化最佳阈值确定 大津
  • Objectiv-C学习笔记-XCode模拟命令行填入参数执行

    菜单 Product gt Edit Scheme 左边找到run xxx点击后在右边选择Arguments面板中就可以设置XCode在运行命令行app时模拟输参数 设置完成后再次run就会自动填入设置好的参数了
  • Springboot集成Jedis + Redisson

    以下转载文章经过本人亲测 具有可行性 很好地解决了配置文件分环境部署 以及基本的redissonclient注入问题 转载地址 https my oschina net devonking blog 1421774 本文主要跟大家分享在Sp
  • xlog使用

    对移动开发者来说 最头疼的莫过于线上出现问题 本地无法复现又没有任何日志的场景 但是考虑到应用性能和安全性 无法打印和保存过多的日志 颇有一种书到用时方恨少的感觉 一 xlog介绍 xlog 是腾讯 Mars 终端基础组件中的通用日志模块