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)文章
使用Objective-C獲取IPHONE手機(jī)IMSI序列號
這篇文章主要介紹了使用Objective-C獲取IPHONE手機(jī)IMSI序列號的方法以及通過IMSI序列號獲取運(yùn)營商、手機(jī)號的方法,非常的實(shí)用,有需要的小伙伴可以參考下。2015-04-04vscode實(shí)現(xiàn)本地代碼自動(dòng)同步到遠(yuǎn)程機(jī)器的步驟
這篇文章主要介紹了vscode實(shí)現(xiàn)本地代碼自動(dòng)同步到遠(yuǎn)程機(jī)器的步驟,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06C語言數(shù)組應(yīng)用實(shí)現(xiàn)三子棋游戲
這篇文章主要為大家詳細(xì)介紹了C語言數(shù)組應(yīng)用實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06