Qt实践之qInstallMessageHandler输出日志文件

对于大型项目来说,一个包含了程序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();
}

运行结果:
运行结果

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值