Qt/QML: comment faire pour rediriger la sortie de la console vers syslog

0

La question

J'ai un QtQuick/QML application en cours d'exécution sur une distance intégré système cible. J'ai syslog configuré sur la cible directe des messages de log d'un serveur de journal.

Maintenant, j'aimerais avoir la norme out et err sortie de la console aussi redirigé vers le local syslog afin que je puisse obtenir tous les de mon retour sur les applications en un seul endroit.

Est-il un "meilleures pratiques" façon de le faire? Ou vais-je vouloir/besoin d'obtenir toutes cette sortie à l'intérieur de ma demande et de l'enregistrer par le biais de "voie normale"?

Edit: je peux le faire avec bash redirection par cette question/réponse, mais je préfère encore le faire à partir de l'intérieur de l'application, si possible.

Edit: je suppose que je devrais faire plus clair que je ne suis pas de poser sur la façon d'obtenir les messages qui passent par l'application de l'API de journalisation pour aller à syslog. Si il y a des erreurs dans mon QtQuick QML, le Qt exécution génère l'erreur et les messages d'avertissement qui est imprimée vers stderr. Ce sont ces messages que je veux être redirigé vers le système de fonction de journalisation.

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

La meilleure réponse

2

L'esprit que tous les Qt et QML journal sera diffusé par le biais de ce 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

Je n'ai pas essayer de le compiler, mais juste composé cette solution, en citant mes projets. La bonne sémantique est bien sûr, dépend de l'application, mais probablement tout peut être fait en main.cpp pour que Qt/QML objet avant app.exec() appel.
Alexander V

Je suppose que je devrais faire plus clair que je ne suis pas de poser sur la façon d'obtenir les messages qui passent par l'application de l'API de journalisation pour aller à syslog. Si il y a des erreurs dans mon QtQuick QML, le Qt exécution génère l'erreur et les messages d'avertissement qui est imprimée vers stderr. Ce sont ces messages que je veux être redirigé vers le système de fonction de journalisation. Je vais modifier/affiner mon premier post pour plus de clarté.
alpartis

À partir de Qt docs: Utilisation de la console.journal de la console.debug, console.info console.avertir, ou à la console.erreur d'imprimer les informations de débogage à la console. Nous devrions nous attendre à niveau d'ERREUR du journal de sorte que vous pouvez filtrer que dans qtLogMessageHandler() fonction que ci-dessus pour passer par syslog. Envisager de Qt niveau de journal de QtCriticalMsg, QtFatalMsg, QtSystemMsg et de voir celui qui est soulevé en raison de journal vous essayez de rediriger. C'est une hypothèse, mais généralement tous les Qt journal est comme ça.
Alexander V

Dans d'autres langues

Cette page est dans d'autres langues

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