QT说明文档(输出详细日志)
#include <qapplication.h>
#include <stdio.h>
#include <stdlib.h>
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QByteArray localMsg = msg.toLocal8Bit();
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtInfoMsg:
fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
break;
}
}
int main(int argc, char **argv)
{
qInstallMessageHandler(myMessageOutput);
QApplication app(argc, argv);
...
return app.exec();
}
所需头文件
// Qt 之 qInstallMessageHandler(输出详细日志)
#include <QString>
#include <QFile>
#include <QMutex>
#include <QTextStream>
#include <QDateTime>
#include <QDir>
输出日志重定向
//qInstallMessageHandler(myMessageOutput); // 调用
// 保存从文件中读取的配置信息
struct log_parameter{
// 构造函数初始化列表
log_parameter():
log_folder_path("../log/Manager/"),
max_files(24),
min_severity_level(1)
{ }
QString log_folder_path;
int max_files;
int min_severity_level;
};
static log_parameter parameter; // 全局变量
// 重定向输出至日志文件
static void myMessageOutput(QtMsgType type,const QMessageLogContext &context,const QString &msg)
{
// 上锁
static QMutex mutex;
mutex.lock();
QString text;
switch (type) {
case QtDebugMsg:
text = QString("Debug:");
break;
case QtWarningMsg:
text = QString("Warning:");
break;
case QtCriticalMsg:
text = QString("Critial:");
break;
case QtInfoMsg:
text = QString("Info:");
break;
case QtFatalMsg:
text = QString("Fatal:");
break;
}
// 设置输出信息格式
QString context_info = QString("%1:%2 Line:(%3)")
.arg(QString(context.file)).arg(QString(context.function)).arg(context.line);
QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ");
QString current_date = QString("(%1)").arg(current_date_time);
QString message = QString("%1 %2 %3 %4")
.arg(current_date).arg(text).arg(context_info).arg(msg)
// 输出信息至文件
QDir dir(parameter.log_folder_path);
if ( !dir.exists()) // 路径不存在就创建
{
dir.mkpath(parameter.log_folder_path); // 创建多级目录。成功返回true
}
QString file_name = parameter.log_folder_path + current_date_time.left(10) + ".log";
QFile file(file_name);
if (!file.open(QIODevice::WriteOnly | QIODevice::Append)) // 无法写入时(只写或者追加的形式打开)
{
mutex.unlock();
return;
}
QTextStream text_stream(&file); // 定向到日志输出到哪个文件中
text_stream << message << "\r\n"; // message为类似 qDebug,qInfo << 形式
// 用完之后擦屁股
file.flush();
file.close();
}