
{"id":344,"date":"2022-12-15","slug":"344","link":"http:\/\/to3.top\/wordpress\/344","title":{"rendered":""},"content":{"rendered":"<p>Qt \u81ea\u5b9a\u4e49\u65e5\u5fd7\u5de5\u5177<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; Qt<\/p>\n<p>![\u6548\u679c\u56fe]<img decoding=\"async\" src=\"\/wp-content\/uploads\/image\/20221215\/1671062540167424.png\" title=\"1671062540167424.png\" alt=\"20200514112241348[1].png\"\/><\/p>\n<p>C++ \u4e2d\u6bd4\u8f83\u4e0d\u9519\u7684\u65e5\u5fd7\u5de5\u5177\u6709 log4cxx\uff0clog4qt \u7b49\uff0c\u4f46\u662f\u5b83\u4eec\u90fd\u4e0d\u80fd\u548c qDebug(), qInfo() \u7b49\u6709\u673a\u7684\u7ed3\u5408\u5728\u4e00\u8d77\uff0c\u6240\u4ee5\u5728 Qt \u4e2d\u4f7f\u7528\u603b\u89c9\u5f97\u4e0d\u591f\u8212\u670d\uff0c\u611f\u8c22 Qt \u63d0\u4f9b\u4e86 qInstallMessageHandler() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f7f\u7528\u8fd9\u4e2a\u51fd\u6570\u53ef\u4ee5\u5b89\u88c5\u81ea\u5b9a\u4e49\u7684\u65e5\u5fd7\u8f93\u51fa\u5904\u7406\u51fd\u6570\uff0c\u628a\u65e5\u5fd7\u8f93\u51fa\u5230\u6587\u4ef6\uff0c\u63a7\u5236\u53f0\u7b49\uff0c\u5177\u4f53\u7684\u4f7f\u7528\u53ef\u4ee5\u67e5\u770b Qt \u7684\u5e2e\u52a9\u6587\u6863\u3002<\/p>\n<p><\/p>\n<p>\u672c\u6587\u4e3b\u8981\u662f\u4ecb\u7ecd\u4f7f\u7528 qInstallMessageHandler() \u5b9e\u73b0\u4e00\u4e2a\u7b80\u5355\u7684\u65e5\u5fd7\u5de5\u5177\uff0c\u4f8b\u5982\u8c03\u7528 qDebug() &lt;&lt; &quot;Hi&quot;\uff0c\u8f93\u51fa\u7684\u5185\u5bb9\u4f1a\u540c\u65f6\u8f93\u51fa\u5230\u65e5\u5fd7\u6587\u4ef6\u548c\u63a7\u5236\u53f0\uff0c\u5e76\u4e14\u65e5\u5fd7\u6587\u4ef6\u5982\u679c\u4e0d\u662f\u5f53\u5929\u521b\u5efa\u7684\uff0c\u4f1a\u4f7f\u7528\u5b83\u7684\u521b\u5efa\u65e5\u671f\u5907\u4efd\u8d77\u6765\uff0c\u6d89\u53ca\u5230\u7684\u6587\u4ef6\u6709:<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; kcLog.pro:\u5de5\u7a0b<\/p>\n<p>&nbsp; &nbsp; main.cpp: \u4f7f\u7528\u793a\u4f8b<\/p>\n<p>&nbsp; &nbsp; Singleton.h: \u5355\u4f8b\u6a21\u7248<\/p>\n<p>&nbsp; &nbsp; kcLog.h: \u81ea\u5b9a\u4e49\u65e5\u5fd7\u76f8\u5173\u7c7b\u7684\u5934\u6587\u4ef6<\/p>\n<p>&nbsp; &nbsp; kcLog.cpp: \u81ea\u5b9a\u4e49\u65e5\u5fd7\u76f8\u5173\u7c7b\u7684\u5b9e\u73b0\u6587\u4ef6<\/p>\n<p><\/p>\n<p><\/p>\n<p>**\u5de5\u7a0b\u4e0b\u8f7d\u5730\u5740\uff1a**<\/p>\n<p>[https:\/\/download.csdn.net\/download\/sirkang\/12418621](https:\/\/download.csdn.net\/download\/sirkang\/12418621)<\/p>\n<p><\/p>\n<p>\u5b9a\u4e49 QT_MESSAGELOGCONTEXT<\/p>\n<p><\/p>\n<p>qDebug \u5176\u5b9e\u662f\u4e00\u4e2a\u5b8f: #define qDebug QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).debug\uff0c\u5728 Debug \u7248\u672c\u7684\u65f6\u5019\u4f1a\u8f93\u51fa\u884c\u53f7\uff0c\u6587\u4ef6\u540d\uff0c\u51fd\u6570\u540d\u7b49\uff0c\u4f46\u662f\u5728 Release \u7248\u672c\u7684\u65f6\u5019\u4e0d\u4f1a\u8f93\u51fa\uff0c\u4e3a\u4e86\u8f93\u51fa\u5b83\u4eec\uff0c\u9700\u8981\u5728 .pro \u6587\u4ef6\u91cc\u52a0\u5165\u4e0b\u9762\u7684\u5b9a\u4e49:<\/p>\n<p><\/p>\n<p>&#8220;`<\/p>\n<p>DEFINES += QT_MESSAGELOGCONTEXT<\/p>\n<p>&#8220;`<\/p>\n<p>**kcLog.pro**<\/p>\n<p>&#8220;`<\/p>\n<p>QT -= core gui<\/p>\n<p><\/p>\n<p>greaterThan(QT_MAJOR_VERSION, 4): QT += widgets<\/p>\n<p><\/p>\n<p>CONFIG += c++11<\/p>\n<p>#\u6253\u5370\u65e5\u5fd7\u65b9\u5f0f<\/p>\n<p>CONFIG += console<\/p>\n<p><\/p>\n<p># The following define makes your compiler emit warnings if you use<\/p>\n<p># any Qt feature that has been marked deprecated (the exact warnings<\/p>\n<p># depend on your compiler). Please consult the documentation of the<\/p>\n<p># deprecated API in order to know how to port your code away from it.<\/p>\n<p>DEFINES += QT_DEPRECATED_WARNINGS<\/p>\n<p>DEFINES += QT_MESSAGELOGCONTEXT<\/p>\n<p><\/p>\n<p># You can also make your code fail to compile if it uses deprecated APIs.<\/p>\n<p># In order to do so, uncomment the following line.<\/p>\n<p># You can also select to disable deprecated APIs only up to a certain version of Qt.<\/p>\n<p>#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000&nbsp; &nbsp; # disables all the APIs deprecated before Qt 6.0.0<\/p>\n<p><\/p>\n<p>SOURCES += \\<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; kcLog.cpp \\<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; main.cpp<\/p>\n<p><\/p>\n<p># Default rules for deployment.<\/p>\n<p>qnx: target.path = \/tmp\/$${TARGET}\/bin<\/p>\n<p>else: unix:!android: target.path = \/opt\/$${TARGET}\/bin<\/p>\n<p>!isEmpty(target.path): INSTALLS += target<\/p>\n<p><\/p>\n<p>HEADERS += \\<\/p>\n<p>&nbsp; &nbsp; Singleton.h \\<\/p>\n<p>&nbsp; &nbsp; kcLog.h<\/p>\n<p><\/p>\n<p>&#8220;`<\/p>\n<p>**main.cpp**<\/p>\n<p><\/p>\n<p>&#8220;`<\/p>\n<p>#include &lt;QApplication&gt;<\/p>\n<p>#include &lt;QDebug&gt;<\/p>\n<p>#include &quot;kcLog.h&quot;<\/p>\n<p><\/p>\n<p>int main(int argc, char *argv[]) {<\/p>\n<p>&nbsp; &nbsp; QApplication app(argc, argv);<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570<\/p>\n<p>&nbsp; &nbsp; Singleton&lt;kcLog&gt;::getInstance().installMessageHandler();<\/p>\n<p>&nbsp; &nbsp; \/\/\u8f93\u51fa\u6d4b\u8bd5\uff0c\u67e5\u770b\u662f\u5426\u5199\u5165\u5230\u6587\u4ef6\uff08\u5199\u5165\uff09<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; qDebug(&quot;qDebug:\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;);<\/p>\n<p>&nbsp; &nbsp; qInfo(&quot;qInfo:\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;);<\/p>\n<p>&nbsp; &nbsp; qWarning(&quot;qWarning:\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;);<\/p>\n<p>&nbsp; &nbsp; qCritical(&quot;qCritical:\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;);<\/p>\n<p>&nbsp; &nbsp; \/\/&nbsp; &nbsp; qFatal(&quot;qFatal:\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;);&nbsp; \/\/ \u5199\u5165\u8be5\u884c\u76f4\u63a5\u81f4\u547d\u9519\u8bef\uff01\uff0c\u4ee5\u4e0b\u4ee3\u7801\u4e0d\u6267\u884c\uff01<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/\u5378\u8f7d\u6d88\u606f\u5904\u7406\u51fd\u6570<\/p>\n<p>&nbsp; &nbsp; Singleton&lt;kcLog&gt;::getInstance().uninstallMessageHandler();<\/p>\n<p>&nbsp; &nbsp; \/\/\u8f93\u51fa\u6d4b\u8bd5\uff0c\u67e5\u770b\u662f\u5426\u5199\u5165\u5230\u6587\u4ef6\uff08\u4e0d\u5199\u5165\uff09<\/p>\n<p>&nbsp; &nbsp; qDebug() &lt;&lt; &quot;qDebug:\u5378\u8f7d\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u4e0d\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;;<\/p>\n<p>&nbsp; &nbsp; qInfo() &lt;&lt; &quot;qInfo:\u5378\u8f7d\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u4e0d\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;;<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/\u518d\u6b21\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570<\/p>\n<p>&nbsp; &nbsp; Singleton&lt;kcLog&gt;::getInstance().installMessageHandler();<\/p>\n<p>&nbsp; &nbsp; \/\/\u8f93\u51fa\u6d4b\u8bd5\uff0c\u67e5\u770b\u662f\u5426\u5199\u5165\u5230\u6587\u4ef6\uff08\u5199\u5165\uff09<\/p>\n<p>&nbsp; &nbsp; qDebug() &lt;&lt; &quot;qDebug:\u518d\u6b21\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;;<\/p>\n<p>&nbsp; &nbsp; qInfo() &lt;&lt; &quot;qInfo:\u518d\u6b21\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;;<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; return app.exec();<\/p>\n<p>}<\/p>\n<p><\/p>\n<p>&#8220;`<\/p>\n<p><\/p>\n<p>**kcLog.cpp**<\/p>\n<p><\/p>\n<p>&#8220;`<\/p>\n<p>\/******************************************************************************************<\/p>\n<p>&nbsp;* loghanfler.cpp<\/p>\n<p>&nbsp;* by kangchuang<\/p>\n<p>&nbsp;* time\uff1a20200514<\/p>\n<p>&nbsp;*<\/p>\n<p>&nbsp;* \u4f7f\u7528\u65b9\u6cd5\u5982\u4e0b\uff1a<\/p>\n<p><\/p>\n<p>#include &quot;kcLog.h&quot;<\/p>\n<p>#include &lt;QApplication&gt;<\/p>\n<p>#include &lt;QDebug&gt;<\/p>\n<p><\/p>\n<p>int main(int argc, char *argv[]) {<\/p>\n<p>&nbsp; &nbsp; QApplication app(argc, argv);<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570<\/p>\n<p>&nbsp; &nbsp; Singleton&lt;kcLog&gt;::getInstance().installMessageHandler();<\/p>\n<p>&nbsp; &nbsp; \/\/\u8f93\u51fa\u6d4b\u8bd5\uff0c\u67e5\u770b\u662f\u5426\u5199\u5165\u5230\u6587\u4ef6\uff08\u5199\u5165\uff09<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; qDebug(&quot;qDebug:\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;);<\/p>\n<p>&nbsp; &nbsp; qInfo(&quot;qInfo:\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;);<\/p>\n<p>&nbsp; &nbsp; qWarning(&quot;qWarning:\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;);<\/p>\n<p>&nbsp; &nbsp; qCritical(&quot;qCritical:\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;);<\/p>\n<p>&nbsp; &nbsp; \/\/&nbsp; &nbsp; qFatal(&quot;qFatal:\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;);&nbsp; \/\/ \u5199\u5165\u8be5\u884c\u76f4\u63a5\u81f4\u547d\u9519\u8bef\uff01\uff0c\u4ee5\u4e0b\u4ee3\u7801\u4e0d\u6267\u884c\uff01<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/\u5378\u8f7d\u6d88\u606f\u5904\u7406\u51fd\u6570<\/p>\n<p>&nbsp; &nbsp; Singleton&lt;kcLog&gt;::getInstance().uninstallMessageHandler();<\/p>\n<p>&nbsp; &nbsp; \/\/\u8f93\u51fa\u6d4b\u8bd5\uff0c\u67e5\u770b\u662f\u5426\u5199\u5165\u5230\u6587\u4ef6\uff08\u4e0d\u5199\u5165\uff09<\/p>\n<p>&nbsp; &nbsp; qDebug() &lt;&lt; &quot;qDebug:\u5378\u8f7d\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u4e0d\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;;<\/p>\n<p>&nbsp; &nbsp; qInfo() &lt;&lt; &quot;qInfo:\u5378\u8f7d\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u4e0d\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;;<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/\u518d\u6b21\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570<\/p>\n<p>&nbsp; &nbsp; Singleton&lt;kcLog&gt;::getInstance().installMessageHandler();<\/p>\n<p>&nbsp; &nbsp; \/\/\u8f93\u51fa\u6d4b\u8bd5\uff0c\u67e5\u770b\u662f\u5426\u5199\u5165\u5230\u6587\u4ef6\uff08\u5199\u5165\uff09<\/p>\n<p>&nbsp; &nbsp; qDebug() &lt;&lt; &quot;qDebug:\u518d\u6b21\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;;<\/p>\n<p>&nbsp; &nbsp; qInfo() &lt;&lt; &quot;qInfo:\u518d\u6b21\u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570\uff0c\u5199\u5165\u5230\u6587\u4ef6\uff01&quot;;<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; return app.exec();<\/p>\n<p>}<\/p>\n<p>******************************************************************************************\/<\/p>\n<p>#include &quot;kcLog.h&quot;<\/p>\n<p><\/p>\n<p>#include &lt;stdio.h&gt;<\/p>\n<p>#include &lt;stdlib.h&gt;<\/p>\n<p>#include &lt;QDateTime&gt;<\/p>\n<p>#include &lt;QDebug&gt;<\/p>\n<p>#include &lt;QDir&gt;<\/p>\n<p>#include &lt;QFile&gt;<\/p>\n<p>#include &lt;QFileInfo&gt;<\/p>\n<p>#include &lt;QMutexLocker&gt;<\/p>\n<p>#include &lt;QTextCodec&gt;<\/p>\n<p>#include &lt;QTextStream&gt;<\/p>\n<p>#include &lt;QTimer&gt;<\/p>\n<p>#include &lt;QtGlobal&gt;<\/p>\n<p>#include &lt;iostream&gt;<\/p>\n<p><\/p>\n<p>\/************************************************************************************************************<\/p>\n<p>&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<\/p>\n<p>&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;kcLogPrivate&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<\/p>\n<p>&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<\/p>\n<p>&nbsp;***********************************************************************************************************\/<\/p>\n<p>struct kcLogPrivate {<\/p>\n<p>&nbsp; &nbsp; kcLogPrivate();<\/p>\n<p>&nbsp; &nbsp; ~kcLogPrivate();<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/ \u6253\u5f00\u65e5\u5fd7\u6587\u4ef6 log.txt\uff0c\u5982\u679c\u65e5\u5fd7\u6587\u4ef6\u4e0d\u662f\u5f53\u5929\u521b\u5efa\u7684\uff0c\u5219\u4f7f\u7528\u521b\u5efa\u65e5\u671f\u628a\u5176\u91cd\u547d\u540d\u4e3a yyyy-MM-dd.log\uff0c\u5e76\u91cd\u65b0\u521b\u5efa\u4e00\u4e2a log.txt<\/p>\n<p>&nbsp; &nbsp; void openAndBackupLogFile();<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/ \u6d88\u606f\u5904\u7406\u51fd\u6570<\/p>\n<p>&nbsp; &nbsp; static void messageHandler(QtMsgType type, const QMessageLogContext &amp;context, const QString &amp;msg);<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/ \u5982\u679c\u65e5\u5fd7\u6240\u5728\u76ee\u5f55\u4e0d\u5b58\u5728\uff0c\u5219\u521b\u5efa<\/p>\n<p>&nbsp; &nbsp; void makeSureLogDirectory() const;<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; QDir logDir;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ \u65e5\u5fd7\u6587\u4ef6\u5939<\/p>\n<p>&nbsp; &nbsp; QTimer renameLogFileTimer;&nbsp; \/\/ \u91cd\u547d\u540d\u65e5\u5fd7\u6587\u4ef6\u4f7f\u7528\u7684\u5b9a\u65f6\u5668<\/p>\n<p>&nbsp; &nbsp; QTimer flushLogFileTimer;&nbsp; &nbsp;\/\/ \u5237\u65b0\u8f93\u51fa\u5230\u65e5\u5fd7\u6587\u4ef6\u7684\u5b9a\u65f6\u5668<\/p>\n<p>&nbsp; &nbsp; QDate logFileCreatedDate;&nbsp; &nbsp;\/\/ \u65e5\u5fd7\u6587\u4ef6\u521b\u5efa\u7684\u65f6\u95f4<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; static QFile *logFile;&nbsp; &nbsp; &nbsp; &nbsp;\/\/ \u65e5\u5fd7\u6587\u4ef6<\/p>\n<p>&nbsp; &nbsp; static QTextStream *logOut;&nbsp; \/\/ \u8f93\u51fa\u65e5\u5fd7\u7684 QTextStream\uff0c\u4f7f\u7528\u9759\u6001\u5bf9\u8c61\u5c31\u662f\u4e3a\u4e86\u51cf\u5c11\u51fd\u6570\u8c03\u7528\u7684\u5f00\u9500<\/p>\n<p>&nbsp; &nbsp; static QMutex logMutex;&nbsp; &nbsp; &nbsp; \/\/ \u540c\u6b65\u4f7f\u7528\u7684 mutex<\/p>\n<p>};<\/p>\n<p><\/p>\n<p>\/\/ \u521d\u59cb\u5316 static \u53d8\u91cf<\/p>\n<p>QMutex kcLogPrivate::logMutex;<\/p>\n<p>QFile *kcLogPrivate::logFile&nbsp; &nbsp; &nbsp; = nullptr;<\/p>\n<p>QTextStream *kcLogPrivate::logOut = nullptr;<\/p>\n<p><\/p>\n<p>kcLogPrivate::kcLogPrivate() {<\/p>\n<p>&nbsp; &nbsp; logDir.setPath(&quot;log&quot;);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ TODO: \u65e5\u5fd7\u6587\u4ef6\u5939\u7684\u8def\u5f84\uff0c\u4e3a exe \u6240\u5728\u76ee\u5f55\u4e0b\u7684 log \u6587\u4ef6\u5939\uff0c\u53ef\u4ece\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6<\/p>\n<p>&nbsp; &nbsp; QString logPath = logDir.absoluteFilePath(&quot;log.txt&quot;);&nbsp; \/\/ \u65e5\u5fd7\u7684\u8def\u5f84<\/p>\n<p>&nbsp; &nbsp; \/\/ \u65e5\u5fd7\u6587\u4ef6\u521b\u5efa\u7684\u65f6\u95f4<\/p>\n<p>&nbsp; &nbsp; \/\/ QFileInfo::created(): On most Unix systems, this function returns the time of the last status change.<\/p>\n<p>&nbsp; &nbsp; \/\/ \u6240\u4ee5\u4e0d\u80fd\u8fd0\u884c\u65f6\u4f7f\u7528\u8fd9\u4e2a\u51fd\u6570\u68c0\u67e5\u521b\u5efa\u65f6\u95f4\uff0c\u56e0\u4e3a\u4f1a\u5728\u8fd0\u884c\u65f6\u53d8\u5316\uff0c\u4e8e\u662f\u5728\u7a0b\u5e8f\u542f\u52a8\u65f6\u4fdd\u5b58\u4e0b\u65e5\u5fd7\u6587\u4ef6\u7684\u6700\u540e\u4fee\u6539\u65f6\u95f4\uff0c<\/p>\n<p>&nbsp; &nbsp; \/\/ \u5728\u540e\u9762\u5224\u65ad\u5982\u679c\u4e0d\u662f\u4eca\u5929\u5219\u7528\u4e8e\u91cd\u547d\u540d log.txt<\/p>\n<p>&nbsp; &nbsp; \/\/ \u5982\u679c\u662f Qt 5.10 \u540e\uff0clastModified() \u53ef\u4ee5\u4f7f\u7528 birthTime() \u4ee3\u66ff<\/p>\n<p>&nbsp; &nbsp; logFileCreatedDate = QFileInfo(logPath).lastModified().date();<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/ \u6253\u5f00\u65e5\u5fd7\u6587\u4ef6\uff0c\u5982\u679c\u4e0d\u662f\u5f53\u5929\u521b\u5efa\u7684\uff0c\u5907\u4efd\u5df2\u6709\u65e5\u5fd7\u6587\u4ef6<\/p>\n<p>&nbsp; &nbsp; openAndBackupLogFile();<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/ \u5341\u5206\u949f\u68c0\u67e5\u4e00\u6b21\u65e5\u5fd7\u6587\u4ef6\u521b\u5efa\u65f6\u95f4<\/p>\n<p>&nbsp; &nbsp; renameLogFileTimer.setInterval(1000 * 60 * 10);&nbsp; \/\/ TODO: \u53ef\u4ece\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6<\/p>\n<p>&nbsp; &nbsp; \/\/ renameLogFileTimer.setInterval(1000); \/\/ \u4e3a\u4e86\u5feb\u901f\u6d4b\u8bd5\u770b\u5230\u65e5\u671f\u53d8\u5316\u540e\u662f\u5426\u65b0\u521b\u5efa\u4e86\u5bf9\u5e94\u7684\u65e5\u5fd7\u6587\u4ef6\uff0c\u6240\u4ee5 1 \u79d2\u68c0\u67e5\u4e00\u6b21<\/p>\n<p>&nbsp; &nbsp; renameLogFileTimer.start();<\/p>\n<p>&nbsp; &nbsp; QObject::connect(&amp;renameLogFileTimer, &amp;QTimer::timeout, [this] {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; QMutexLocker locker(&amp;kcLogPrivate::logMutex);<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; openAndBackupLogFile();<\/p>\n<p>&nbsp; &nbsp; });<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/ \u5b9a\u65f6\u5237\u65b0\u65e5\u5fd7\u8f93\u51fa\u5230\u6587\u4ef6\uff0c\u5c3d\u5feb\u7684\u80fd\u5728\u65e5\u5fd7\u6587\u4ef6\u91cc\u770b\u5230\u6700\u65b0\u7684\u65e5\u5fd7<\/p>\n<p>&nbsp; &nbsp; flushLogFileTimer.setInterval(1000);&nbsp; \/\/ TODO: \u53ef\u4ece\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6<\/p>\n<p>&nbsp; &nbsp; flushLogFileTimer.start();<\/p>\n<p>&nbsp; &nbsp; QObject::connect(&amp;flushLogFileTimer, &amp;QTimer::timeout, [] {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ qDebug() &lt;&lt; QDateTime::currentDateTime().toString(&quot;yyyy-MM-dd hh:mm:ss&quot;); \/\/ \u6d4b\u8bd5\u4e0d\u505c\u7684\u5199\u5165\u5185\u5bb9\u5230\u65e5\u5fd7\u6587\u4ef6<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; QMutexLocker locker(&amp;kcLogPrivate::logMutex);<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; if (nullptr != logOut) {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logOut-&gt;flush();<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n<p>&nbsp; &nbsp; });<\/p>\n<p>}<\/p>\n<p><\/p>\n<p>kcLogPrivate::~kcLogPrivate() {<\/p>\n<p>&nbsp; &nbsp; if (nullptr != logFile) {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logFile-&gt;flush();<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logFile-&gt;close();<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; delete logOut;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; delete logFile;<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ \u56e0\u4e3a\u4ed6\u4eec\u662f static \u53d8\u91cf<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logOut&nbsp; = nullptr;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logFile = nullptr;<\/p>\n<p>&nbsp; &nbsp; }<\/p>\n<p>}<\/p>\n<p><\/p>\n<p>\/\/ \u6253\u5f00\u65e5\u5fd7\u6587\u4ef6 log.txt\uff0c\u5982\u679c\u4e0d\u662f\u5f53\u5929\u521b\u5efa\u7684\uff0c\u5219\u4f7f\u7528\u521b\u5efa\u65e5\u671f\u628a\u5176\u91cd\u547d\u540d\u4e3a yyyy-MM-dd.log\uff0c\u5e76\u91cd\u65b0\u521b\u5efa\u4e00\u4e2a log.txt<\/p>\n<p>void kcLogPrivate::openAndBackupLogFile() {<\/p>\n<p>&nbsp; &nbsp; \/\/ \u603b\u4f53\u903b\u8f91:<\/p>\n<p>&nbsp; &nbsp; \/\/ 1. \u7a0b\u5e8f\u542f\u52a8\u65f6 logFile \u4e3a nullptr\uff0c\u521d\u59cb\u5316 logFile\uff0c\u6709\u53ef\u80fd\u662f\u540c\u4e00\u5929\u6253\u5f00\u5df2\u7ecf\u5b58\u5728\u7684 logFile\uff0c\u6240\u4ee5\u4f7f\u7528 Append \u6a21\u5f0f<\/p>\n<p>&nbsp; &nbsp; \/\/ 2. logFileCreatedDate is nullptr, \u8bf4\u660e\u65e5\u5fd7\u6587\u4ef6\u5728\u7a0b\u5e8f\u5f00\u59cb\u65f6\u4e0d\u5b58\u5728\uff0c\u6240\u4ee5\u8bb0\u5f55\u4e0b\u521b\u5efa\u65f6\u95f4<\/p>\n<p>&nbsp; &nbsp; \/\/ 3. \u7a0b\u5e8f\u8fd0\u884c\u65f6\u68c0\u67e5\u5982\u679c logFile \u7684\u521b\u5efa\u65e5\u671f\u548c\u5f53\u524d\u65e5\u671f\u4e0d\u76f8\u7b49\uff0c\u5219\u4f7f\u7528\u5b83\u7684\u521b\u5efa\u65e5\u671f\u91cd\u547d\u540d\uff0c\u7136\u540e\u518d\u751f\u6210\u4e00\u4e2a\u65b0\u7684 log.txt \u6587\u4ef6<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; makeSureLogDirectory();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ \u5982\u679c\u65e5\u5fd7\u6240\u5728\u76ee\u5f55\u4e0d\u5b58\u5728\uff0c\u5219\u521b\u5efa<\/p>\n<p>&nbsp; &nbsp; QString logPath = logDir.absoluteFilePath(&quot;log.txt&quot;);&nbsp; \/\/ \u65e5\u5fd7\u7684\u8def\u5f84<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/ [[1]] \u7a0b\u5e8f\u542f\u52a8\u65f6 logFile \u4e3a nullptr<\/p>\n<p>&nbsp; &nbsp; if (nullptr == logFile) {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logFile = new QFile(logPath);<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logOut&nbsp; = (logFile-&gt;open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) ? new QTextStream(logFile) : nullptr;<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; if (nullptr != logOut) {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logOut-&gt;setCodec(&quot;UTF-8&quot;);<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ [[2]] \u5982\u679c\u6587\u4ef6\u662f\u7b2c\u4e00\u6b21\u521b\u5efa\uff0c\u5219\u521b\u5efa\u65e5\u671f\u662f\u65e0\u6548\u7684\uff0c\u628a\u5176\u8bbe\u7f6e\u4e3a\u5f53\u524d\u65e5\u671f<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; if (logFileCreatedDate.isNull()) {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logFileCreatedDate = QDate::currentDate();<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ TODO: \u53ef\u4ee5\u68c0\u67e5\u65e5\u5fd7\u6587\u4ef6\u8d85\u8fc7 30 \u4e2a\uff0c\u5220\u9664 30 \u5929\u524d\u7684\u65e5\u5fd7\u6587\u4ef6<\/p>\n<p>&nbsp; &nbsp; }<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/ [[3]] \u7a0b\u5e8f\u8fd0\u884c\u65f6\u5982\u679c\u521b\u5efa\u65e5\u671f\u4e0d\u662f\u5f53\u524d\u65e5\u671f\uff0c\u5219\u4f7f\u7528\u521b\u5efa\u65e5\u671f\u91cd\u547d\u540d\uff0c\u5e76\u751f\u6210\u4e00\u4e2a\u65b0\u7684 log.txt<\/p>\n<p>&nbsp; &nbsp; if (logFileCreatedDate != QDate::currentDate()) {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logFile-&gt;flush();<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logFile-&gt;close();<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; delete logOut;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; delete logFile;<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; QString newLogPath = logDir.absoluteFilePath(logFileCreatedDate.toString(&quot;yyyy-MM-dd.log&quot;));<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; ;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; QFile::copy(logPath, newLogPath);&nbsp; \/\/ Bug: \u6309\u7406\u8bf4 rename \u4f1a\u66f4\u5408\u9002\uff0c\u4f46\u662f rename \u65f6\u6700\u540e\u4e00\u4e2a\u6587\u4ef6\u603b\u662f\u663e\u793a\u4e0d\u51fa\u6765\uff0c\u9700\u8981 killall Finder \u540e\u624d\u51fa\u73b0<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; QFile::remove(logPath);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ \u5220\u9664\u91cd\u65b0\u521b\u5efa\uff0c\u6539\u53d8\u521b\u5efa\u65f6\u95f4<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logFile&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = new QFile(logPath);<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logOut&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= (logFile-&gt;open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) ? new QTextStream(logFile) : nullptr;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logFileCreatedDate = QDate::currentDate();<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; if (nullptr != logOut) {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logOut-&gt;setCodec(&quot;UTF-8&quot;);<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; }<\/p>\n<p>&nbsp; &nbsp; }<\/p>\n<p>}<\/p>\n<p><\/p>\n<p>\/\/ \u5982\u679c\u65e5\u5fd7\u6240\u5728\u76ee\u5f55\u4e0d\u5b58\u5728\uff0c\u5219\u521b\u5efa<\/p>\n<p>void kcLogPrivate::makeSureLogDirectory() const {<\/p>\n<p>&nbsp; &nbsp; if (!logDir.exists()) {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; logDir.mkpath(&quot;.&quot;);&nbsp; \/\/ \u53ef\u4ee5\u9012\u5f52\u7684\u521b\u5efa\u6587\u4ef6\u5939<\/p>\n<p>&nbsp; &nbsp; }<\/p>\n<p>}<\/p>\n<p><\/p>\n<p>\/\/ \u6d88\u606f\u5904\u7406\u51fd\u6570<\/p>\n<p>void kcLogPrivate::messageHandler(QtMsgType type, const QMessageLogContext &amp;context, const QString &amp;msg) {<\/p>\n<p>&nbsp; &nbsp; QMutexLocker locker(&amp;kcLogPrivate::logMutex);<\/p>\n<p>&nbsp; &nbsp; QString level;<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; switch (type) {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; case QtDebugMsg:<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; level = &quot;DEBUG&quot;;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; case QtInfoMsg:<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; level = &quot;INFO &quot;;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; case QtWarningMsg:<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; level = &quot;WARN &quot;;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; case QtCriticalMsg:<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; level = &quot;ERROR&quot;;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; case QtFatalMsg:<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; level = &quot;FATAL&quot;;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; default:<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<\/p>\n<p>&nbsp; &nbsp; }<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; \/\/ \u8f93\u51fa\u5230\u6807\u51c6\u8f93\u51fa: Windows \u4e0b std::cout \u4f7f\u7528 GB2312\uff0c\u800c msg \u4f7f\u7528 UTF-8\uff0c\u4f46\u662f\u7a0b\u5e8f\u7684 Local \u4e5f\u8fd8\u662f\u4f7f\u7528 UTF-8<\/p>\n<p>#if defined(Q_OS_WIN)<\/p>\n<p>&nbsp; &nbsp; QByteArray localMsg = QTextCodec::codecForName(&quot;GB2312&quot;)-&gt;fromUnicode(msg);&nbsp; \/\/msg.toLocal8Bit();<\/p>\n<p>#else<\/p>\n<p>&nbsp; &nbsp; QByteArray localMsg = msg.toLocal8Bit();<\/p>\n<p>#endif<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; std::cout &lt;&lt; std::string(localMsg) &lt;&lt; std::endl;<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; if (nullptr == kcLogPrivate::logOut) {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; return;<\/p>\n<p>&nbsp; &nbsp; }<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; \/\/ \u8f93\u51fa\u5230\u65e5\u5fd7\u6587\u4ef6, \u683c\u5f0f: \u65f6\u95f4 &#8211; [Level] (\u6587\u4ef6\u540d:\u884c\u6570, \u51fd\u6570): \u6d88\u606f<\/p>\n<p>&nbsp; &nbsp; QString fileName = context.file;<\/p>\n<p>&nbsp; &nbsp; int index&nbsp; &nbsp; &nbsp; &nbsp; = fileName.lastIndexOf(QDir::separator());<\/p>\n<p>&nbsp; &nbsp; fileName&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= fileName.mid(index + 1);<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; (*kcLogPrivate::logOut) &lt;&lt; QString(&quot;%1 &#8211; [%2] (%3:%4, %5): %6\\n&quot;)<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.arg(QDateTime::currentDateTime().toString(&quot;yyyy-MM-dd hh:mm:ss&quot;))<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.arg(level)<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.arg(fileName)<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.arg(context.line)<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.arg(context.function)<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.arg(msg);<\/p>\n<p>}<\/p>\n<p><\/p>\n<p>\/************************************************************************************************************<\/p>\n<p>&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<\/p>\n<p>&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;kcLog&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*<\/p>\n<p>&nbsp;*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *<\/p>\n<p>&nbsp;***********************************************************************************************************\/<\/p>\n<p>kcLog::kcLog() : d(nullptr) {<\/p>\n<p>}<\/p>\n<p><\/p>\n<p>kcLog::~kcLog() {<\/p>\n<p>}<\/p>\n<p><\/p>\n<p>void kcLog::installMessageHandler() {<\/p>\n<p>&nbsp; &nbsp; QMutexLocker locker(&amp;kcLogPrivate::logMutex);<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; if (nullptr == d) {<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; d = new kcLogPrivate();<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; qInstallMessageHandler(kcLogPrivate::messageHandler);&nbsp; \/\/ \u7ed9 Qt \u5b89\u88c5\u81ea\u5b9a\u4e49\u6d88\u606f\u5904\u7406\u51fd\u6570<\/p>\n<p>&nbsp; &nbsp; }<\/p>\n<p>}<\/p>\n<p><\/p>\n<p>void kcLog::uninstallMessageHandler() {<\/p>\n<p>&nbsp; &nbsp; QMutexLocker locker(&amp;kcLogPrivate::logMutex);<\/p>\n<p>&nbsp; &nbsp; qInstallMessageHandler(nullptr);<\/p>\n<p>&nbsp; &nbsp; delete d;<\/p>\n<p>&nbsp; &nbsp; d = nullptr;<\/p>\n<p>}<\/p>\n<p><\/p>\n<p>&#8220;`<\/p>\n<p>**kcLog.h**<\/p>\n<p>&#8220;`<\/p>\n<p>#ifndef kcLog_H<\/p>\n<p>#define kcLog_H<\/p>\n<p><\/p>\n<p>#include &quot;Singleton.h&quot;<\/p>\n<p><\/p>\n<p>#define kcLogInstance Singleton&lt;kcLog&gt;::getInstance()<\/p>\n<p><\/p>\n<p>struct kcLogPrivate;<\/p>\n<p><\/p>\n<p>class kcLog {<\/p>\n<p>&nbsp; &nbsp; SINGLETON(kcLog)&nbsp; \/\/ \u4f7f\u7528\u5355\u4f8b\u6a21\u5f0f<\/p>\n<p>&nbsp;public:<\/p>\n<p>&nbsp; &nbsp; void uninstallMessageHandler();&nbsp; \/\/ \u91ca\u653e\u8d44\u6e90<\/p>\n<p>&nbsp; &nbsp; void installMessageHandler();&nbsp; &nbsp; \/\/ \u7ed9 Qt \u5b89\u88c5\u6d88\u606f\u5904\u7406\u51fd\u6570<\/p>\n<p><\/p>\n<p>&nbsp;private:<\/p>\n<p>&nbsp; &nbsp; kcLogPrivate *d;<\/p>\n<p>};<\/p>\n<p><\/p>\n<p>#endif&nbsp; \/\/ kcLog_H<\/p>\n<p><\/p>\n<p>&#8220;`<\/p>\n<p>**Singleton.h**<\/p>\n<p><\/p>\n<p>&#8220;`<\/p>\n<p>#ifndef SINGLETON_H<\/p>\n<p>#define SINGLETON_H<\/p>\n<p><\/p>\n<p>\/\/Singleton.h\u4e0b\u8f7d\u5730\u5740\uff1a<\/p>\n<p>\/\/https:\/\/download.csdn.net\/download\/sirkang\/12418621<\/p>\n<p><\/p>\n<p>#endif&nbsp; \/\/ SINGLETON_H<\/p>\n<p><\/p>\n<p>&#8220;`<\/p>\n<p>**\u6548\u679c**<\/p>\n<p>![\u6548\u679c\u56fe](https:\/\/img-blog.csdnimg.cn\/20200514112241348.png?x-oss-process=image\/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Npcmthbmc=,size_16,color_FFFFFF,t_70)<\/p>\n<p>**\u672a\u5b8c\u5f85\u7eed\uff01\uff01\uff01**<\/p>\n<p><\/p>\n<p>&nbsp; &nbsp; main() \u51fd\u6570\u91cc\u7684 qDebug() \u8f93\u51fa\u90fd\u662f\u5728 UI \u7ebf\u7a0b\uff0ckcLog\u662f\u5426\u591a\u7ebf\u7a0b\u5b89\u5168\uff1f\u600e\u4e48\u6d4b\u8bd5\uff1f<\/p>\n<p>&nbsp; &nbsp; \u65e5\u5fd7\u7684\u76f8\u5173\u914d\u7f6e\u6570\u636e\u4f8b\u5982\u8f93\u51fa\u76ee\u5f55\u7b49\u90fd\u662f\u5199\u6b7b\u5728\u7a0b\u5e8f\u91cc\u7684\uff0c\u5982\u679c\u5199\u5230\u914d\u7f6e\u6587\u4ef6\u91cc\u662f\u4e0d\u662f\u66f4\u7075\u6d3b\uff1f<\/p>\n<p>&nbsp; &nbsp; \u65e5\u5fd7\u7684\u683c\u5f0f\u4e5f\u662f\u5199\u6b7b\u5728\u7a0b\u5e8f\u91cc\u7684\uff0c\u5982\u679c\u80fd\u505a\u5230\u901a\u8fc7\u914d\u7f6e\u4fee\u6539\u65e5\u5fd7\u683c\u5f0f\u90a3\u5c31\u66f4\u5f3a\u5927\u4e86\uff0c\u5c31\u50cf log4cxx \u4e00\u6837<\/p>\n<p>&nbsp; &nbsp; \u6d4b\u8bd5\u5982\u4f55\u5feb\u901f\u7684\u770b\u5230\u4e0d\u540c\u65e5\u671f\u751f\u6210\u7684\u65e5\u5fd7\u6587\u4ef6\u4e0d\u540c\uff1f<\/p>\n<p>&nbsp; &nbsp; \u5220\u9664\u8d85\u8fc7 30 \u5929\u7684\u65e5\u5fd7<\/p>\n<p>&nbsp; &nbsp; \u5355\u4e2a\u65e5\u5fd7\u6587\u4ef6\u4f8b\u5982\u5927\u4e8e 100M \u540e\u91cd\u65b0\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u65e5\u5fd7\u6587\u4ef6<\/p>\n<p><\/p>\n<p>**\u5de5\u7a0b\u4e0b\u8f7d\u5730\u5740\uff1a**<\/p>\n<p>[https:\/\/download.csdn.net\/download\/sirkang\/12418621](https:\/\/download.csdn.net\/download\/sirkang\/12418621)<\/p>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Qt \u81ea\u5b9a\u4e49\u65e5\u5fd7\u5de5\u5177 &nbsp; &nbsp; Qt ![\u6548\u679c\u56fe] C++ \u4e2d\u6bd4\u8f83\u4e0d\u9519\u7684\u65e5\u5fd7\u5de5\u5177\u6709 log4cxx\uff0clog4qt \u7b49\uff0c\u4f46\u662f\u5b83\u4eec\u90fd\u4e0d\u80fd\u548c qDebug(), qInfo() \u7b49\u6709\u673a\u7684\u7ed3\u5408\u5728\u4e00\u8d77\uff0c\u6240\u4ee5\u5728 Qt \u4e2d\u4f7f\u7528\u603b\u89c9\u5f97\u4e0d\u591f\u8212\u670d\uff0c\u611f\u8c22 Qt \u63d0\u4f9b\u4e86 qInstal [&hellip;]<\/p>\n","protected":false},"featured_media":346,"categories":[1],"tags":[],"post_thumbnail_image":"http:\/\/www.to3.top\/wp-content\/uploads\/image\/20221215\/1671062540167424.png","content_first_image":"\/wp-content\/uploads\/image\/20221215\/1671062540167424.png","post_medium_image_300":"http:\/\/www.to3.top\/wp-content\/uploads\/image\/20221215\/1671062540167424.png","post_thumbnail_image_624":"http:\/\/www.to3.top\/wp-content\/uploads\/image\/20221215\/1671062540167424.png","post_frist_image":"\/wp-content\/uploads\/image\/20221215\/1671062540167424.png","post_medium_image":"http:\/\/www.to3.top\/wp-content\/uploads\/image\/20221215\/1671062540167424.png","post_large_image":"http:\/\/www.to3.top\/wp-content\/uploads\/image\/20221215\/1671062540167424.png","post_full_image":"http:\/\/www.to3.top\/wp-content\/uploads\/image\/20221215\/1671062540167424.png","post_all_images":[{"imagesurl":"\/wp-content\/uploads\/image\/20221215\/1671062540167424.png","id":"image0"}],"total_comments":0,"category_name":"\u751f\u6d3b","like_count":"0","avatarurls":[],"related_posts":null,"pageviews":44,"next_post_id":347,"next_post_title":"\u559c\u8fce\u65b0\u6625","previous_post_id":334,"previous_post_title":"\u7aef\u5348\u4f11\u606f","_links":{"self":[{"href":"http:\/\/to3.top\/wordpress\/wp-json\/wp\/v2\/posts\/344"}],"collection":[{"href":"http:\/\/to3.top\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/to3.top\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/to3.top\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/to3.top\/wordpress\/wp-json\/wp\/v2\/comments?post=344"}],"version-history":[{"count":0,"href":"http:\/\/to3.top\/wordpress\/wp-json\/wp\/v2\/posts\/344\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/to3.top\/wordpress\/wp-json\/wp\/v2\/media\/346"}],"wp:attachment":[{"href":"http:\/\/to3.top\/wordpress\/wp-json\/wp\/v2\/media?parent=344"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/to3.top\/wordpress\/wp-json\/wp\/v2\/categories?post=344"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/to3.top\/wordpress\/wp-json\/wp\/v2\/tags?post=344"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}