背景:需要做一个日志系统。
把信息重定向到txt文件中。
参考:
QT 调试信息如何输出到文件(qDebug/qWarning/qCritical/qFatal)-CSDN博客
Qt 之 qInstallMessageHandler(重定向至文件)-CSDN博客
demo:
#include <QApplication>
#include <QMutex>
#include <QFile>
#include <QTextStream>
#include <QDebug>
static QMutex mutex;
//void myMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);
void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{QString txt;switch (type) {case QtDebugMsg:txt="qDebug:";break;case QtInfoMsg:txt="qInfo:";break;case QtWarningMsg:txt="qWarning:";break;case QtCriticalMsg:txt="qCritical:";break;}mutex.lock();QFile file("log.txt");file.open(QIODevice::WriteOnly|QIODevice::Append);QTextStream text_stream(&file);text_stream<<txt+msg<<"\r\n";text_stream<<QString(context.file)<<"\r\n";text_stream<<QString::number(context.line)<<"\r\n";text_stream<<QString(context.function)<<"\r\n";file.close();mutex.unlock();
}int main(int argc, char *argv[])
{QApplication a(argc, argv);qInstallMessageHandler(customMessageHandler);qDebug()<<"111";qInfo()<<"222";qWarning()<<"333";qCritical()<<"444";return a.exec();
}
关键:
qInstallMessageHandler(customMessageHandler);
这是一个回调函数,
当执行qDebug(),qInfo()......这些的时候,
会调用customMessageHandler()函数。
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler);
为什么要加锁呢?
我的理解:
比如:
qDebug()<<"123";
qDebug()<<"456";
这两条语句都会触发customMessageHandler函数,那么可能会出现抢夺log.txt文件使用权的问题,所以要加锁。
关于 context.file, context.line, context.function
文件名,文件行数,所在的函数名。