对于大型项目来说,一个包含了程序debug信息、告警、关键和致命消息的日志文件,对程序后期的跟踪维护尤为重要。
Qt给我们提供了一个这样的接口,可让我们生成日志文件:
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
这里的handler是需要开发人员预先设计好的消息管理函数,该函数用于打印Qt程序运行期间输出的各种消息,包含调试消息、告警内容和关键错误等。这里的QtMessageHandler是指向消息管理函数的指针。
消息管理函数需要书写成这样的形式:
void myMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);
下面给出使用Qt生成日志文件的样例:
void logMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
//修改日志消息内容
QString logMsg = msg;
if(logMsg.simplified().length() == 0) //过滤掉空消息
{
return;
}
if(logMsg[0] =='\"' && logMsg[logMsg.size()-1] == '\"')
{
logMsg = logMsg.mid(1,logMsg.length()-2);//去除消息中的冒号
}
QString logType;
switch(type)
{
case QtDebugMsg:
logType = QString("DEBUG");
break;
case QtInfoMsg:
logType = QString("INFO");
break;
case QtWarningMsg:
logType = QString("WARN");
break;
case QtCriticalMsg:
logType = QString("ERROR");
break;
case QtFatalMsg:
logType = QString("Fatal");
break;
default:
logType = QString("UNKNOWN");
break;
}
QString current_Date_Time = QDateTime::currentDateTime().toString("MM/dd hh:mm:ss.zzz");
QString message = QString("%1|%2|%3|%4|%5\n").arg(current_Date_Time).arg(logType).arg(context.function).arg(context.line).arg(logMsg);
//生成日志文件
static QMutex mutex; //添加互斥锁,便于在多线程情况的使用
mutex.lock(); //加锁
QDir::setCurrent(QCoreApplication::applicationDirPath());//设置当前目录
static LogName = "./mylog.log";
QFile file(LogName);
if(file.size() >= 100*1024*1024)//如果日志文件超过100M,则另写一个
{
file.rename(LogName,longName+QDateTime::currentDateTime().toString("_yyyyMMddhhmmss.log"));
file.setFileName(LogName);
}
if(file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
{
QTextStream text_stream(&file);
text_stream << message;
file.flush();//将任何缓存数据刷新到文件中
file.close();
}
mutex.unlock(); //解锁
}
int main(int argc, char *argv[])
{
qInstallMessageHandler(logMessage);
QApplication a(argc,argv);
qDebug()<<"This is a debug message!";
qWarning()<<"This is a warning message.";
qCritical()<<"This is a critical message.";
return a.exec();
}
运行结果: