• 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 
    #include 
    
    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    实现原理

    其实就是使用了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_DEBUG
                    std::cout << QString("\033[32m" + logData.strLog + "\033[0m").toLocal8Bit().constData() << std::endl;
    #endif
                    break;
                }
                case QtInfoMsg: // info
                {
                    m_messageType = "消息";
    #ifdef QT_DEBUG
                    std::cout << QString("\033[33m" + logData.strLog + "\033[0m").toLocal8Bit().constData() << std::endl;
    #endif
                    break;
                }
                case QtWarningMsg: // warn
                {
    #ifdef QT_DEBUG
                    std::cout << QString("\033[34m" + logData.strLog + "\033[0m").toLocal8Bit().constData() << std::endl;
    #endif
                    m_messageType = "警告";
                    break;
                }
                case QtCriticalMsg:  // error
                {
    #ifdef QT_DEBUG
                    std::cout << QString("\033[35m" + logData.strLog + "\033[0m").toLocal8Bit().constData() << std::endl;
    #endif
                    m_messageType = "严重";
                    break;
                }
                case QtFatalMsg:
                {
    //#ifdef QT_DEBUG
    //                std::cout << QString("\033[31m" + logData.strLog + "\033[0m").toLocal8Bit().constData() << std::endl;
    //#endif
                    m_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);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101

    总结

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

    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
  • 相关阅读:
    使用人工智能聊天机器人时要注意这些!(配提问技巧)
    centos8 php+nginx环境搭建
    300. 最长递增子序列
    【Netty专题】用Netty手写一个远程长连接通信框架
    验证回文串问题带你轻松学会
    非线性有限元:基本理论与算法及基于Python、Fortran程序实现与案例分析实践技术
    E2-AEN: End-to-End Incremental Learning with Adaptively Expandable Network
    磁盘、内存和硬盘的区别
    防御—IPsecVPN
    内核级流量治理引擎Kmesh八大新特性解读
  • 原文地址:https://blog.csdn.net/z609932088/article/details/134493978