Qt / QML: konsol çıktısını syslog'a yönlendirme

0

Soru

Uzak gömülü bir hedef sistemde çalışan bir QtQuick / QML uygulamam var. Günlük iletilerini bir günlük sunucusuna yönlendirmek için hedef üzerinde yapılandırılmış syslog'um var.

Şimdi, tüm uygulama geri bildirimlerimi tek bir yerde alabilmem için standart çıkış ve err konsol çıktısının da yerel syslog'a yönlendirilmesini istiyorum.

Bunu yapmanın "en iyi uygulamalar" yolu var mı? Yoksa tüm bu çıktıları uygulamamda elde etmek ve "normal kanallar" üzerinden günlüğe kaydetmek mi istiyorum/ihtiyacım olacak?

Düzenleme: Bunu, bu soru/cevap başına bash yönlendirmesi ile yapabilirim, ancak mümkünse yine de uygulamanın içinden yapmayı tercih ederim.

Düzenleme: Sanırım, syslog'a gitmek için uygulamanın günlük apı'sinden geçen iletilerin nasıl alınacağını sormadığımı daha açık bir şekilde belirtmeliyim. QtQuick qml'mde hatalar varsa, Qt çalışma zamanı stderr'ye yazdırılan hata ve uyarı iletileri üretir. Sistem günlüğü tesisine yönlendirilmek istediğim mesajlar bunlar.

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

En iyi cevabı

2

Tüm Qt ve QML günlüklerinin bu kanal üzerinden yayınlanacağını unutmayın.

#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

Derlemeye çalışmadım, sadece projelerimden alıntı yaparak bu çözümü oluşturdum. Doğru anlambilim elbette uygulamaya bağlıdır, ancak büyük olasılıkla her şey temelde yapılabilir.daha önce bu Qt / QML nesnesi için cpp app.exec() çağrı.
Alexander V

Sanırım, syslog'a gitmek için uygulamanın günlük apı'sinden geçen mesajların nasıl alınacağını sormadığımı daha açık bir şekilde belirtmeliyim. QtQuick qml'mde hatalar varsa, Qt çalışma zamanı stderr'ye yazdırılan hata ve uyarı iletileri üretir. Sistem günlüğü tesisine yönlendirilmek istediğim mesajlar bunlar. Daha fazla netlik için orijinal gönderimi düzenlerim / hassaslaştırırım.
alpartis

Qt dokümanlarından: Konsolu kullanın.kayıt, konsol.hata ayıklama, console.info, konsol.uyar veya teselli et.hata ayıklama bilgilerini konsola yazdırma hatası. HATA düzeyi günlüğünü beklemeliyiz, böylece syslog'dan geçmek için yukarıdaki gibi qtLogMessageHandler() işlevinde filtreleyebilirsiniz. QtCriticalMsg, QtFatalMsg, QtSystemMsg Qt günlük düzeyini göz önünde bulundurun ve yönlendirmeye çalıştığınız günlük nedeniyle hangisinin yükseltildiğini görün. Bu bir varsayımdır, ancak genel olarak tüm Qt günlüğü böyledir.
Alexander V

Diğer dillerde

Bu sayfa diğer dillerde

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