【发布时间】:2010-12-05 07:04:43
【问题描述】:
您在 Qt 中使用哪些日志记录工具?
你会选择 qDebug()、qWarning()、qCritical()、qFatal() 方法,还是 Log4cpp(Log4cplus 等)之类的方法,或者一些自定义代码?
【问题讨论】:
您在 Qt 中使用哪些日志记录工具?
你会选择 qDebug()、qWarning()、qCritical()、qFatal() 方法,还是 Log4cpp(Log4cplus 等)之类的方法,或者一些自定义代码?
【问题讨论】:
如果您只是在单线程中工作,qDebug 和类似的工作非常好,或者您可以通过在 QT 5.0+ 中使用 qInstallMessageHandler 或在旧版本中使用 qInstallMsgHandler 安装自己的处理程序来对其进行一些修改。
注意:旧版本的 qDebug() 等,您使用 qInstallMsgHandler(现已弃用,例如http://doc.qt.io/archives/4.6/qtglobal.html#qDebug)不是线程安全的。如果您使用线程,它们会严重崩溃/中断。它在内部使用 QTextStream,它是可重入的,但不是线程安全的。
【讨论】:
qDebug() 是线程安全的。 QTextStream 的线程安全无关紧要,因为没有共享的 QTextStream。每次调用qDebug() 都会获得自己的QTextStream。
qDebug 不安全,则不是因为 DarrylC 给出的原因。如果您安装自己的线程安全QtMessageHandler,那么qDebug 将是线程安全的。默认处理程序可能会交错输出,但我不相信存在数据竞争/UB,尽管我无法证明这一点。
由于 Qt 5.2 支持分类日志记录:http://qt-project.org/doc/qt-5/qloggingcategory.html。这允许您将日志消息拆分为(层次结构)类别,并微调哪些记录,哪些不记录。
【讨论】:
现有的 C++ 日志库对我来说太重了,所以我根据 Logging in C++ 的想法为 Qt qInstallMsgHandlerq 后端创建了一个自定义前端。它是跨平台和线程安全的。总有一天我会清理代码并将其发布给全世界:)
Qt 的一个有趣替代方案是QxtLogger。
【讨论】:
Log4Qt 是著名的 log4j 到 Qt 世界的一个端口。
【讨论】:
QDebug 是最好的选择,因为它提供了与框架其余部分的开箱即用集成,不会让您依赖第 3 方代码并且几乎涵盖了所有日志记录需求。
【讨论】:
我没有使用 Qt,但对于日志记录,我使用的是 Dr'Dobb 的 Logging in C++ 的修改版本。原代码可以在here找到。
我的修改是针对 Microsoft Windows 平台的(fopen 不允许文件读取共享),可以在 here 找到。
【讨论】:
关于“不幸的是 qDebug() 等不是线程安全的。如果你使用线程,它们会严重崩溃/中断。在内部它使用 QTextStream,它是可重入的,但不是线程安全的。”
我严重怀疑,qDebug 被设计为同时使用。如果不是这样,请提交错误。
【讨论】:
取决于您希望如何使用该日志数据。
如果在运行时用于调试,qWarning() 就可以了。
如果您需要调试回顾(通常是服务器端代码),纯旧文本文件是最好的。最好按照日志写入的日期来组织这些日志文件。
【讨论】:
你可以看看:https://github.com/netresultsit/uniqlogger
【讨论】: