【问题标题】:Printing all messages and warning on terminal to a file?将终端上的所有消息和警告打印到文件中?
【发布时间】:2013-12-02 19:18:47
【问题描述】:

我想在我的应用程序中生成日志,即我在终端窗口或 cmd 窗口中生成的任何内容都将生成为文本文件中的日志。

例如我有一个客户端服务器程序,所以我在终端上收到的任何消息或警告都会与时间戳一起打印在日志文件中。

任何想法,QxtLog 或 log4Qt 是否与我想要的一样?

【问题讨论】:

  • 我不确定,也许this answer 会帮助你(如果你使用的是Qt 4.*?否则,如果你使用的是Qt 5.*,那么请阅读this:API 已经改变了一点,弃用了之前的!
  • @Nawaz:我试过了,但是 qInstallMsgHandler() 不起作用它表明它不存在。
  • 然后试试qInstallMessageHandler(),正如我所说,the API has been changed since Qt 5.0
  • @Nawaz: 我试过了还是不行
  • "still not working" 几乎总是等于没有信息。

标签: c++ qt logging


【解决方案1】:

安装您的 Qt 消息处理程序。

FILE *fd;

void myMessageOutput(QtMsgType type, const char *msg)
{
    QString timeStamp = QTime::currentTime().toString("hh:mm:ss:zzz");
    switch (type) {
    case QtDebugMsg:
        fprintf(fd, "[%s]", timeStamp.toStdString().c_str());
        fprintf(fd, "[Debug] %s\n", msg);
        break;
    case QtWarningMsg:
        fprintf(fd, "[%s]", timeStamp.toStdString().c_str());
        fprintf(fd, "[Warning] %s\n", msg);
        break;
    case QtCriticalMsg:
        fprintf(fd, "[%s]", timeStamp.toStdString().c_str());
        fprintf(fd, "[Critical] %s\n", msg);
        break;
    case QtFatalMsg:
        fprintf(fd, "[%s]", timeStamp.toStdString().c_str());
        fprintf(fd, "[Fatal] %s\n", msg);
        abort();
    }
}

int main(int argc, char **argv)
{
    fd = fopen("log.txt", "a");
    qInstallMsgHandler(myMessageOutput);
    QApplication app(argc, argv);
    ...
    return app.exec();
}

【讨论】:

  • 它会在终端上打印所有消息,无论是警告、错误消息等吗?我的意思是这些消息类型是否涵盖了出现在 cmd、终端上的所有消息?
  • 是的。 Qt 中有四个调试级别。四个全局函数用于写出警告和调试消息。它们是qDebug()qWarning()qCritical()qFatal()
  • 我按照你说的那样使用它,因为我使用 Qt5 所以必须替换 qInstallMessageHandler() 但它显示错误如下:无效转换来自 'void ()(QtMsgType, const char i>)' 到 'QtMessageHandler {aka void (*)(QtMsgType, const QMessageLogContext&, const QString&)}' [-fpermissive]
  • 对不起,我没有Qt5的经验。希望this可以帮到你。
【解决方案2】:

一种快速简单的方法是将软件的输出通过管道传输到文件中。

对于更复杂的方法,我建议考虑 log4cplus (http://sourceforge.net/p/log4cplus/wiki/Home/) - 我不知道 log4Qt,但我猜它可能有类似的界面。

Log4Cplus 允许为您的日志创建不同的通道/优先级,因此您还可以根据重要性过滤输出,这可能会根据您的项目大小而变得有趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2014-12-23
    • 2022-01-11
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多