Qt/QML: jak przekierować wyjście konsoli w dzienniku systemu

0

Pytanie

Mam aplikację QtQuick/QML, działające w zdalnej wbudowanej w systemie docelowym. Mam dziennik, nastawiony na cel dla kierunku dziennika na serwer czasopism.

Teraz chciałbym, aby wniosek konsoli standard out i err również przekierowany do lokalnego dziennika, żebym mógł otrzymywać wszystkie opinie na temat swoich aplikacji w jednym miejscu.

Czy istnieje sposób na "najlepszych praktyk" do tego? Lub chcę/muszę uzyskać wszystkie te dane wyjściowe w swojej aplikacji i zarejestrować je w "zwykłych kanałów"?

Edit: mogę to zrobić z przekierowaniem bash zgodnie z tym pytanie/odpowiedź, ale ja i tak wolałbym zrobić to z poziomu aplikacji, jeśli to możliwe.

Edit: zakładam, że powinienem bardziej wyraźnie zaznaczyć, że ja nie pytam o to, jak wysyłać wiadomości, które przechodzą przez API rejestrowania aplikacji, w dzienniku systemu. Jeśli w moim QtQuick QML jest błąd, środowisko wykonawcze Qt generuje komunikaty o błędach i ostrzeżenia, które są wyświetlane na stderr. To te wiadomości, które chcę przekierować na środek prowadzenia dziennika systemowego.

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

Najlepsza odpowiedź

2

Należy pamiętać, że wszystkie dzienniki Qt i QML będą przekazywane na tym kanale.

#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

Nie próbowałem kompilować, a po prostu napisałem to rozwiązanie, cytując moje projekty. Prawidłowa semantyka, oczywiście, zależy od aplikacji, ale najprawdopodobniej wszystko można zrobić w main.cpp dla tego obiektu Qt/QML przed app.exec() wyzwanie.
Alexander V

Powinnam bardziej wyraźnie wyjaśnić, że ja nie pytam o to, jak wysyłać wiadomości, które przechodzą przez API rejestrowania aplikacji, w dzienniku systemu. Jeśli w moim QtQuick QML jest błąd, środowisko wykonawcze Qt generuje komunikaty o błędach i ostrzeżenia, które są wyświetlane na stderr. To te wiadomości, które chcę przekierować na środek prowadzenia dziennika systemowego. Ja uderzać redagować/доработаю swój pierwotny post dla większej przejrzystości.
alpartis

Z dokumentów Qt: Użyj console.log console.debug, console.info, konsola.ostrzeżenie lub błąd konsoli.do drukowania informacji o debugowaniu na konsoli. Należy się spodziewać, że magazyn poziomu BŁĘDÓW, aby można go przefiltrować w funkcji qtLogMessageHandler (), jak wskazano powyżej, aby przejść z rejestru systemowego. Rozważmy poziom dziennika Qt QtCriticalMsg, QtFatalMsg, QtSystemMsg i zobaczymy, co z nich wynika z dziennika, który chcesz przekierować. To założenie, ale, jak zwykle, pełna historia Qt jest taki.
Alexander V

W innych językach

Ta strona jest w innych językach

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