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

055-第三代软件开发-控制台输出彩虹日志

头图

第三代软件开发-控制台输出彩虹日志

文章目录

  • 第三代软件开发-控制台输出彩虹日志
    • 项目介绍
    • 控制台输出彩虹日志
      • 实现原理
      • 真实代码
    • 总结

关键字: QtQml关键字3关键字4关键字5

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!

重要说明☝

☀该专栏在第三代软开发更新完将涨价

控制台输出彩虹日志

真实截图,这里因为没有警告,致命错误,所以颜色有点单一。

image-20230804221317407

为啥有搞这花里胡哨的内容了,其实是为了调试方便,看了我前面日志系统的小伙伴可能有影响,我日志的实现实际就是劫持了Qt的控制台输出了,而开发到后期,有大量的日志已经记录到里面了,如果都是一个颜色的话,那真是不好区分。最一开始调试的时候其实是按照Debug和Release来区分的,就是如果是Debug模式运行,就在控制台输出,如果是Release运行,就存储到我们的日志数据库中。到了现在,那一启动,用户信息、系统运行信息、调试信息,真的是眼花缭乱,在中间过程的时候,还可以使用--------------------------------------------------,或者 AAAAAAAAAAAAAAAAAAAAAAA等做风格,但是多了真的就不好搞了,所以决定搞彩虹日志,这样就可以,比如绿色就是用户信息,黄色就是系统信息,我们的调试信息可以是蓝色,或者其他颜色。

这里我们可以先看一个Demo

#include <QtCore>
#include <iostream>void printRainbowLog(const QString& message)
{QStringList rainbowColors = {"\033[91m", "\033[93m", "\033[92m", "\033[96m", "\033[94m", "\033[95m"};static int index = 0;std::cout << rainbowColors.at(index).toStdString() << message.toStdString() << "\033[0m" << std::endl;// 轮换彩虹颜色index = (index + 1) % rainbowColors.size();
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);printRainbowLog("红色日志");printRainbowLog("黄色日志");printRainbowLog("绿色日志");printRainbowLog("青色日志");printRainbowLog("蓝色日志");printRainbowLog("紫色日志");return a.exec();
}

实现原理

其实就是使用了ANSI转义码来实现彩虹颜色的效果。具体来说,我们使用了不同的转义码来设置输出文本的颜色。例如,\033[91m表示设置颜色为红色,\033[93m表示设置颜色为黄色,依此类推。然后,我们将这些带有转义码的颜色字符串与要输出的日志信息拼接在一起,并通过std::cout控制台输出流输出。

请注意,控制台是否支持和如何支持ANSI转义码取决于你所使用的终端或控制台。上面的示例可能在一些运行环境中不能正常显示彩虹颜色。

真实代码

下面是我业务中的真实代码,其实我是把这个做了裁剪的了。重点就是switch里面的Case分支语句,在Debug模式下通过srd::cout输出到控制台。

/*** @brief XXXX::saveLogData 日志数据库线程*/
void XXXX::saveLogData()
{// 开启事务模式m_logDB->beginTransaction();while (true){if(!m_queueLogData.isEmpty()){m_mutex.lock();LogData logData = m_queueLogData.dequeue();QtMsgType type = logData.msgType;m_listLog = logData.strLog.split("$");m_mutex.unlock();switch(type){default:break;case QtDebugMsg: //log debug{m_messageType = "输出";
#ifdef QT_DEBUGstd::cout << QString("\033[32m" + logData.strLog + "\033[0m").toLocal8Bit().constData() << std::endl;
#endifbreak;}case QtInfoMsg: // info{m_messageType = "消息";
#ifdef QT_DEBUGstd::cout << QString("\033[33m" + logData.strLog + "\033[0m").toLocal8Bit().constData() << std::endl;
#endifbreak;}case QtWarningMsg: // warn{
#ifdef QT_DEBUGstd::cout << QString("\033[34m" + logData.strLog + "\033[0m").toLocal8Bit().constData() << std::endl;
#endifm_messageType = "警告";break;}case QtCriticalMsg:  // error{
#ifdef QT_DEBUGstd::cout << QString("\033[35m" + logData.strLog + "\033[0m").toLocal8Bit().constData() << std::endl;
#endifm_messageType = "严重";break;}case QtFatalMsg:{
//#ifdef QT_DEBUG
//                std::cout << QString("\033[31m" + logData.strLog + "\033[0m").toLocal8Bit().constData() << std::endl;
//#endifm_messageType = "致命";break;}}if(m_listLog.count() < 8){continue;}m_logData.m_timeStamp = m_listLog.at(1);m_logData.m_messageType = m_messageType;m_logData.m_Infor = m_listLog.at(3);m_logData.m_Infor = m_logData.m_Infor.replace(QRegularExpression("\n", QRegularExpression::CaseInsensitiveOption),"  ");m_logData.m_fileName = m_listLog.at(4);m_logData.m_functionName = m_listLog.at(5);m_logData.m_CurrentLine = m_listLog.at(6);m_logData.m_ThreadID = m_listLog.at(7);m_mutexTimer.lock();m_dbState = m_logDB->insert(m_logData);m_insterNumber++;if(m_insterNumber%10000 == 0){m_logDB->commitTransaction();m_insterNumber = 0;}m_mutexTimer.unlock();}else{// 日志线程退出,将缓存数据全部读出if(!m_logThread){closeDB();emit signalExitThread();break;}// 缓存读空时,线程休眠,节约性能,等待下一次数据读取QThread::msleep(10);}}
}

总结

今天的这个说难不难,所简单也不简单,代码很简单,但是知道很难。其实我觉得,任何带我开世界的人,都应该被感恩,小时候,父母带我们看精彩世界,上学时,老师给我们讲解世界的繁华,工作中,同时给我们的新世界等等,所以能接触到彩虹日志,也要感谢一个人。

image-20230804222819727

关于彩虹日志的文章:

https://jaredtao.github.io/2019/04/29/%E7%8E%A9%E8%BD%ACQt(1)-%E8%BE%93%E5%87%BA%E5%BD%A9%E8%89%B2log/,这里我只是说使用了其中的一丢丢,详细的可以看涛哥的博客,写的非常详细。


博客签名2021

相关文章:

055-第三代软件开发-控制台输出彩虹日志

第三代软件开发-控制台输出彩虹日志 文章目录 第三代软件开发-控制台输出彩虹日志项目介绍控制台输出彩虹日志实现原理真实代码 总结 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QM…...

Os-hackNos-3

Os-hackNos-3 一、主机发现和端口扫描 主机发现&#xff0c;靶机地址192.168.80.145 arp-scan -l端口扫描&#xff0c;开放了22和80端口 nmap -P -sV 192.168.80.145二、信息收集 访问80端口 find the Bug You need extra WebSec翻译 找到Bug 你需要额外的网络安全路径扫描 d…...

时序预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的时间序列预测

时序预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的时间序列预测 目录 时序预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现HPO-ELM猎食者算法优化极限学习机时间序列预测 1.data为数据集…...

LeetCode:307. 区域和检索 - 数组可修改(树状数组 C++)

目录 307. 区域和检索 - 数组可修改 题目描述&#xff1a; 实现代码与解析&#xff1a; 树状数组&#xff1a; 原理思路&#xff1a; 307. 区域和检索 - 数组可修改 题目描述&#xff1a; 给你一个数组 nums &#xff0c;请你完成两类查询。 其中一类查询要求 更新 数组…...

909-2015-T3

文章目录 1.原题2.算法思想2.1.求树的高度2.2.求路径 3.关键代码4.完整代码5.输出结果 1.原题 试编写算法&#xff0c;求给定二叉树上从根节点到叶子节点的一条路径长度等于树的深度减一的路径&#xff08;即列出从根节点到该叶子节点的节点序列&#xff09;&#xff0c;若这样…...

【云原生】初识 Service Mesh

目录 一、什么是Service Mesh 二、微服务发展历程 2.1 微服务架构演进历史 2.1.1 单体架构 2.1.2 SOA阶段 2.1.3 微服务阶段 2.2 微服务治理中的问题 2.2.1 技术栈庞杂 2.2.2 版本升级碎片化 2.2.3 侵入性强 2.2.4 中间件多&#xff0c;学习成本高 2.2.5 服务治理功…...

常见的8个JMeter压测问题

为什么在JMeter中执行压力测试时&#xff0c;出现连接异常或连接重置错误&#xff1f; 答案&#xff1a;连接异常或连接重置错误通常是由于服务器在处理请求时出现问题引起的。这可能是由于服务器过载、网络故障或配置错误等原因导致的。 解决方法&#xff1a; 确定服务器的…...

深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序 计算机竞赛

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…...

羊大师教你如何有效解决工作中的挑战与压力?

在现代社会&#xff0c;工作问题一直是许多人头疼的难题。无论是从工作压力到职业发展&#xff0c;工作问题不仅会影响个人的心理健康&#xff0c;还可能对整个工作团队的效率和和谐产生负面影响。因此&#xff0c;如何有效解决工作问题成为了每个职场人士都需要面对的挑战。 …...

【性能测试】稳定性/并发压力测试的TPS计算+5W并发场景设计...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、稳定性测试TPS…...

人工智能的时代---AI的影响

人工智能&#xff08;AI&#xff09;是当前科技领域的一个热门话题&#xff0c;它正在以前所未有的速度改变着我们的生活方式和工作方式。从智能家居到自动驾驶&#xff0c;从智能医疗到智能金融&#xff0c;人工智能正在渗透到我们生活的方方面面。在这篇文章中&#xff0c;我…...

LeetCode 每日一题 2023/11/13-2023/11/19

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 11/13 307. 区域和检索 - 数组可修改11/14 1334. 阈值距离内邻居最少的城市11/15 2656. K 个元素的最大和11/16 2760. 最长奇偶子数组11/17 2736. 最大和查询11/18 2342. 数…...

Leetcode——169 多数元素

我的答案 class Solution {public int majorityElement(int[] nums) {int len nums.length;Arrays.sort(nums);int count 1;int res 0;if(len 1){return nums[0];}for(int i0; i<len-1; i){if(nums[i]nums[i1]){count;}else{count 1;}if(count>len/2){res nums[i]…...

vue中原生H5拖拽排序_拖拽图片也是同样的道理

原文地址【vue中原生H5拖拽排序_拖拽图片也是同样的道理】 H5有基于拖拽的事件机制&#xff0c;如果你还不熟悉&#xff0c;请看我之前的文章【拖拽上传】中有介绍。 原生拖拽API实现 由于比较简单直接上代码了&#xff1a; <!DOCTYPE html> <html lang"en&qu…...

【C语言】计算实时太阳角度(高度角、方位角),以及使用stm32单片机实时获取时间戳

整体计算方法 在编写该代码的过程中寻找了多篇博文和论文&#xff0c;综合所有文章且按网上的以0时的方位角的0&#xff0c;且随时间累加累加至360度。我修改了博文和论文的一些角度的计算方法。得到一下代码与网站计算的方位角相互验证过&#xff0c;误差不超过1 验证网站 太…...

创建git仓库

①git init&#xff1a;用于在一个现有的目录中初始化一个新的 Git 仓库。 # 进入你的项目目录&#xff0c;如果你想要在当前目录下初始化 Git 仓库。 git init 这会在当前目录下创建一个名为 .git 的子目录&#xff0c;其中包含 Git 仓库的所有必要文件和目录。&#xff08;…...

19.悲观锁与乐观锁解析

1.悲观锁 悲观锁比较悲观&#xff0c;它认为如果不锁住这个资源&#xff0c;别的线程就会来争抢&#xff0c;就会造成数据结果错误&#xff0c;所以悲观锁为了确保结果的正确性&#xff0c;会在每次获取并修改数据时&#xff0c;都把数据锁住&#xff0c;让其他线程无法访问该…...

C语言--给出一个点的坐标判断它在单位圆的内部外部还是上面

一.题目描述 给出一个点的坐标判断它在单位圆的内部外部还是上面 例如输入1&#xff0c;0&#xff0c;输出在圆上 二.思路分析 首先&#xff0c;单位圆是以坐标系原点为圆心、半径为1的圆。 给定一个点坐标 (x,y)&#xff0c;我们可以使用勾股定理计算该点到坐标系原点的距…...

变频器基础问答集21-50

21&#xff0e;请问电机软起动器是否能节能?软启动节能效果有限&#xff0c;但可以减少启动对电网的冲击&#xff0c;也可以实现平滑启动&#xff0c;保护电机机组。 根据能量守恒理论,由于加入了相对复杂的控制电路,软启动不但不节能,还会加大能量的消耗,但它可以减小电路的启…...

OpenCvSharp从入门到实践-(01)认识OpenCvSharp开发环境搭建

目录 一、OpenCV 二、OpenCvSharp 三、OpenCvSharp开发环境搭建 四、下载 五、其他 一、OpenCV OpenCV是基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习函数库&#xff0c;支持Windows、Linux、Android和Mac OS操作系统。OpenCV由一系…...

独立开发者如何利用Taotoken模型广场为小项目挑选合适模型

独立开发者如何利用Taotoken模型广场为小项目挑选合适模型 1. 模型选择面临的挑战 独立开发者在启动小型AI项目时&#xff0c;往往面临模型选择的困境。主流大模型厂商提供的选项众多&#xff0c;每个模型在性能、价格和适用场景上各有特点。传统方式需要开发者逐个查阅不同厂…...

Docker容器化金融核心系统:3类高频故障(交易超时/证书吊销/审计断点)的秒级定位与修复手册

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Docker容器化金融核心系统的合规性基石与架构约束 金融行业对系统稳定性、数据隔离性与审计可追溯性有严苛要求&#xff0c;Docker 容器化部署必须在满足《GB/T 35273—2020 信息安全技术 个人信息安全…...

基于双Transformer的网球轨迹预测系统设计与实现

1. 轨迹预测技术概述轨迹预测作为计算机视觉与运动分析领域的核心技术&#xff0c;在航空航天、智能交通和体育竞技等多个领域具有广泛应用价值。传统方法主要依赖复杂的物理建模或大量标注数据&#xff0c;不仅计算效率低下&#xff0c;还面临硬件成本高昂的挑战。以网球运动为…...

区域知识产权信息管理:创新监管,智慧服务

为赋能区域知识产权管理&#xff0c;助力区域科技创新和经济发展&#xff0c;“普陀区知识产权信息服务平台”上线运行。平台整合“区域实时监控统计”“知识产权信息统计”“园区知识产权代管”“企业排行榜”“专利检索”“商标检索”六大核心功能模块&#xff0c;覆盖政务决…...

微信聊天记录数据主权实践:WeChatMsg本地导出工具技术解析

微信聊天记录数据主权实践&#xff1a;WeChatMsg本地导出工具技术解析 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

Docker 学习篇(一)| 认识 Docker

Docker 学习篇&#xff08;一&#xff09;| 认识 Docker1. 什么是 Docker2. Windows 上装软件的痛3. Docker 怎么解决的4. 三核心&#xff1a;仓库、镜像、容器5. 三个动作&#xff0c;没有"安装"6. Docker 解决了传统部署的三大痛点痛点一&#xff1a;环境冲突 ——…...

AUTOSAR DEM实战:手把手教你理解DTC状态位与故障事件映射(含代码示例)

AUTOSAR DEM深度解析&#xff1a;DTC状态位与故障事件映射的工程实践 在汽车电子系统开发中&#xff0c;诊断功能的设计与实现一直是工程师面临的核心挑战之一。AUTOSAR标准中的诊断事件管理&#xff08;DEM&#xff09;模块作为连接底层故障检测与上层诊断服务的桥梁&#xff…...

Elastic 9.4 发布:多维度增强能力,为各领域带来显著性能提升与成本优化!

Elastic 9.4 正式发布近日&#xff0c;Elastic 9.4 正式发布&#xff0c;它是 Elasticsearch Platform 的最新版本。除具备帮助开发者进行上下文工程、应用与基础设施监控以及 AI 驱动的安全运营的新功能外&#xff0c;还在 Elastic Search & AI、Elastic Observability 和…...

新手福音:借快马平台动手实现第一个oh-my-codex,轻松入门代码管理

作为一个刚接触编程的新手&#xff0c;我最近被各种代码片段搞得晕头转向。朋友推荐我了解下oh-my-codex这类工具&#xff0c;但看文档总觉得云里雾里。直到尝试用InsCode(快马)平台动手实践&#xff0c;才发现原来理解代码管理可以这么直观。下面记录我的实现过程&#xff0c;…...

Docker Cheat Sheet:开发环境Docker配置最佳实践

Docker Cheat Sheet&#xff1a;开发环境Docker配置最佳实践 【免费下载链接】docker-cheat-sheet Docker Cheat Sheet 项目地址: https://gitcode.com/gh_mirrors/do/docker-cheat-sheet Docker Cheat Sheet 是一份全面的 Docker 开发环境配置指南&#xff0c;帮助开发…...