Qt實(shí)現(xiàn)輸出日志到指定文件的操作方法
開(kāi)發(fā)平臺(tái) :
Qt Creator
語(yǔ)言:
C++
需求:
- 獲取日志信息,寫(xiě)入指定文件
- 日志7天后過(guò)期
- 保護(hù)寫(xiě)入日志進(jìn)程
前置操作:
1.在CMakeLists.txt中添加如下代碼
# 添加預(yù)處理,防止在release模式下,輸出的日志信息不顯示文件名,行號(hào)等信息 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(); //獲取日志存儲(chǔ)目錄路徑 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天后過(guò)期邏輯
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. 日志寫(xiě)入預(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)容寫(xiě)入文件
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言深入講解語(yǔ)句與選擇結(jié)構(gòu)的使用
這篇文章主要為大家介紹了C語(yǔ)言的語(yǔ)句與選擇結(jié)構(gòu),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
使用Objective-C獲取IPHONE手機(jī)IMSI序列號(hào)
這篇文章主要介紹了使用Objective-C獲取IPHONE手機(jī)IMSI序列號(hào)的方法以及通過(guò)IMSI序列號(hào)獲取運(yùn)營(yíng)商、手機(jī)號(hào)的方法,非常的實(shí)用,有需要的小伙伴可以參考下。2015-04-04
vscode實(shí)現(xiàn)本地代碼自動(dòng)同步到遠(yuǎn)程機(jī)器的步驟
這篇文章主要介紹了vscode實(shí)現(xiàn)本地代碼自動(dòng)同步到遠(yuǎn)程機(jī)器的步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
C語(yǔ)言中switch語(yǔ)句基本用法實(shí)例
switch的中文翻譯是開(kāi)關(guān),顧名思義,開(kāi)關(guān)的作用就是控制連通或者中斷,在C語(yǔ)言中switch語(yǔ)句的作用也是大同小異,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中switch語(yǔ)句基本用法的相關(guān)資料,需要的朋友可以參考下2022-07-07
C語(yǔ)言數(shù)組應(yīng)用實(shí)現(xiàn)三子棋游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)組應(yīng)用實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

