Qt/QML: jak přesměrovat výstup na konzoli do syslog

0

Otázka

Mám QtQuick/QML aplikace běží na vzdáleném embedded cílového systému. Mám syslog nakonfigurován na cíl přímé zprávy protokolu do protokolu serveru.

Teď bych chtěl mít standardní a err výstup na konzoli rovněž přesměrován na místní syslog, takže mohu dostat všechny své aplikace, zpětná vazba v jednom místě.

Existuje "nejlepší praxe" způsob, jak to udělat? Nebo budu chtít/muset získat všechny tento výstup v mé aplikaci a přihlaste se přes "normální cestou"?

Edit: můžu to udělat s bash přesměrování na tuto otázku/odpověď, ale přesto bych raději to udělat přímo z aplikace, pokud je to možné.

Edit: předpokládám, že bych měl dělat více jasné, že nežádám o tom, jak získat zprávy, které jdou prostřednictvím aplikace protokolování rozhraní API jít do syslog. Pokud tam jsou chyby v QtQuick QML, Qt runtime generuje chyby a varovné zprávy, které se tisknout na stderr. To jsou ty zprávy, které jsem se chtějí dostat přesměrováni na systém protokolování zařízení.

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

Nejlepší odpověď

2

Paměti, že všechny Qt a QML log bude přenášen přes tento kanál.

#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

Jsem se nesnažil sestavit, ale jen skládá takové řešení, které cituje z mých projektů. Správná sémantika je samozřejmě závisí na aplikaci, ale pravděpodobně vše může být provedeno v main.cpp pro Qt/QML objekt před app.exec() volání.
Alexander V

Předpokládám, že bych měl dělat více jasné, že nežádám o tom, jak získat zprávy, které jdou prostřednictvím aplikace protokolování rozhraní API jít do syslog. Pokud tam jsou chyby v QtQuick QML, Qt runtime generuje chyby a varovné zprávy, které se tisknout na stderr. To jsou ty zprávy, které jsem se chtějí dostat přesměrováni na systém protokolování zařízení. Budu upravit/vylepšit můj původní příspěvek, pro větší přehlednost.
alpartis

Z Qt docs: Použití konzoly.log konzole.ladění, console.info konzola.varovat, nebo konzole.chyba tisku informace o ladění do konzole. Měli bychom očekávat, že úroveň CHYBY log, takže si můžete filtrovat že v qtLogMessageHandler() funkce jako výše jít přes syslog. Zvažte Qt log úroveň QtCriticalMsg, QtFatalMsg, QtSystemMsg a vidět, který z nich je zvýšena vzhledem k protokolu pokusu o přesměrování. To je předpoklad, ale obecně všechny Qt log je jako, že.
Alexander V

V jiných jazycích

Tato stránka je v jiných jazycích

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