本篇內容主要講解“Qt日志重定向輸出類怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Qt日志重定向輸出類怎么使用”吧!
成都創(chuàng)新互聯(lián)專注骨干網(wǎng)絡服務器租用十載,服務更有保障!服務器租用,成都移動機房 成都服務器租用,成都服務器托管,骨干網(wǎng)絡帶寬,享受低延遲,高速訪問。靈活、實現(xiàn)低成本的共享或公網(wǎng)數(shù)據(jù)中心高速帶寬的專屬高性能服務器。
用qt開發(fā)商業(yè)程序已經(jīng)十年了,陸陸續(xù)續(xù)開發(fā)過至少幾十個程序,除了一些算不算項目的小工具外,大部分的程序都需要有個日志的輸出功能,希望可以將程序的運行狀態(tài)存儲到文本文件或者數(shù)據(jù)庫或者做其他處理等,qt對這個日志輸出也做了很好的封裝,在Qt4是qInstallMsgHandler,Qt5里邊是qInstallMessageHandler,有了這個神器,只要在你的項目中所有qdebug qinfo等輸出的日志信息,都會重定向接收到,網(wǎng)上大部分人寫的demo都是接收到輸出打印日志存儲到文本文件,其實這就帶給很多人誤解,容易產(chǎn)生以為日志只能輸出到文本文件,其實安裝了日志鉤子以后,拿到了所有調試打印信息,你完全可以用來存儲到數(shù)據(jù)庫+html有顏色區(qū)分格式的文件+網(wǎng)絡轉發(fā)輸出(尤其適用于嵌入式linux無界面程序,現(xiàn)場不方便外接調試打印的設備)。 做過的這么多項目中,Qt4和Qt5的都有,我一般保留四個版本,4.8.7,為了兼容qt4, 5.7.0,最后的支持XP的版本, 最新的長期支持版本5.9.7 最高的新版本5.12。毫無疑問,我要封裝的這個日志類,也要支持4+5的,而且提供友好的接口。
主要功能:
支持動態(tài)啟動和停止。
支持日志存儲的目錄。
支持網(wǎng)絡發(fā)出打印日志。
支持Qt4+Qt5,開箱即用。
支持多線程。
使用做到最簡單,start即可。
//日志重定向 #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) void Log(QtMsgType type, const char *msg) #else void Log(QtMsgType type, const QMessageLogContext &, const QString &msg) #endif { //加鎖,防止多線程中qdebug太頻繁導致崩潰 QMutex mutex; QMutexLocker locker(&mutex); QString content; //這里可以根據(jù)不同的類型加上不同的頭部用于區(qū)分 switch (type) { case QtDebugMsg: content = QString("%1").arg(msg); break; case QtWarningMsg: content = QString("%1").arg(msg); break; case QtCriticalMsg: content = QString("%1").arg(msg); break; case QtFatalMsg: content = QString("%1").arg(msg); break; } SaveLog::Instance()->save(content); } QScopedPointer<SaveLog> SaveLog::self; SaveLog *SaveLog::Instance() { if (self.isNull()) { static QMutex mutex; QMutexLocker locker(&mutex); if (self.isNull()) { self.reset(new SaveLog); } } return self.data(); } SaveLog::SaveLog(QObject *parent) : QObject(parent) { //必須用信號槽形式,不然提示 QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread //估計日志鉤子可能單獨開了線程 connect(this, SIGNAL(send(QString)), SendLog::Instance(), SLOT(send(QString))); file = new QFile(this); toNet = false; //默認取應用程序根目錄 path = qApp->applicationDirPath(); //默認取應用程序可執(zhí)行文件名稱 QString str = qApp->applicationFilePath(); QStringList list = str.split("/"); name = list.at(list.count() - 1).split(".").at(0); fileName = ""; } SaveLog::~SaveLog() { file->close(); } //安裝日志鉤子,輸出調試信息到文件,便于調試 void SaveLog::start() { #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) qInstallMsgHandler(Log); #else qInstallMessageHandler(Log); #endif } //卸載日志鉤子 void SaveLog::stop() { #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) qInstallMsgHandler(0); #else qInstallMessageHandler(0); #endif } void SaveLog::save(const QString &content) { //如果重定向輸出到網(wǎng)絡則通過網(wǎng)絡發(fā)出去,否則輸出到日志文件 if (toNet) { emit send(content); } else { //方法改進:之前每次輸出日志都打開文件,改成只有當日期改變時才新建和打開文件 QString fileName = QString("%1/%2_log_%3.txt").arg(path).arg(name).arg(QDATE); if (this->fileName != fileName) { this->fileName = fileName; if (file->isOpen()) { file->close(); } file->setFileName(fileName); file->open(QIODevice::WriteOnly | QIODevice::Append | QFile::Text); } QTextStream logStream(file); logStream << content << "n"; } }
到此,相信大家對“Qt日志重定向輸出類怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!
分享名稱:Qt日志重定向輸出類怎么使用
文章位置:http://bm7419.com/article8/gociop.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計公司、做網(wǎng)站、云服務器、軟件開發(fā)、App開發(fā)、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)