【问题标题】:Qt/QML: how to redirect console output to syslogQt/QML:如何将控制台输出重定向到系统日志
【发布时间】:2021-12-26 18:36:28
【问题描述】:

我有一个在远程嵌入式目标系统上运行的 QtQuick/QML 应用程序。我在目标上配置了 syslog,以将日志消息定向到日志服务器。

现在,我希望将标准输出和错误控制台输出也重定向到本地系统日志,这样我就可以在一个地方获得所有应用程序反馈。

是否有“最佳实践”方式来做到这一点?还是我想要/需要在我的应用程序中获取所有这些输出并通过“正常渠道”记录它?

编辑:我可以通过 this question/answer 的 bash 重定向来做到这一点,但如果可能的话,我仍然更愿意在应用程序中做到这一点。

编辑:我想我应该更清楚一点,我不是在询问如何获取通过应用程序的日志记录 API 进入系统日志的消息。如果我的 QtQuick QML 中有错误,Qt 运行时会生成错误和警告消息,这些消息会打印到 stderr。我希望将这些消息重定向到系统日志记录工具。

【问题讨论】:

    标签: c++ qt qml stdout stderr


    【解决方案1】:

    请注意,所有 Qt 和 QML 日志都将通过此通道进行流式传输。

    #include <syslog.h>
    #include <QtGlobal>
    
    /// Consider https://linux.die.net/man/3/openlog
    
    /// Qt Log Message handler
    static void qtLogMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
    {
    
        QByteArray loc = msg.toUtf8();
    
        switch (type) {
        case QtDebugMsg:
            syslog (LOG_DEBUG, "%s", loc.constData());
            break;
        case QtInfoMsg:
            syslog (LOG_INFO, "%s", loc.constData());
            break;
        case QtWarningMsg:
            syslog (LOG_WARNING, "%s", loc.constData());
            break;
        case QtCriticalMsg:
            syslog (LOG_CRIT, "%s", loc.constData());
            break;
        case QtFatalMsg:
            syslog (LOG_ERR, "%s", loc.constData());
            break;
        }
    }
    
    int main(int argc, char* argv[])
    {
       /// When starting the process
       openlog("MY_APP_LOG", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER);
    
       /// Install Qt Log Message Handler in main.cpp
       qInstallMessageHandler(qtLogMessageHandler);
    
       /// The Qt app GUI start can be
       QApplication app(argc, argv);
       app.exec();
    
       /// When quitting the process
       closelog();
    }
    

    【讨论】:

    • 我没有尝试编译,只是通过引用我的项目来组成这个解决方案。正确的语义当然取决于应用程序,但很可能在app.exec() 调用之前,该 Qt/QML 对象的所有操作都可以在 main.cpp 中完成。
    • 我想我应该更清楚一点,我不是在询问如何获取通过应用程序的日志记录 API 进入系统日志的消息。如果我的 QtQuick QML 中有错误,Qt 运行时会生成错误和警告消息,这些消息会打印到 stderr。我希望将这些消息重定向到系统日志记录工具。为了更清晰,我将编辑/优化我的原始帖子。
    • 来自 Qt 文档:使用 console.log、console.debug、console.info、console.warn 或 console.error 将调试信息打印到控制台。我们应该期待 ERROR 级别的日志,因此您可以在上面的 qtLogMessageHandler() 函数中将其过滤掉以通过 syslog。考虑 QtCriticalMsg、QtFatalMsg、QtSystemMsg 的 Qt 日志级别,并查看由于您尝试重定向的日志而引发的日志级别。这是一个假设,但通常所有 Qt 日志都是这样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多