Qt/QML: come reindirizzare l'output della console syslog

0

Domanda

Ho un QtQuick/QML applicazione in esecuzione su un computer remoto incorporato sistema di destinazione. Ho syslog configurato sul target per indirizzare i messaggi di log di un server di log.

Ora, mi piacerebbe avere lo standard di uscita e il messaggio di output della console anche reindirizzati al locale syslog in modo da poter ottenere tutti i miei feedback dell'applicazione in un unico luogo.

C'è una "best practice" di fare questo? O sarà che ho voglia/bisogno di ottenere tutto ciò di uscita all'interno della mia applicazione e accedere, attraverso "canali normali"?

Edit: posso fare questo con bash reindirizzamento per questa domanda/risposta, ma preferirei farlo dall'interno dell'applicazione, se possibile.

Edit: suppongo che dovrebbe rendere più chiaro che io non sto chiedendo su come ottenere i messaggi che passano attraverso l'applicazione di registrazione API per andare a syslog. Se ci sono errori nel mio QtQuick QML, Qt runtime genera l'errore e messaggi di avviso che vengono stampati su stderr. Si tratta di quei messaggi che voglio ottenere reindirizzato al sistema di registrazione.

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

Migliore risposta

2

Mente che tutte le Qt e QML registro verrà trasmesso attraverso questo canale.

#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

Non ho provato a compilare ma solo composta questa soluzione citando i miei progetti. La corretta semantica è chiaramente dipende l'applicazione, ma è probabile che tutto questo può essere fatto in main.cpp per Qt/QML oggetto prima app.exec() chiamata.
Alexander V

Io vorrei chiarire che non sto chiedendo su come ottenere i messaggi che passano attraverso l'applicazione di registrazione API per andare a syslog. Se ci sono errori nel mio QtQuick QML, Qt runtime genera l'errore e messaggi di avviso che vengono stampati su stderr. Si tratta di quei messaggi che voglio ottenere reindirizzato al sistema di registrazione. Io modificare/perfezionare il mio post originale per maggiore chiarezza.
alpartis

Da Qt documenti: per l'Uso della console.log della console.debug, console.info, console.in guardia, o console.errore di stampa le informazioni di debug della console. Dovremmo aspettarci un livello di ERRORE del registro, in modo si potrebbe applicare un filtro che in qtLogMessageHandler() funzione come sopra per passare attraverso syslog. Considerare Qt livello di log di QtCriticalMsg, QtFatalMsg, QtSystemMsg e vedere uno che è cresciuto a causa di log si tenta di reindirizzare. Questa è un'ipotesi, ma in generale tutte le Qt log è così.
Alexander V

In altre lingue

Questa pagina è in altre lingue

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