Qt/QML: como redirecionar a saída do console para syslog

0

Pergunta

Eu tenho um QtQuick/QML aplicativo em execução em um controle remoto embutido sistema de destino. Eu tenho syslog configurado no alvo para direcionar as mensagens de log para um servidor de log.

Agora, eu gostaria de ter o padrão e a mensagem de saída do console também redirecionado para o local syslog para que eu possa obter todos os meus comentários sobre aplicativos em um só lugar.

Existe um "melhores práticas" maneira de fazer isso? Ou será que eu quiser/precisar de obter tudo isto saída de dentro da minha aplicação e o registro através de "canais normais"?

Edit: eu posso fazer isso com o bash redirecionamento por esta pergunta/resposta, mas eu ainda preferem fazê-lo a partir de dentro do aplicativo, se possível.

Edit: acho que deveria fazer mais claro que eu não estou perguntando sobre como obter as mensagens que passam através da aplicação de API de log para ir para o syslog. Se há erros na minha QtQuick software livre, o Qt tempo de execução gera mensagens de erro e aviso impresso para o stderr. É a essas mensagens que eu quero fazer redireccionado para o sistema de registro.

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

Melhor resposta

2

Mente que todos Qt e QML de log serão transmitidos através deste 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

Que eu não tente compilar, mas apenas compôs esta solução citando meus projetos. O bom semântica é claro que depende da aplicação, mas provavelmente tudo pode ser feito em main.cpp para que o Qt/QML objeto antes de app.exec() chamada.
Alexander V

Acho que deveria fazer mais claro que eu não estou perguntando sobre como obter as mensagens que passam através da aplicação de API de log para ir para o syslog. Se há erros na minha QtQuick software livre, o Qt tempo de execução gera mensagens de erro e aviso impresso para o stderr. É a essas mensagens que eu quero fazer redireccionado para o sistema de registro. Vou editar/refinar o meu post original, para mais clareza.
alpartis

A partir de Qt docs: Uso do console.log do console.depuração, console.info um console.avisar ou console.erro imprimir informações de depuração no console. Devemos esperar que o nível de ERRO de log, assim você pode filtrar isso em qtLogMessageHandler() a função acima para ir através do syslog. Considere Qt nível de log de QtCriticalMsg, QtFatalMsg, QtSystemMsg e ver qual é aumentada devido ao registo de tentar redirecionar. Esta é uma hipótese, mas geralmente todos Qt registo é assim.
Alexander V

Em outros idiomas

Esta página está em outros idiomas

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