Qt實現(xiàn)輸出日志到指定文件的操作方法
更新時間:2024年07月30日 10:31:03 作者:Uranus^
這篇文章主要介紹了Qt實現(xiàn)輸出日志到指定文件的操作方法,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
開發(fā)平臺 :
Qt Creator
語言:
C++
需求:
- 獲取日志信息,寫入指定文件
- 日志7天后過期
- 保護寫入日志進程
前置操作:
1.在CMakeLists.txt中添加如下代碼
# 添加預處理,防止在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. 預設日志目錄并檢查是否創(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. 加鎖,保護進程
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. 日志寫入預設文件
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模式下啟動日志文件輸出
#ifdef QT_NO_DEBUG
InitalizeLog();
//自定義日志輸出
qInstallMessageHandler(LogMessageHandler);
#endif
//other..
//other..
//other..
//other..
}到此這篇關于Qt實現(xiàn)輸出日志到指定文件的文章就介紹到這了,更多相關Qt輸出日志到指定文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Objective-C獲取IPHONE手機IMSI序列號
這篇文章主要介紹了使用Objective-C獲取IPHONE手機IMSI序列號的方法以及通過IMSI序列號獲取運營商、手機號的方法,非常的實用,有需要的小伙伴可以參考下。2015-04-04
vscode實現(xiàn)本地代碼自動同步到遠程機器的步驟
這篇文章主要介紹了vscode實現(xiàn)本地代碼自動同步到遠程機器的步驟,本文分步驟給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06

