Qt/QML: как перенаправить вывод консоли в системный журнал

0

Вопрос

У меня есть приложение QtQuick/QML, работающее в удаленной встроенной целевой системе. У меня есть системный журнал, настроенный на целевой объект для направления сообщений журнала на сервер журналов.

Теперь я хотел бы, чтобы вывод консоли standard out и err также перенаправлялся в локальный системный журнал, чтобы я мог получать все отзывы о своих приложениях в одном месте.

Существует ли способ "наилучшей практики" для этого? Или я захочу/мне нужно будет получить все эти выходные данные в своем приложении и зарегистрировать их по "обычным каналам"?

Редактировать: Я могу сделать это с перенаправлением bash в соответствии с этим вопросом/ответом, но я все равно предпочел бы сделать это из приложения, если это возможно.

Редактировать: Я полагаю, мне следует более четко указать, что я не спрашиваю о том, как отправлять сообщения, которые проходят через API ведения журнала приложения, в системный журнал. Если в моем QtQuick QML есть ошибки, среда выполнения Qt генерирует сообщения об ошибках и предупреждения, которые выводятся на stderr. Это те сообщения, которые я хочу перенаправить на средство ведения системного журнала.

c++ qml qt stderr
2021-11-15 14:52:25
1

Лучший ответ

2

Имейте в виду, что все журналы 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();
}
2021-11-15 17:58:04

Я не пытался компилировать, а просто сочинил это решение, цитируя мои проекты. Правильная семантика, конечно, зависит от приложения, но, скорее всего, все можно сделать в main.cpp для этого объекта Qt/QML перед app.exec() вызов.
Alexander V

Полагаю, мне следует более четко пояснить, что я не спрашиваю о том, как отправлять сообщения, которые проходят через API ведения журнала приложения, в системный журнал. Если в моем QtQuick QML есть ошибки, среда выполнения Qt генерирует сообщения об ошибках и предупреждения, которые выводятся на stderr. Это те сообщения, которые я хочу перенаправить на средство ведения системного журнала. Я отредактирую/доработаю свой первоначальный пост для большей ясности.
alpartis

Из документов Qt: Используйте console.log, console.debug, console.info, консоль.предупреждение или ошибка консоли.для печати отладочной информации на консоль. Мы должны ожидать, что журнал уровня ОШИБОК, чтобы вы могли отфильтровать его в функции qtLogMessageHandler (), как указано выше, для прохождения системного журнала. Рассмотрим уровень журнала Qt QtCriticalMsg, QtFatalMsg, QtSystemMsg и посмотрим, какой из них возникает из-за журнала, который вы пытаетесь перенаправить. Это предположение, но, как правило, весь журнал Qt таков.
Alexander V

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................