简述

Qt之qInstallMessageHandler(输出详细日志)一节中,我们讲解了如何使用自定义消息处理程序输出调试信息,而且可以很直观、很方便的得到输出代码所在的文件、函数、行号等信息。

当软件发布的时候,通常都会采用日志输出功能,方便我们后期的跟踪、查找问题。

自定义消息处理

下面,我们来根据需要自定义消息处理程序。其中输出格式包含:输出信息、文件、函数、行号、日期时间。这样就很利于我们追踪了。

效果

源码

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
// 加锁
static QMutex mutex;
mutex.lock(); QByteArray localMsg = msg.toLocal8Bit(); QString strMsg("");
switch(type)
{
case QtDebugMsg:
strMsg = QString("Debug:");
break;
case QtWarningMsg:
strMsg = QString("Warning:");
break;
case QtCriticalMsg:
strMsg = QString("Critical:");
break;
case QtFatalMsg:
strMsg = QString("Fatal:");
break;
} // 设置输出信息格式
QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
QString strMessage = QString("Message:%1 File:%2 Line:%3 Function:%4 DateTime:%5")
.arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function).arg(strDateTime); // 输出信息至文件中(读写、追加形式)
QFile file("log.txt");
file.open(QIODevice::ReadWrite | QIODevice::Append);
QTextStream stream(&file);
stream << strMessage << "\r\n";
file.flush();
file.close(); // 解锁
mutex.unlock();
} int main(int argc, char **argv)
{
// 安装消息处理程序
qInstallMessageHandler(myMessageOutput); QApplication app(argc, argv); // 打印信息
qDebug("This is a debug message.");
qWarning("This is a warning message.");
qCritical("This is a critical message.");
qFatal("This is a fatal message."); ...
return app.exec();
}

这里,使用QMutex进行加锁、解锁操作,便于我们可以安全的在多线程操作中使用。QFile打开模式为QIODevice::ReadWrite | QIODevice::Append(读写、追加模式),保证了输出信息可以以追加的形式写入文件。

更多参考

最新文章

  1. 简单的DropDownButton(Winform)
  2. oc string
  3. Arduino101/Genuino101的安装入门
  4. Monkey测试2——Monkey测试策略
  5. cygwin下的vim 的vimrc配置
  6. 集成 AliPay - 支付宝
  7. SPOJ 370 Ones and zeros BFS + 同余剪枝
  8. Swift 面向对象
  9. C++_nullptr
  10. 纯CSS实现各类气球泡泡对话框效果
  11. Redis:在windows环境安装Redis
  12. CentOS7中将home迁移到/下的命令 CentOS7中将home迁移到/下的命令
  13. 【练习】jQuery
  14. 自调用匿名函数和js的Module模式
  15. 【一套代码小程序&amp;Native&amp;Web阶段总结篇】可以这样阅读Vue源码
  16. 【算法和数据结构】_15_小算法_打印EOF的值
  17. easyradius通讯接口 V4全新升级,显示同步失败原因,方便用户寻找故障
  18. 句柄线程做参数和PostMessage的用法
  19. 58.UIScrollView XIB拖拽约束
  20. asp.net 多线程

热门文章

  1. 伸缩盒子模型,旧的伸缩盒子模型。浏览器内核、css继承属性
  2. erlang 查看内存消耗的方法?
  3. ros语音交互(四)移植科大讯飞语音识别到ros
  4. Codeforces Round #284 (Div. 2) C题(计算几何)解题报告
  5. VS 自动添加注释
  6. linux下错误的捕获:errno和strerror的使用
  7. Google 开源技术protobuf
  8. 设置Windows 7 防火墙端口规则
  9. ORACLE删除当前用户下所有的表的方法
  10. ldap + kerberos 整合