如何解决 Android Studio 长日志打印不全问题?

    我们在开发过程中经常需要在控制台打印日志来进行调试,但是会发现日志内容过长的情况下,就无法完整的输出全部内容,这是因为 Log 日志最大长度为 4096 字节,超过这个长度的部分就无法显示。下面给出几个解决方案:

方式一:

private static final int MAX_LOG_BYTES = 4096;public static void largeLog(String tag, String content) {if (content.length() > MAX_LOG_BYTES) {Log.d(tag, content.substring(0, MAX_LOG_BYTES));largeLog(tag, content.substring(MAX_LOG_BYTES));} else {Log.d(tag, content);}
}

    以上代码初看起来,简洁优雅,但实际上存在问题,Log 日志的最大长度 4096 是指的字节长度,如果输出的日志内容都是 ASCII 编码的字符(单字节的字符),这样写是可以的。但是如果日志内容包括 UTF8 编码的中文字符(1-4个字节),所以上面代码中的:content.substring(0, MAX_LOG_BYTES),“4096 长度的字符串”包括的字节数会超出 4096 字节(日志最大字节数),仍然会导致分段输出的日志可能不完整。

    根据上面的分析,如果输出的日志(字符串)不仅仅包括单字节字符(包括中文字符),可以考虑将上面的 MAX_LOG_BYTES 的值修改的低一些,例如1000,2000等。这样处理虽然比较简单,但略显粗糙,因此我们可以考虑用更精准的 “方式二” 与 “方式三” 来实现。

方式二:

   # 由于日志的tag, priority(assert, debug, ...), etc. 会占用一些字节,这里4096是一个理想值。# 建议这里设置一个小于4096 的值,例如一个比较保守的值 4000 # private static final int MAX_LOG_BYTES = 4096;private static final int MAX_LOG_BYTES = 4000;public static void largeLog(int priority, String tag, @NonNull String content) {int size = content.getBytes(StandardCharsets.UTF_8).length;if (size > MAX_LOG_BYTES) {String text = trim(content, MAX_LOG_BYTES);Log.println(priority, tag, text);largeLog(priority, tag, content.substring(text.length()));} else {Log.println(priority, tag, content);}}public static String trim(String text, int size) {byte[] inputBytes = text.getBytes(StandardCharsets.UTF_8);byte[] outputBytes = new byte[size];System.arraycopy(inputBytes, 0, outputBytes, 0, size);String result = new String(outputBytes, StandardCharsets.UTF_8);// check if last character is truncatedint lastIndex = result.length() - 1;if (lastIndex > 0 && result.charAt(lastIndex) != text.charAt(lastIndex)) {// last character is truncated so remove the last characterreturn result.substring(0, lastIndex);}return result;}

方式三:

   # 由于日志的tag, priority(assert, debug, ...), etc. 会占用一些字节,这里4096是一个理想值。# 建议这里设置一个小于4096 的值,例如一个比较保守的值 4000 # private static final int MAX_LOG_BYTES = 4096;private static final int MAX_LOG_BYTES = 4000;   public static void largeLog(String tag, String str) {String[]  logs = SplitStringByByteLength(str, "UTF-8", MAX_LOG_BYTES );for(String log : logs) {Log.i(tag, log);}}public static String[] SplitStringByByteLength(String src, String encoding, int maxsize) {Charset cs = Charset.forName(encoding);CharsetEncoder coder = cs.newEncoder();ByteBuffer out = ByteBuffer.allocate(maxsize);  // output buffer of required sizeCharBuffer in = CharBuffer.wrap(src);List<String> ss = new ArrayList<>();            // a list to store the chunksint pos = 0;while(true) {CoderResult cr = coder.encode(in, out, true); // try to encode as much as possibleint newpos = src.length() - in.length();String s = src.substring(pos, newpos);ss.add(s);                                  // add what has been encoded to the listpos = newpos;                               // store new input positionout.rewind();                               // and rewind output bufferif (! cr.isOverflow()) {break;                                  // everything has been encoded}}return ss.toArray(new String[0]);}

参考:

Android - Set max length of logcat messages

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/842235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何画泳道图?

一、绘制泳道图 1、新建一个绘图&#xff0c; 工具箱搜索“泳道图” 2、修改泳道图标题及风格 3、绘制基本的流程图 4、导出Visio格式 选择文件导出&#xff0c;visio格式

安全工程师考试摸拟试题

安全工程师考试摸拟试题安全工程师是指在工程项目中负责安全管理和安全技术服务的专业人员。他们需要具备扎实的理论知识和丰富的实践经验&#xff0c;能够有效预防和控制各类安全风险… 1 安全工程师考试摸拟试题 安全工程师是指在工程项目中负责安全管理和安全技术服务的专业…

实战14:粒子群算法pso优化机器学习集成学习进行数据预测-完整代码数据

视频演示: 效果演示: 主要代码: import numpy as np from sklearn.model_selection import train_test_split from sklearn.ensemble import GradientBoostingRegressor, AdaBoostRegressor from xgboost import XGBRegressor from lightgbm import LGBMRegressor from s…

MySQL|主从复制配置

我使用的是两个云服务器&#xff0c;如果读者使用的是虚拟机和本机&#xff0c;配置会简单很多。 关于云服务器安全组设置、防火墙端口等问题请参考文章&#xff1a; 使用华为云服务器进行项目部署&#xff08;云服务器、防火墙配置&#xff09; 条件&#xff1a;master 和 s…

Keras深度学习框架第二十八讲:可视化超参数调优过程

1、绪论 可视化超参数调优过程&#xff08;Visualize the hyperparameter tuning process&#xff09;指的是在机器学习或深度学习的模型训练中&#xff0c;通过图形化或可视化的方式展示和调整模型的超参数&#xff08;hyperparameters&#xff09;。这个过程有助于用户直观地…

SaaS增长三大策略:从用户获取到留存转化的全链路解析

在SaaS&#xff08;软件即服务&#xff09;行业中&#xff0c;增长是企业成功的关键。然而&#xff0c;要实现持续增长并非易事&#xff0c;需要一套从用户获取到留存转化的全链路策略。 首先&#xff0c;用户获取是SaaS增长的第一步。 这要求企业明确目标用户群体&#xff0…

【LeetCode】【9】回文数(1047字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示进阶Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;LeetCode 刷题指南&#xff1a;LeetCode刷题指南 题目描述 给一个整数x&#xff0c;如果x是一个回文整数&#xff0c;返回true&#xff1b;否…

C# VSTO读取Excel单元格Value、Value2

对单个单元格的值&#xff0c;需要用object 对象去接 object value (object)oneCellRange.Value; object value2 (object)oneCellRange.Value2; 对矩形范围的值&#xff0c;需要用object[,]去接 object[,] matrixValues (object[,])matrixRange.Value; object[,] matrixV…

centos 安装docker及docker-compose

安装docker yum install -y yum-utils yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fase yum install -y docker-ce docker-ce-cli containerd.io systemctl start docker systemctl enable docker dock…

【NumPy】关于numpy.sort()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

MongoDB数据库清理策略: 自动化过期数据删除实战

1、引言 随着应用程序和业务数据的持续增长&#xff0c;有效地管理数据库存储空间成为维护系统性能的关键。在MongoDB这类NoSQL数据库中&#xff0c;定期清理过期数据变得尤为重要&#xff0c;这不仅能释放宝贵的存储资源&#xff0c;还能优化查询性能&#xff0c;确保数据库运…

Qt 对话框或者QMainWindow等类中调用自定义QWidget继承组件

简单的方法如下所示 1、创建一个ui文件&#xff0c;界面布局放入QVBoxLayout或者QHBoxLayout 使用他来放入自定义组件&#xff0c;类似如下 2、代码如下&#xff1a; ui.setupUi(this); { //自定义组价如下 KwTable *Table new KwTable(this); ui.vertical…

为什么要有NOC

如果是AHB&#xff0c;注意AXI并不真的定义了总线&#xff0c;更多是接口。 那么如何实现上面的带宽&#xff0c;延迟需求呢。 在异构&#xff0c;多时钟&#xff1b;大芯片&#xff0c;物理面积很大&#xff0c;延迟太长&#xff1b;片上系统&#xff0c;IP众多&#xff0c;总…

包装设计的七个秘诀

大家都知道&#xff0c;包装设计的好与坏不等于企业的好&#xff0c;但是消费者会有先入为主的想法&#xff0c;如果一个企业连包装设计都不重视&#xff0c;那么谁来重视产品质量呢&#xff1f;无可否认&#xff0c;对产品的评价首先是质量&#xff0c;但质量之后&#xff0c;…

【OpenVINO™】在C#中使用 OpenVINO™ 部署 YOLOv10 模型实现目标

文章目录 1. 前言1.1 OpenVINO™ C# API1.2 YOLOv10 2. 模型获取2.1 源码下载2.2 配置环境2.3 下载模型 3. Yolov10 项目配置3.1 项目创建与环境配置3.2 定义模型预测方法3.2.1 定义目标检测模型方法3.2.2 使用OpenVINO™ 预处理接口编译模型 3.2 模型预测方法调用 4. 项目运行…

文心智能体之情感领航员:你的智能情感导师

文章目录 引言情感领航员的诞生与定位情感领航员的优势与特点专业性个性化便捷性隐私保护 如何创建自己的智能体创建方式智能体名称和设定基础配置角色与目标指导原则限制澄清个性化 高级配置保存 /发布流量数据分析智能体调优 总结 引言 在现代社会中&#xff0c;情感问题的普…

[CISCN2024]-PWN:orange_cat_diary(glibc2.23.,仅可修改最新堆块,house of orange)

查看保护 查看ida 这里我们仅可以修改最新申请出来的堆块&#xff0c;但是有uaf漏洞。 完整exp&#xff1a; from pwn import* #context(log_leveldebug) pprocess(./orange) free_got0x201F78def alloc(size,content):p.sendlineafter(bPlease input your choice:,b1)p.send…

行转列——kettle开发14

一、行转列 如图所示&#xff0c;行转列就是把数据字段的字段名转换为一列&#xff0c;把数据行变成数据列。即我们将昨天输出的张三在周一至周日的工作小时转换为7行数据。对应7行数据分别为张三在周一工作多个小时&#xff0c;在周二工作多少个小时等等。 我们来看下行转列组…

pycharm打开服务器(linux)上的项目

先在本地打开项目 一、项目文件配置 tools-deployment-configuration 新增一个sftp连接 测试服务器是否可以连通 mappings中设置本地路径和服务器上的路径 二、环境配置 先参考文章 复现论文的conda环境&#xff08;win和联网、离线linux&#xff09;_conda复现环境-CSDN博…

有个小伙把 MyBatis 替换成 MyBatis-Plus,上线后就被开了!!

MyBatis-Plus 替换 MyBatis 首先&#xff0c;我们准备了一张名为 tbl_order 的表&#xff0c;并初始化了其中的两条数据。 DROP TABLE IF EXISTS tbl_order; CREATE TABLE tbl_order (id bigint(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 自增主键,order_no varchar(50)…