Qt/QML: cómo redirigir la salida de la consola para syslog

0

Pregunta

Tengo un QtQuick/QML aplicación que se ejecuta en un remoto incorporado sistema de destino. He syslog configurado en el objetivo de dirigir los mensajes de registro a un servidor de registro.

Ahora, me gustaría tener la salida estándar y err a la salida de la consola también redirige a los locales de syslog para que yo pueda llegar a todos mis comentarios sobre las aplicaciones en un solo lugar.

Es allí una de las "mejores prácticas" manera de hacer esto? O se me quiere/necesita para obtener todos estos resultados dentro de mi aplicación y registro a través de "canales habituales"?

Edit: yo puedo hacer esto con bash redirección por esta pregunta/respuesta, pero yo preferiría hacerlo desde dentro de la aplicación, si es posible.

Edit: supongo que debería hacer más clara de que no estoy preguntando acerca de cómo obtener los mensajes que pasan a través de la aplicación del API de registro para ir a syslog. Si hay errores en mi QtQuick QML, la Qt tiempo de ejecución genera mensajes de error y advertencia que conseguir en stderr. Se trata de los mensajes que quiero conseguir redirigido al sistema de registro de instalación.

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

Mejor respuesta

2

Teniendo en cuenta que todos Qt y QML registro será transmitido a través de este 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

Yo no trato de compilar, pero sólo compuso esta solución citando a partir de mis proyectos. La correcta semántica es, por supuesto, dependen de la aplicación, pero es probable que se puede hacer en main.cpp para que Qt/QML objeto antes de app.exec() de la llamada.
Alexander V

Supongo que debería hacer más clara de que no estoy preguntando acerca de cómo obtener los mensajes que pasan a través de la aplicación del API de registro para ir a syslog. Si hay errores en mi QtQuick QML, la Qt tiempo de ejecución genera mensajes de error y advertencia que conseguir en stderr. Se trata de los mensajes que quiero conseguir redirigido al sistema de registro de instalación. Voy a editar/refinar mi post original para más claridad.
alpartis

De Qt docs: Uso de la consola.registro de la consola.de depuración, console.info en consola.advertir, o de la consola.error al imprimir la información de depuración a la consola. Debemos esperar que el nivel de ERRORES en el registro por lo que podría filtro que en qtLogMessageHandler() función que el anterior para ir a través de syslog. Considere la posibilidad de Qt nivel de registro de QtCriticalMsg, QtFatalMsg, QtSystemMsg y ver cual es elevado debido a registro intenta redirigir. Esta es una suposición pero en general todas las Qt registro es como que.
Alexander V

En otros idiomas

Esta página está en otros idiomas

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