欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt實(shí)現(xiàn)輸出日志到指定文件的操作方法

 更新時(shí)間:2024年07月30日 10:31:03   作者:Uranus^  
這篇文章主要介紹了Qt實(shí)現(xiàn)輸出日志到指定文件的操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

開發(fā)平臺 :

Qt Creator

語言:

C++

需求:

  • 獲取日志信息,寫入指定文件
  • 日志7天后過期
  • 保護(hù)寫入日志進(jìn)程

前置操作:

1.在CMakeLists.txt中添加如下代碼

# 添加預(yù)處理,防止在release模式下,輸出的日志信息不顯示文件名,行號等信息
add_definitions(-DQT_MESSAGELOGCONTEXT)

2.創(chuàng)建LogManage.h 和 LogManage.cpp

具體代碼:

LogManage.h

#pragma once
#include <QApplication>
#include <QtDebug>
#include <QFile>
#include <QTextStream>
#include <qdatetime.h>
//初始化
void InitalizeLog();
//獲取日志存儲目錄路徑
QString getLogFilePath();
//日志處理
void LogMessageHandler(QtMsgType type,const QMessageLogContext &context, const QString &messages);

LogManage.cpp

#include "src/LogManage.h"
#include <qdir.h>
#include <QDateTime>
#include <QFileInfoList>
#include <qfileinfo.h>
#include <QMutex>
void InitalizeLog()
{
    //1. 預(yù)設(shè)日志目錄并檢查是否創(chuàng)建
    QString path = getLogFilePath();
    QDir dir(path);
    if(!dir.exists()){
        dir.mkdir(path);
    }
    //2. 日志7天后過期邏輯
    QDateTime last_time = QDateTime::currentDateTime().addDays(-7);
    QFileInfoList infoList = dir.entryInfoList();
    for(QFileInfo info : infoList){
        if(info.fileName() == "." || info.fileName() == ".."){
            continue;
        }
        if(last_time.secsTo(info.birthTime()) < 0){//secsTo: 差多少秒到
            info.dir().remove(info.fileName());
        }
    }
}
void LogMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message)
{
    //1. 加鎖,保護(hù)進(jìn)程
    static QMutex mutex;//互斥鎖 QMutex
    mutex.lock();
    //2. 日志信息生成及處理
    /*** 1.日志消息類型 ***/
    QString m_type("");
    switch (type) {
    case QtDebugMsg:
        m_type = QString("Debug");
        break;
    case QtInfoMsg:
        m_type = QString("Info");
        break;
    case QtWarningMsg:
        m_type = QString("Warning");
        break;
    case QtCriticalMsg:
        m_type = QString("Critical");
        break;
    case QtFatalMsg:
        m_type = QString("Fatal");
        break;
    }
    /*** 2.日志消息 ***/
    QByteArray m_message = message.toUtf8();
    /*** 3.日志生成日期 ***/
    QString m_date = QDateTime::currentDateTime().toString("yyyy-mm-dd hh:mm::ss");
    /*** 4.日志所在文件&行 ***/
    QString m_file = context.file;
    int m_line = context.line;
    QString m_log = QString("[%1]-<文件:%2    所在行:%3    日期:%4> ----------------- %5")
                        .arg(m_type).arg(m_file).arg(m_line).arg(m_date).arg(m_message);
    //3. 日志寫入預(yù)設(shè)文件
    QString m_filePath = getLogFilePath();
    QString m_fileName = QDate::currentDate().toString("yyyy-MM-dd");
    m_fileName += ".txt";
    m_fileName = m_filePath + "/" + m_fileName;
    m_fileName = QDir::toNativeSeparators(m_fileName);
    QFile file(m_fileName);
    file.open(QIODevice::ReadWrite | QIODevice::Append);
    QTextStream stream(&file);
    stream<< m_log << "\r\n";
    file.flush(); //直接將緩沖中的內(nèi)容寫入文件
    file.close();
    //4. 解鎖
    mutex.unlock();
}
QString getLogFilePath()
{
    QString str = qApp->applicationDirPath();
    str = str.left(str.lastIndexOf("/"));
    str += "/myLog";
    str = QDir::toNativeSeparators(str);//toNativeSeparators: 轉(zhuǎn)到本地分隔符
    return str;
}

main.cpp

int main(int argc, char *argv[])
{
//release模式下啟動(dòng)日志文件輸出
#ifdef QT_NO_DEBUG
    InitalizeLog();
    //自定義日志輸出
    qInstallMessageHandler(LogMessageHandler);
#endif
//other..
//other..
//other..
//other..
}

到此這篇關(guān)于Qt實(shí)現(xiàn)輸出日志到指定文件的文章就介紹到這了,更多相關(guān)Qt輸出日志到指定文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言深入講解語句與選擇結(jié)構(gòu)的使用

    C語言深入講解語句與選擇結(jié)構(gòu)的使用

    這篇文章主要為大家介紹了C語言的語句與選擇結(jié)構(gòu),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C++多線程編程和同步機(jī)制實(shí)例演示

    C++多線程編程和同步機(jī)制實(shí)例演示

    C++中的多線程編程和同步機(jī)制使得程序員可以利用計(jì)算機(jī)的多核心來提高程序的運(yùn)行效率和性能,本文將介紹多線程編程和同步機(jī)制的基本概念和使用方法
    2023-09-09
  • 使用Objective-C獲取IPHONE手機(jī)IMSI序列號

    使用Objective-C獲取IPHONE手機(jī)IMSI序列號

    這篇文章主要介紹了使用Objective-C獲取IPHONE手機(jī)IMSI序列號的方法以及通過IMSI序列號獲取運(yùn)營商、手機(jī)號的方法,非常的實(shí)用,有需要的小伙伴可以參考下。
    2015-04-04
  • C++實(shí)現(xiàn)簡單通訊錄

    C++實(shí)現(xiàn)簡單通訊錄

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++設(shè)計(jì)模式之命令模式

    C++設(shè)計(jì)模式之命令模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之命令模式,本文講解了什么是命令模式、命令模式的使用場合等內(nèi)容,并給出了一個(gè)代碼實(shí)例,需要的朋友可以參考下
    2014-10-10
  • C++選擇文件夾代碼的封裝

    C++選擇文件夾代碼的封裝

    這篇文章主要介紹了C++選擇文件夾代碼的封裝,實(shí)例展示了將選擇文件夾功能代碼封裝為一個(gè)類并對其進(jìn)行實(shí)例化調(diào)用的過程,對于學(xué)習(xí)C++程序設(shè)計(jì)有不錯(cuò)的參考價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C++獲取項(xiàng)目路徑的兩種方式詳解

    C++獲取項(xiàng)目路徑的兩種方式詳解

    這篇文章主要介紹了C++獲取項(xiàng)目路徑的兩種方式的相關(guān)資料,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • vscode實(shí)現(xiàn)本地代碼自動(dòng)同步到遠(yuǎn)程機(jī)器的步驟

    vscode實(shí)現(xiàn)本地代碼自動(dòng)同步到遠(yuǎn)程機(jī)器的步驟

    這篇文章主要介紹了vscode實(shí)現(xiàn)本地代碼自動(dòng)同步到遠(yuǎn)程機(jī)器的步驟,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • C語言中switch語句基本用法實(shí)例

    C語言中switch語句基本用法實(shí)例

    switch的中文翻譯是開關(guān),顧名思義,開關(guān)的作用就是控制連通或者中斷,在C語言中switch語句的作用也是大同小異,下面這篇文章主要給大家介紹了關(guān)于C語言中switch語句基本用法的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • C語言數(shù)組應(yīng)用實(shí)現(xiàn)三子棋游戲

    C語言數(shù)組應(yīng)用實(shí)現(xiàn)三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語言數(shù)組應(yīng)用實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論