Qt/QML: cum să redirecționeze consola de ieșire la syslog

0

Problema

Am o QtQuick/QML aplicație care rulează pe un remote embedded sistem țintă. Am syslog configurat pe țintă pentru a direcționa mesajele de jurnal de la un server de jurnal.

Acum, aș vrea să am ieșirea standard și err consola de ieșire, de asemenea, redirecționat la locale syslog așa că am putea obține toate feedback-ul de aplicare într-un singur loc.

Există un "cele mai bune practici" mod de a face acest lucru? Sau va vreau/trebuie să obțină toate această ieșire în aplicația și conectați-l prin "canalele normale"?

Edit: nu pot face acest lucru cu bash redirecționare pe acest întrebare/răspuns, dar aș prefera să-l faci din cadrul aplicației, dacă este posibil.

Edit: cred că ar trebui să facă mai clar că nu te întreb despre cum să obțineți mesaje care trec prin cererea de înregistrare API pentru a merge la syslog. Dacă există erori în QtQuick QML, Qt generează eroare și mesaje de avertizare care sa tipărite la stderr. Sunt acele mesaje care doresc pentru a obține redirecționat la sistem de exploatarea instalației.

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

Cel mai bun răspuns

2

Cont de faptul că toate Qt și QML jurnal vor fi transmise prin intermediul acestui canal.

#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

Nu am încercat să alcătuiască dar a compus această soluție cu referire la proiectele mele. Buna semantica este, desigur, depinde de aplicație, dar probabil toate se poate face în main.cpp pentru că Qt/QML obiect înainte de a app.exec() apel.
Alexander V

Cred că ar trebui să facă mai clar că nu te întreb despre cum să obțineți mesaje care trec prin cererea de înregistrare API pentru a merge la syslog. Dacă există erori în QtQuick QML, Qt generează eroare și mesaje de avertizare care sa tipărite la stderr. Sunt acele mesaje care doresc pentru a obține redirecționat la sistem de exploatarea instalației. Voi edita/rafina meu mesaj original, pentru mai multă claritate.
alpartis

De Qt docs: Utilizați consola.jurnal, consolă.debug, console.info, consolă.warn, sau consola.eroare la imprimare depanare informații de la consola. Ar trebui să ne așteptăm la nivel de EROARE log astfel încât ai putea filtru care în qtLogMessageHandler funcția() ca mai sus pentru a merge prin syslog. Ia în considerare Qt log nivel de QtCriticalMsg, QtFatalMsg, QtSystemMsg și a vedea care unul este ridicat din cauza jurnal, puteți încerca să redirecționeze. Aceasta este o presupunere, dar, în general, toate Qt jurnal este așa.
Alexander V

În alte limbi

Această pagină este în alte limbi

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