最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt5實現(xiàn)qDebug日志信息寫入日志文件過程

 更新時間:2022年05月09日 15:16:38   作者:xiaoyaoyou.xyz  
這篇文章主要為大家介紹了Qt5實現(xiàn)qDebug日志信息寫入日志文件的過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1、思路

其實Qt提供了將日志寫入文件的方式,是以接口的形式提供的,我們只需要按照我們的需求完成回調(diào)函數(shù)和我們自己的接口即可。

為方便調(diào)用,我們一般直接寫到log.h中即可。

  • 1、創(chuàng)建log.h
  • 2、根據(jù)我們自己的需求完成回調(diào)函數(shù)
  • 3、根據(jù)需求封裝外部調(diào)用函數(shù)并注冊回調(diào)函數(shù)

2、代碼

我這里按照我的需求,當(dāng)接口傳遞日志文件名和等級時使用傳遞的文件存儲日志,否則以精確到當(dāng)前時間為文件名創(chuàng)建日志文件。

提供給外部的調(diào)用函數(shù)包含日志文件名和日志等級兩個接口,可以不傳遞,直接使用默認(rèn)值。

Log.h

#ifndef LOG_H#define LOG_H#include <QFile>#include <QTextStream>#include <QDateTime>#include <QMutex>//選擇屏幕打印還是輸出到文件可以根據(jù)這個宏控制或者控制函數(shù)調(diào)用位置都可以//#define _DEBUG//默認(rèn)調(diào)試級別為warning,即小于warning級別的都不會寫入日志文件//只有release版本的時候,才會輸出到日志,debug版本正常輸出到終端。namespace QT_LOG{<!--{C}%3C!%2D%2D%20%2D%2D%3E--> //默認(rèn)文件名為當(dāng)前時間命名的log文件 static int m_LogLevel = 1; static QString m_LogFile = QString("%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmss")); QMutex m_LogMutex; void customMessageHandler(QtMsgType type , const QMessageLogContext &context , const QString &msg) {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> //設(shè)置輸出日志級別,小于該級別,將不會寫入日志文件,默認(rèn)是warning級別,即debug信息不會寫入日志文件 if (type < m_LogLevel) {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> return; } QString log_info; switch (type) {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> case QtDebugMsg: log_info = QString("%1[Debug]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); break; case QtWarningMsg: log_info = QString("%1[Warning]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); break; case QtCriticalMsg: log_info = QString("%1[Critical]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); break; case QtFatalMsg: log_info = QString("%1[Fatal]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); abort(); case QtInfoMsg: log_info = QString("%1[Info]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); break; } log_info += QString(context.file) + QString(context.line) + QString("%1").arg(msg); //為了線程安全 m_LogMutex.lock(); QFile outFile(m_LogFile); outFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text); QTextStream ts(&outFile); ts << log_info << endl; outFile.close(); m_LogMutex.unlock(); } //默認(rèn)調(diào)試級別為warning及以上才會寫入日志文件,默認(rèn)log文件名為程序啟動時間命名的log文件 void logInit(QString logFile = "", int logLevel = 1) {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> #ifndef _DEBUG //實現(xiàn)debug版本的時候,輸出到終端;release版本的時候輸出到日志文件 if ((logLevel < 0) || (logLevel > 3)) {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> m_LogLevel = 1; } else {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> m_LogLevel = logLevel; } if (!logFile.isEmpty()) {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> m_LogFile = logFile; } qInstallMessageHandler(customMessageHandler); #endif }}#endif // LOG_H#ifndef LOG_H
#define LOG_H
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QMutex>
//選擇屏幕打印還是輸出到文件可以根據(jù)這個宏控制或者控制函數(shù)調(diào)用位置都可以
//#define _DEBUG
//默認(rèn)調(diào)試級別為warning,即小于warning級別的都不會寫入日志文件
//只有release版本的時候,才會輸出到日志,debug版本正常輸出到終端。
namespace QT_LOG
{
    //默認(rèn)文件名為當(dāng)前時間命名的log文件
    static int m_LogLevel = 1;
    static QString m_LogFile = QString("%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmss"));
    QMutex m_LogMutex;
    void customMessageHandler(QtMsgType type , const QMessageLogContext &context , const QString &msg)
    {
        //設(shè)置輸出日志級別,小于該級別,將不會寫入日志文件,默認(rèn)是warning級別,即debug信息不會寫入日志文件
        if (type < m_LogLevel)
        {
            return;
        }
        QString log_info;
        switch (type)
        {
        case QtDebugMsg:
            log_info = QString("%1[Debug]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
            break;
        case QtWarningMsg:
            log_info = QString("%1[Warning]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
            break;
        case QtCriticalMsg:
            log_info = QString("%1[Critical]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
            break;
        case QtFatalMsg:
            log_info = QString("%1[Fatal]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
            abort();
        case QtInfoMsg:
            log_info = QString("%1[Info]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
            break;
        }
        log_info += QString(context.file) + QString(context.line) + QString("%1").arg(msg);
        //為了線程安全
        m_LogMutex.lock();
        QFile outFile(m_LogFile);
        outFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text);
        QTextStream ts(&outFile);
        ts << log_info << endl;
        outFile.close();
        m_LogMutex.unlock();
    }
    //默認(rèn)調(diào)試級別為warning及以上才會寫入日志文件,默認(rèn)log文件名為程序啟動時間命名的log文件
    void logInit(QString logFile = "", int logLevel = 1)
    {
        #ifndef _DEBUG  //實現(xiàn)debug版本的時候,輸出到終端;release版本的時候輸出到日志文件
            if ((logLevel < 0) || (logLevel > 3))
            {
                m_LogLevel = 1;
            }
            else
            {
                m_LogLevel = logLevel;
            }
            if (!logFile.isEmpty())
            {
                m_LogFile = logFile;
            }
            qInstallMessageHandler(customMessageHandler);
        #endif
    }
}
#endif // LOG_H

調(diào)用,包含頭文件后直接調(diào)用參數(shù)即可:

QT_LOG::logInit();//或者QT_LOG::logInit("log.txt", 2);QT_LOG::logInit();
//或者
QT_LOG::logInit("log.txt", 2);

3、問題

可能不通Qt版本提供的回調(diào)函數(shù)有差異,我們通過qInstallMessageHandler進(jìn)行源碼查看,看下回調(diào)函數(shù)的樣式,實現(xiàn)對應(yīng)的回調(diào)函數(shù)進(jìn)行測試即可:

在這里插入圖片描述

4、結(jié)果與擴(kuò)展思路

這個是我使用我上面封裝的函數(shù)后生成的日志文件,每一次啟動創(chuàng)建一個,暫時沒有考慮定時分割創(chuàng)建新文件等問題,如果有需求可以調(diào)整回調(diào)函數(shù)進(jìn)行調(diào)試:

在這里插入圖片描述

針對上面的日志我們還可以加一些定時任務(wù)或者直接通過內(nèi)存數(shù)據(jù)庫通過線程安全的方式直接存儲到數(shù)據(jù)庫中,這樣便于分布式存儲和分析操作日志。

以上就是Qt5實現(xiàn)qDebug日志信息寫入日志文件的詳細(xì)內(nèi)容,更多關(guān)于Qt5 qDebug日志信息寫入文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用C++創(chuàng)建多個IPC機(jī)制的上層接口

    使用C++創(chuàng)建多個IPC機(jī)制的上層接口

    設(shè)計一個上層的IPC接口,這個接口將在未來封裝底層的通信機(jī)制,這樣的設(shè)計要求接口足夠抽象,以便于底層實現(xiàn)的細(xì)節(jié)對上層用戶透明,本文給大家介紹了如何使用C++創(chuàng)建多個IPC機(jī)制的上層接口,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • C語言實現(xiàn)職工管理系統(tǒng)

    C語言實現(xiàn)職工管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)職工管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程

    Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程

    這篇文章主要介紹了Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • C語言數(shù)組元素循環(huán)右移問題及解決方法

    C語言數(shù)組元素循環(huán)右移問題及解決方法

    這篇文章主要介紹了C語言數(shù)組元素循環(huán)右移問題,本文通過多種方法給大家分享解決方案,通過實例代碼講解,對大家的工作或?qū)W習(xí)具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Qt實現(xiàn)模糊匹配功能的實例詳解

    Qt實現(xiàn)模糊匹配功能的實例詳解

    對于瀏覽器的使用,我想大家一定不會陌生吧,輸入要搜索的內(nèi)容時,會出現(xiàn)相應(yīng)的匹配信息。本文就來用Qt實現(xiàn)模糊匹配功能,感興趣的可以了解一下
    2022-10-10
  • 基于C語言實現(xiàn)的aes256加密算法示例

    基于C語言實現(xiàn)的aes256加密算法示例

    這篇文章主要介紹了基于C語言實現(xiàn)的aes256加密算法,結(jié)合具體實例形式詳細(xì)分析了C語言實現(xiàn)的aes256加密算法實現(xiàn)步驟與使用技巧,需要的朋友可以參考下
    2017-02-02
  • Pipes實現(xiàn)LeetCode(195.第十行)

    Pipes實現(xiàn)LeetCode(195.第十行)

    這篇文章主要介紹了Pipes實現(xiàn)LeetCode(195.第十行),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言基礎(chǔ) 原碼、反碼、補(bǔ)碼和移碼詳解

    C語言基礎(chǔ) 原碼、反碼、補(bǔ)碼和移碼詳解

    這篇文章主要介紹了C語言基礎(chǔ) 原碼、反碼、補(bǔ)碼和移碼詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C++實用庫之字節(jié)流合成器

    C++實用庫之字節(jié)流合成器

    在處理跨平臺的數(shù)據(jù)交換或網(wǎng)絡(luò)通信時,字節(jié)流的重要性更加突出,不同的系統(tǒng)可能有不同的字節(jié)序(大端序或小端序),因此在發(fā)送和接收字節(jié)流時,可能需要考慮字節(jié)序的轉(zhuǎn)換,這篇文章主要介紹了C++實用庫之字節(jié)流合成器,需要的朋友可以參考下
    2024-04-04
  • C語言rewind與fseek函數(shù)之隨機(jī)讀寫文件的用法詳解

    C語言rewind與fseek函數(shù)之隨機(jī)讀寫文件的用法詳解

    這篇文章主要介紹了C語言rewind與fseek函數(shù)之隨機(jī)讀寫文件的用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評論

曲水县| 元氏县| 昭苏县| 黔西县| 巴南区| 盘山县| 格尔木市| 高淳县| 从化市| 双峰县| 祥云县| 嘉黎县| 蓝山县| 澄江县| 宁国市| 丰台区| 视频| 昂仁县| 南漳县| 西昌市| 当雄县| 呼玛县| 江都市| 多伦县| 瓮安县| 吉隆县| 双鸭山市| 山丹县| 东兰县| 鹿泉市| 漳浦县| 勃利县| 乡宁县| 新和县| 得荣县| 湾仔区| 墨竹工卡县| 民和| 东乡县| 汝城县| 乌兰浩特市|