logcat日志的使用——Qt For Android
前言
最近一直用qt开发安卓app,一直无法用真机调试,可能是缺什么东西。但是如果通过Qt Creator在真机上运行,可以在电脑控制台看打印(安卓本身的日志、qDebug之类的打印),所以我是通过打印猜测问题所在,这样凑合着用。
最近换了个测试机,控制台就不打印了,包括qDebug的一些都没有,这就很难受了。
所以,就学习了一下安卓的日志工具logcat,查资料时,发现还可以与Qt的一些打印(qDebug、qInfo等)结合,都显示在命令行工具界面中,方便查看。
知识储备
Logcat 命令行工具
安卓的日志分有优先级:
V:详细(最低优先级)D:调试I:信息W:警告E:错误F:严重错误S:静默(最高优先级,绝不会输出任何内容)
如要将日志输出降低到可管理的水平,可使用过滤表达式限制日志输出。
过滤表达式采用 tag:priority ... 格式,其中 tag 表示您感兴趣的标记,priority 表示可针对该标记报告的最低优先级。不低于指定优先级的标记的消息会写入日志。在一个过滤表达式中提供任意数量的 tag:priority 规范。一系列规范使用空格分隔。
以下是一个过滤表达式的示例,该表达式会抑制除标记为“ActivityManager”、优先级不低于“信息”的日志消息,以及标记为“MyApp”、优先级不低于“调试”的日志消息以外的所有其他日志消息:
adb logcat ActivityManager:I MyApp:D *:S
也可控制日志输出格式:使用 -v 选项,并指定下列某一受支持的输出格式:
brief:显示优先级、标记以及发出消息的进程的 PID。long:显示所有元数据字段,并使用空白行分隔消息。process:仅显示 PID。raw:显示不包含其他元数据字段的原始日志消息。tag:仅显示优先级和标记。thread::旧版格式,显示优先级、PID 以及发出消息的线程的 TID。threadtime(默认值):显示日期、调用时间、优先级、标记、PID 以及发出消息的线程的 TID。time:显示日期、调用时间、优先级、标记以及发出消息的进程的 PID。
如:
adb logcat -v thread
常用的命令有:
- adb logcat ,查看输出的全部日志
- adb logcat -v time ,带日期的日志
- adb logcat -v time -s Tag 。仅显示指定标签的日志信息,同时带有日期
详细使用说明可看官网介绍:
Logcat 命令行工具 | Android Studio | Android Developers (google.cn)
qInstallMessageHandler
Message Handler用于打印出调试消息、警告、严重和致命错误消息。也就是说 qDebug(), qInfo(), qWarning(), qCritical(), qFatal()都是通过这个消息句柄打印出来的。
Qt提供了一个函数qInstallMessageHandler 用于安装消息处理函数,也就是可用自定义的Message Handler 替代之前默认的。
具体可见帮助文档说明
<QtGlobal> - Global Qt Declarations | Qt Core 5.15.16
我们可以使用自定义的Message Handler将打印消息收集起来写入文件,作为日志。
当然,也可以做其他处理 ,比如此次是将打印信息写入安卓的日志。
代码
上面关于logcat的帮助文档中有关于写日志的描述
日志记录系统的 C/C++ 主接口是共享库
liblog及其头文件<android/log.h>。所有语言特定的日志记录工具(包括android.util.Log)最终都会调用函数__android_log_write。默认情况下,它会调用函数__android_log_logd_logger,该函数使用套接字将日志条目发送到logd。从 API 级别 30 开始,可通过调用__android_set_log_writer更改日志记录函数
int __android_log_write(int prio,const char *tag,const char *text
)
Writes the constant string text to the log, with priority prio and tag tag.
下面的代码来自网络,亲测,可用:
#ifndef QDEBUG2LOGCAT_H#define QDEBUG2LOGCAT_H#include <QtMsgHandler>#ifdef ANDROIDvoid installLogcatMessageHandler(const char *TAG);#else#define installLogcatMessageHandler(TAG)#endif#endif // QDEBUG2LOGCAT_H
#if defined(ANDROID)#include "qDebug2Logcat.h"#include <android/log.h>#include <QDebug>#include <QByteArray>static const char *g_TAG = 0;static void messageOutput2Logcat(QtMsgType type,const QMessageLogContext &context,const QString &msg){int prio = ANDROID_LOG_VERBOSE;QByteArray localMsg = msg.toLocal8Bit();switch (type) {case QtDebugMsg:prio = ANDROID_LOG_DEBUG;break;case QtWarningMsg:prio = ANDROID_LOG_WARN;break;case QtCriticalMsg:prio = ANDROID_LOG_ERROR;break;case QtFatalMsg:prio = ANDROID_LOG_FATAL;break;case QtInfoMsg:prio = ANDROID_LOG_INFO;break;default:break;}__android_log_write(prio, g_TAG, localMsg.data());}void installLogcatMessageHandler(const char *TAG){g_TAG = (TAG == 0 ? "QDebug" : TAG);qInstallMessageHandler(messageOutput2Logcat);}#endif
int main(int argc, char *argv[])
{//注册自定义的消息处理函数installLogcatMessageHandler("CustomTag");...}
运行
在电脑上通过adb连接安卓设备后,调用命令行查看日志,
比如 标签为“onboardTrainingLog”的带日期等信息的日志:
adb logcat -v -time -s onboardTrainingLog
显示如下

附
关于通过qInstallMessageHandler实现各个平台日志,可参考下面的博客:
Qt 在Windows/Mac/Android下使用日志——————附赠完整代码和示例-CSDN博客
结束语
有了日志,感觉就有了底气。
相关文章:
logcat日志的使用——Qt For Android
前言 最近一直用qt开发安卓app,一直无法用真机调试,可能是缺什么东西。但是如果通过Qt Creator在真机上运行,可以在电脑控制台看打印(安卓本身的日志、qDebug之类的打印),所以我是通过打印猜测问题所在&am…...
软著项目推荐 深度学习的智能中文对话问答机器人
文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分:4.2 损失函数:4.3 搭建seq2seq框架:4.4 测试部分:4.5 评价NLP测试效果:4.6 梯度截断…...
灰度发布专题---3、Nginx+Lua灰度发布
上一章已经讲解了配置文件灰度发布、应用版本灰度发布、API网关灰度发布实现,但如果用户这时候在代理层如何做灰度发布呢? 代理层灰度发布分析 用户无论访问应用服务还是静态页,都要经过Nginx代理层,我们可以在Nginx这里做灰度发…...
冬天来了,波司登的高端化“春天”不远了?
最近,羽绒服频繁“贵”上热搜。 在众多热搜词条中,一条“国产羽绒服卖到7000元”的话题一度将波司登推上了舆论的风口浪尖。 对此,波司登在最新的业绩说明会上进行了回应,公司表示:“波司登旗下主品牌及子品牌将形成差…...
Vue3.0优点详解
相对于Vue2.0 3.0有了比较大的改进,优势主要有以下几点: 一、性能提升 1、Vue3.0的响应式系统使用了Proxy代理对象,取代了Vue2.0中的Object.defineProperty,使得Vue3.0的响应式系统更快、更灵活。 2、Vue3.0对TypeScript的支持更…...
Unity3D URP 自定义范围的特效热扭曲详解
前言 Unity3D URP(Universal Render Pipeline)是Unity官方推出的一款渲染管线,可以实现高效、高质量的图形渲染。在URP中,我们可以通过自定义特效来增强游戏的视觉效果。本文将详细解释如何使用URP实现一个自定义范围的特效热扭曲…...
Apache Flink(一):Apache Flink是什么?
🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录...
Wordpress自动定时发布怎么开通-Wordpress怎么自动发布原创文章
在当今数字化时代,博客已经成为许多人分享观点、经验和知识的重要平台。然而,对于博主们来说,每天按时发布一篇又一篇的文章可能是一项具有挑战性的任务。为了解决这个问题,一些创新的工具应运而生,其中包括WordPress的…...
VUE项目中问题学习总结(一)
文章目录 🍁自定义组件使用🍁clearInterval函数的使用🌿定时器的作用 🍁localStorage的使用🌿设置数据🌿获取数据🌿更新数据🌿删除数据 🍁VUE国际化配置🍁项目…...
使用K-means把人群分类
1.前言 K-mean 是无监督的聚类算法 算法分类: 2.实现步骤 1.数据加工:把数据转为全数字(比如性别男女,转换为0 和 1) 2.模型训练 fit 3.预测 3.代码 原数据类似这样(source:http:img-blog.csdnimg.cn…...
静态HTTP和动态HTTP有什么区别
静态HTTP是指网页内容在服务器上以静态文件的形式存在,每个页面都是固定的,不能根据用户的操作或输入进行改变。当用户请求一个静态页面时,服务器直接将页面的HTML代码返回给用户的浏览器进行显示。静态HTTP服务器的主要优点是速度快、简单易…...
分享66个在线客服JS特效,总有一款适合您
分享66个在线客服JS特效,总有一款适合您 66个在线客服JS特效下载 链接:https://pan.baidu.com/s/1VqM6ASgKRFdQ8RyzbsX4uA?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气࿰…...
Backend - Django JsonResponse HttpResponse
目录 一、关系 二、使用 (一)data 字典传值 1. JsonResponse 2. HttpResponse 3. 例子 (二)JsonResponse 有一个 safe 参数 (三)前端接收 1. 接收 JsonResponse 回传的值 2. 接收 HttpResponse 回…...
第四阶|自在行草 暄桐教室,林曦书法 从书法之美到生活之美
我这有很多的课程,需要了可以取用 新一期(入门课),目前已经更新完毕。 新一期(第一阶),目前已经更新完毕。 新一期(第二阶),目前已经更新完毕。 新一期&#…...
kubernetes详解——从入门到入土(更新中~)
k8s简介 编排工具:系统层面ansible、saltstackdocker容器docker compose docker swarm docker machinedocker compose:实现单机容器编排docker swarm:实现多主机整合成为一个docker machine:初始化新主机mesos marathonmesos …...
VScode异常处理 (因为在此系统上禁止运行脚本)
在使用 VScode 自带程序终端的时候会报出"系统禁止脚本运行的错误" 这是由于 Windows PowerShell执行策略导致的 解决办法 管理员身份运行 Windows PowerShell执行:get-ExecutionPolicy1,显示Restricted2执行:Set-ExecutionPoli…...
(5h)Unity3D快速入门之Roll-A-Ball游戏开发
DAY1:Unity3D安装 链接 DAY2:构建场景,编写代码 链接 内容:WASD前后左右移动、摄像机跟随 DAY3:待更新 DAY4:待更新 DAY5:待更新...
分享86个选项卡TABJS特效,总有一款适合您
分享86个选项卡TABJS特效,总有一款适合您 86个选项卡TABJS特效下载链接:https://pan.baidu.com/s/1NBtPP2tT5YQqi6c744tCqg?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气࿰…...
【Linux】Linux基础
文章目录 学习目标操作系统不同应用领域的主流操作系统虚拟机 Linux系统的发展史Linux内核版和发行版 Linux系统下的文件和目录结构单用户操作系统vs多用户操作系统Windows和Linux文件系统区别 Linux终端命令格式终端命令格式查阅命令帮助信息 常用命令显示文件和目录切换工作目…...
动态规划求解 fibonacci 数列
动态规划: 动态规划的基本思想是:将原问题拆分为若干子问题,自底向上的求解。是自底向上的求解,即是先计算子问题的解,再得出原问题的解。 思路: 创建一个数组,大小为n1,用于存储斐波那契数列的值。数组的…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
