构建高性能日志系统:QGroundControl日志模块深度解析

引言:日志系统的重要性

在无人机地面站系统中,日志记录是诊断问题、分析性能的关键基础设施。QGroundControl(QGC)作为领先的开源无人机地面站软件,其日志系统设计值得深入探讨。本文将揭示QGC日志系统的核心技术,展示如何构建一个支持动态过滤、多线程安全、自动轮转的跨平台日志模块。

一、特性

QGroundControl的日志系统展示了工业级日志模块应有的特性:

  • 通过动态过滤实现精细控制
  • 采用生产者-消费者模型确保线程安全
  • 实现自动轮转防止磁盘耗尽
  • 支持跨平台一致体验
  • 提供丰富接口用于诊断和分析

这些设计原则不仅适用于无人机系统,也可应用于任何需要可靠日志记录的应用程序。

二、整体架构设计

QGC日志系统采用分层架构,各模块职责分明:

过滤/格式化
Qt日志输出
自定义消息处理器
日志路由器
主线程模型
内存列表存储
磁盘持久化
自动轮转
日志分类注册
动态过滤引擎

三、核心技术实现

1. 日志捕获与路由

核心是重写Qt消息处理器,实现日志的动态过滤格式化

// 安装全局消息处理器
void QGCLogging::installHandler()
{qSetMessagePattern("%{time process} - %{type}: %{message} (%{category}:%{function}:%{line})");defaultHandler = qInstallMessageHandler(msgHandler);
}// 自定义处理器
static void msgHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{// 按分类动态过滤if (!QLoggingCategory(context.category).isDebugEnabled()) return;// 格式化日志const QString message = qFormatLogMessage(type, context, msg);// 过滤Qt Quick内部日志if (!QString(context.category).startsWith("qt.quick")) {QGCLogging::instance()->log(message); // 提交到日志系统}// 调用原始处理器(如有)if (defaultHandler) defaultHandler(type, context, msg);
}

2. 线程安全设计

实现生产者-消费者模型,确保跨线程安全:

// 跨线程日志提交
void QGCLogging::log(const QString &message)
{if (!_ioError) emit emitLog(message); // 信号触发
}// 连接方式根据平台适配
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)const Qt::ConnectionType conntype = Qt::QueuedConnection;
#elseconst Qt::ConnectionType conntype = Qt::AutoConnection;
#endifconnect(this, &QGCLogging::emitLog, this, &QGCLogging::_threadsafeLog, conntype);// 主线程实际处理
void QGCLogging::_threadsafeLog(const QString &message)
{// 添加到模型(触发UI更新)beginInsertRows(QModelIndex(), rowCount(), rowCount());appendRow(new QStandardItem(message)); // 简化示例endInsertRows();// 内存控制:限制1000行if (rowCount() > 1000) removeRow(0);
}

3. 动态日志过滤系统

通过扩展Qt日志分类实现运行时过滤

// 扩展Qt日志分类宏
#define QGC_LOGGING_CATEGORY(name, ...) \static QGCLoggingCategory qgcCategory##name(__VA_ARGS__); \Q_LOGGING_CATEGORY(name, __VA_ARGS__)// 自动注册到全局列表
QGCLoggingCategory::QGCLoggingCategory(const QString &category) {QGCLoggingCategoryRegister::instance()->registerCategory(category);
}// 构建过滤规则
void QGCLoggingCategoryRegister::setFilterRulesFromSettings(const QString &commandLineLoggingOptions) const
{QString filterRules = "*Log.debug=false\nqgc.*.debug=false\n";// 加载用户设置的分类for (const QString &category : registeredCategories()) {if (categoryLoggingOn(category)) filterRules += QString("%1.debug=true\n").arg(category);}// 命令行参数覆盖if (!commandLineLoggingOptions.isEmpty()) {// 解析参数并追加规则...}// 特殊模块处理(如视频)if (videoAllLogSet) {filterRules += "qgc.videomanager.videomanager.debug=true\n";// ...其他相关分类}// 应用最终规则QLoggingCategory::setFilterRules(filterRules);
}

4. 磁盘持久化与轮转

实现自动日志轮转批量写入

// 定时刷盘(每秒执行)
void QGCLogging::_flushToDisk()
{if (_pendingDiskWrites.isEmpty()) return;// 检查文件大小并轮转if (_logFile.size() >= 10 * 1024 * 1024) _rotateLogs();// 批量写入QTextStream out(&_logFile);foreach (const QString &line, _pendingDiskWrites) {out << line << "\n";}_pendingDiskWrites.clear();_logFile.flush();
}// 日志轮转算法
void QGCLogging::_rotateLogs()
{_logFile.close();// 重命名现有日志:log.1 -> log.2, ... log.5 -> 删除for (int i = 4; i >= 1; --i) {QString oldName = QString("QGCConsole.%1.log").arg(i);QString newName = QString("QGCConsole.%1.log").arg(i+1);QFile::rename(oldName, newName);}// 当前日志变为log.1QFile::rename("QGCConsole.log", "QGCConsole.1.log");// 重新打开新文件_logFile.open(QIODevice::WriteOnly);
}

四、应用场景分析

1. 飞行故障诊断

[15:32:45.123] DEBUG: MAVLink message lost (qgc.comm:parseMavlink:256)
[15:32:45.567] WARNING: GPS signal weak (qgc.sensors:gpsStatus:189)

通过过滤qgc.commqgc.sensors分类,快速定位通信和传感器问题。

2. 性能优化分析

QGC_LOGGING_CATEGORY(PerfLog, "qgc.performance")void criticalFunction()
{QElapsedTimer timer;timer.start();// ...性能关键代码...qCDebug(PerfLog) << "Function took" << timer.elapsed() << "ms";
}

3. 跨平台日志收集

// Android特殊处理
#if defined(Q_OS_ANDROID)
QString logPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)
#else
QString logPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)
#endif_logFile.setFileName(logPath + "/QGCConsole.log");

五、性能优化技巧

  1. 批量写入:积累日志后一次性写入磁盘,减少I/O操作
  2. 内存限制:固定行数环形缓冲区,防止内存溢出
  3. 异步处理:磁盘操作在后台线程执行,不阻塞UI
  4. 平台适配:针对移动端优化连接方式和存储路径
  5. 延迟初始化:日志文件按需创建,减少资源占用

六、完整实现代码

完整代码可参考QGC开源项目:
QGCLogging模块

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

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

相关文章

k8s查看内存占用前十的20个pod服务,不包括job

在 Kubernetes 中&#xff0c;您可以使用 kubectl 命令结合一些工具来查看内存占用前十的 Pod 服务&#xff0c;并排除 Job 类型的 Pod。以下是一个示例命令&#xff0c;您可以在终端中运行&#xff1a; kubectl top pods --all-namespaces --no-headers | grep -v job | sort …

Spring Boot 集成 LangChain4j 示例

文章目录 概述一、DeepSeek API Key 获取二、Spring Boot 集成 LangChain4j 示例三、拓展建议 概述 LangChain4j 是 LangChain 在 Java 生态下的实现&#xff0c;它是一个开源库&#xff0c;帮助你更方便地在 Spring Boot 应用中集成大语言模型&#xff08;如 OpenAI 的 GPT-4…

数据差异的iOS性能调试:设备日志导出和iOS文件管理

在复杂iOS项目中&#xff0c;尤其是集成多个第三方服务、使用混合数据源&#xff08;本地远程缓存&#xff09;的系统里&#xff0c;“数据不一致”类问题极具迷惑性。一方面&#xff0c;数据看似可用&#xff0c;逻辑层也没有明显错误&#xff1b;另一方面&#xff0c;用户层面…

二进制与生活:从数字世界到人生哲理

二进制与生活&#xff1a;从数字世界到人生哲理 最近重温《少年谢尔顿》&#xff0c;被剧中谢尔顿与二进制对话的场景深深打动。这让我思考&#xff1a;二进制这个看似冰冷的数字系统&#xff0c;其实与我们的生活有着千丝万缕的联系。今天&#xff0c;让我们一起走进二进制的世…

基于SMB协议的内网存活主机探测技术研究

一、 技术背景 SMB(Server Message Block)协议是Windows环境中广泛使用的网络文件共享协议&#xff0c;默认开放于445端口。由于其在Windows系统中的核心地位&#xff0c;SMB协议常被用作内网探测的重要切入点。本文系统介绍多种基于SMB的存活主机探测技术&#xff0c;帮助安全…

IDEA21中文乱码解决办法

我改了很多&#xff0c;可能也改了一些没用的 1.在VM options中添加-Dstdout.encodingUTF-8 -Dstderr.encodingUTF-8 2.IDEA 控制台输出设置为 UTF-8 打开 IDEA → File → Settings&#xff08;或 CtrlAltS&#xff09; 搜索 "Encoding" 设置 Project Encoding 和…

时序数据库概念及IoTDB特性详解

一、数据库管理系统概述 数据&#xff0c;如同空气般普遍存在于我们的数字生活中&#xff0c;每一次点击手机都可能产生并记录数据。这些数据被存储在数据库中&#xff0c;而数据库实质上是“数据的集合”。数据库管理系统&#xff08;DBMS&#xff09;则负责这些“数据容器”…

leetcode:263. 丑数(python3解法,数学相关算法题)

难度&#xff1a;简单 丑数 就是只包含质因数 2、3 和 5 的 正 整数。 给你一个整数 n &#xff0c;请你判断 n 是否为 丑数 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;n 6 输出&#xff1a;true 解释&am…

RK3568笔记八十五:LVGL播放AVI视频

若该文为原创文章,转载请注明原文出处。 最近有个需求,需要播放视频,但使用的框架是LVGL显示,所以了解了下LVGL怎么实现播放视频。 目前了解到的方法有两种: 一、使用ffmpeg方式,此方法适用于大部分视频 二、使用opencv方式,此方法适用于大部分视频 三、使用woshin…

stm32使用定时器PWM

1、定时器TIM PSC-Prescaler-预分频器 CNT-Counter-计数器 ARR-Auto Reload Register-自动重装寄存器 RCR-Repetition Counter Register-重复计数器 1、时钟来源:晶振提供频率,时钟树这些才提供时钟 分频系数 计数 3、实例 上面展示了假设使用外部石英晶振提供32.76…

2.3 Windows Vcpkg+MSVC编译FFmpeg 4.4.1

一、vcpkg安装ffmpeg 4.4.1 vcpkg的使用可以参考之前的文章&#xff1a;vcpkg 使用 1.1 查看vcpkg中的ffmpeg版本 查看库的版本&#xff1a;vcpkg.io 1.2 vcpkg.json文件解析 创建vcpkg.json文件&#xff1a; {"builtin-baseline": "984f9232b2fe0eb94f…

docker -v 之后docker cp报错

问题 我现在在本地已经可以正确运行这个文本纠错接口了&#xff0c;使用了-v 挂载&#xff0c;&#xff0c;当我使用docker cp时&#xff0c;报错了Error response from daemon: unlinkat /app/pycorrector/.git/objects/pack/pack-xxxxxx.pack: device or resource busy&…

10人团队SolidWorks云桌面服务器怎么连接

在当今数字化设计领域&#xff0c;SolidWorks作为主流的三维CAD软件&#xff0c;对硬件性能要求较高。 对于10人团队共享使用场景&#xff0c;云桌面服务器方案能有效解决硬件成本高、协作效率低等问题&#xff0c;这需从硬件选型、网络架构、云桌面平台部署、软件授权管理及用…

从源码角度了解Elasticsaerch(分布式协调排序、深分页问题)

引文 Elasticsearch基于Lucene所以很多系统实现都在其中,所以可以先看看Lucene的实现: https://blog.csdn.net/qq_35040959/article/details/147931034 项目组件 不像Kafka这种顶级项目核心性能组件全自己实现,ELK中有很多引用至第三方开放库; 网络模型-Netty 网络模型多重…

共读AI新圣经-深度学习读书笔记01

提示&#xff1a;本文是我参加datawhale活动的读书笔记&#xff0c;这是第一章的阅读笔记 文章目录 前言一、深度学习能做什么&#xff1f;二、教学案例总结 前言 随着大数据和算力的大幅提升&#xff0c;基于数据学习的解决方案正取代基于人工设计的解决方案 提示&#xff1a…

Android项目资源字符串内容多语言对齐工具 Python

Android项目资源字符串内容多语言对齐工具&#xff1a; #!/usr/bin/env python3import re from dataclasses import dataclass, field from typing import Optional, Dict, List from pathlib import Path import tkinter as tk from tkinter import filedialog, messageboxda…

创客匠人分享:知识变现时代的创始人 IP 打造路径

当知识付费市场规模突破千亿&#xff0c;创始人 IP 已成为知识变现的 “流量引擎”。创客匠人结合陈雷教授的实战经验&#xff0c;拆解创始人 IP 从 0 到 1 的打造路径&#xff0c;为内容创业者提供从流量引流到商业变现的全链路思路。 一、破局认知&#xff1a;IP 打造的核心…

【数据分析五:Feature Engineering】特征工程

一、特征工程定义 在数据预处理以后&#xff08;或者数据预处理过程中&#xff09;&#xff0c;如何从数据中提取有效的特征&#xff0c;使这些特征能够尽可能的表达原始数据中的信息&#xff0c;使得后续建立的数据模型能达到更好的效果&#xff0c;就是特征工程所要做的工作…

标杆确立!永洪科技位于IDC报告Data Analytics领域象限排头位!

近日&#xff0c;全球知名市场研究机构IDC发布的《数据管理分析与生成式AI发展趋势及最佳实践》报告&#xff0c;为正处于数字化转型深水区的企业描绘了清晰的技术演进蓝图。在这幅权威绘制的产业图谱中&#xff0c;“Data Analytics”&#xff08;数据分析&#xff09;作为连接…