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

news/2024/11/26 1:22:21/
头图

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

文章目录

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

关键字: 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

http://www.ppmy.cn/news/1228942.html

相关文章

这8个Wireshark使用技巧,一看就会!

今天就给你分享8个常用的Wireshark使用技巧&#xff0c;一看就会。如果是处理 HTTP&#xff0c;HTTPS 大家还是用还是用 Fiddler&#xff0c;但如果是其他协议比如 TCP&#xff0c;UDP&#xff0c;还是用wireshark。 今天给你准备了wireshark和Fiddler的安装包给你&#xff0c…

非遗拓鱼丨以传统文化助力守护美丽长江

长江生物多样性极为丰富&#xff0c;是中华民族赖以生存的生命之源&#xff0c;值得人类更多的关注与保护。为传播非遗文化、宣传长江生态保护&#xff0c;积极响应野生动物保护宣传的号召&#xff0c;以非遗手工助力守护长江&#xff0c;11月18日&#xff0c;在重庆市陆海国际…

JAXB:用XmlElement注解复杂类型的Java属性,来产生多层嵌套的xml元素

例如&#xff0c;下面这段请求的xml代码&#xff0c;在元素body下面又多了一层&#xff0c;嵌套了4个元素&#xff1a; <?xml version"1.0" encoding"UTF-8"?><request><reqtype>04</reqtype><secret>test</secret>…

数据资产入表,给企业带来的机遇和挑战

作为推动数字经济发展的核心要素&#xff0c;近年来&#xff0c;数据资源对于企业特别是相关数据企业的价值和作用正日益凸显。 数据资产入表之后&#xff0c;能够为企业经营带来实质性的收益。“随着数据资产的纳入&#xff0c;企业的资产也出现了新标的。在资产负债表中&…

milvus采坑一:启动服务就会挂掉

原因一 硬盘满了&#xff0c;Eric数据文件存储在硬盘上&#xff0c;当硬盘不足&#xff0c;它就会启动后就挂掉。 此时pymilvus连接一直是timeout。 解决方法&#xff1a;更换存储路径。

AIGC创作系统ChatGPT源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

wpf devexpress在未束缚模式中生成Tree

TreeListControl 可以在未束缚模式中没有数据源时操作&#xff0c;这个教程示范如何在没有数据源时创建tree 在XAML生成tree 创建ProjectObject类实现数据对象显示在TreeListControl: public class ProjectObject {public string Name { get; set; }public string Executor {…

2023初中生古诗文大会复赛12月2日举行,来做做全真在线模拟题吧

2023年11月19日日&#xff0c;上海市古诗文大会主办方通过官微发布了2023上海中学生古诗文大会&#xff08;初中组&#xff09;复选将于12月2日举行的通知&#xff0c;就初中生古诗文大会复赛&#xff08;复选&#xff09;的相关安排做了说明&#xff0c;六分成长已经为您把通知…