Qt/QML:如何将控制台输出重定向到系统日志

问题描述 投票:0回答:2

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

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

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

编辑:我可以根据这个问题/答案使用 bash 重定向来执行此操作,但如果可能的话,我仍然更愿意在应用程序内执行此操作。

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

c++ qt qml stdout stderr
2个回答
3
投票

请注意,所有 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();
}

0
投票

从 Qt 5.6 开始,有更简单的选项: 您可以使用

qDebug()
qInfo()
qWarning()
和其他 Qt 日志功能,它们会将输出传递到 syslog。

从 Qt 5.6 开始,内置了对 syslog 的支持:您需要

  • 在Qt配置脚本中启用
    -syslog
    (如果您使用buildroot,只需添加
    BR2_PACKAGE_QT5BASE_SYSLOG=y
  • 包括
    #include <QtGlobal>
  • qputenv("QT_LOGGING_TO_CONSOLE", QByteArray("0"));
    添加到您的程序中,以便输出进入系统日志而不是控制台

示例:

#include <QtGlobal>
#include <QByteArray>

int main()
{
    // Needed to enable logging to syslog or journald.
    qputenv("QT_LOGGING_TO_CONSOLE", QByteArray("0"));

    // Send some messages, which should go to syslog/journald.
    qDebug("qDebug");
    qInfo("qInfo");
    qWarning("qWarning");
}

来源: https://www.ics.com/blog/whats-new-qt-560-logging-syslog-and-journald

© www.soinside.com 2019 - 2024. All rights reserved.