簡體   English   中英

將QtDebug重定向到Logstash

[英]Redirect QtDebug to Logstash

是否有最佳實踐將QtDebug重定向到logstash?

我的移動設備通過qDebug()寫入日志。
我想將所有日志匯總到logstash,然后再匯總到Google大查詢。

當前我的日志記錄如下。

void SignUpDialog::signUp(QString email, QString password) {
    qDebug() << "singUp " << email

我正在尋找諸如qt的appender。

看看有關QtMsgHandler的官方文檔

您需要使用qInstallMsgHandler函數安裝消息處理程序,然后將其重定向。

#include <QtGlobal>
#include <stdio.h>
#include <stdlib.h>

void myMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
    QByteArray localMsg = msg.toLocal8Bit();
    switch (type) {
    case QtDebugMsg:
        // Do whatever you need
        break;
    case QtInfoMsg:
        // Do whatever you need
        break;
    ...
    case QtFatalMsg:
        // Do whatever you need
        abort();
    }
}

int main(int argc, char **argv) {
    qInstallMessageHandler(myMessageHandler); 
    QApplication app(argc, argv);
    ...
    return app.exec();
}

要重定向您的請求,您將需要使用現有的客戶端或編寫自己的客戶端以將不同的事件發送到Logstash API。

我認為一種解決方案是在您的Qt app main中安裝消息處理程序(此處使用邏輯來防止日志無限增長,運行數和時間戳):

void msgHandler(QtMsgType type, const QMessageLogContext &/*context*/, const QString &msg)
{
    static int i = 0;
    static QString fp = "/tmp/qtapp.log";
    static QFile f(fp);
    if (!f.isOpen()) {
        f.open(QIODevice::WriteOnly | QIODevice::Append);
    }
    static QTextStream ts(&f);
    QString t;
    switch (type) {
    case QtDebugMsg:
        t = QString("Debug (%1): %2").arg(++i, 0, 10).arg(msg);
        break;
    case QtInfoMsg:
        t = QString("Info (%1): %2").arg(++i, 0, 10).arg(msg);
        break;
    case QtWarningMsg:
        t = QString("Warning (%1): %2").arg(++i, 0, 10).arg(msg);
        break;
    case QtCriticalMsg:
        t = QString("Critical (%1): %2").arg(++i, 0, 10).arg(msg);
        break;
    case QtFatalMsg:
        t = QString("Fatal (%1): %2").arg(++i, 0, 10).arg(msg);
        break;
    default:
        break;
    }

    QTime time = QDateTime::currentDateTime().time();
    t = time.toString("hh:mm:ss.zzz") + " " + t;

    ts << t << endl;
    fprintf(stderr, "%s\n", t.toStdString().c_str());

    QString fpo(fp + QString(".old"));
    if (f.size() > 65011712) {
        f.close();
        QFile::remove(fpo);
        QFile::rename(fp, fpo);
    }
}

int main(int argc, char *argv[])
{
    qInstallMessageHandler(msgHandler);

Logstash文件輸入(只是用谷歌搜索,沒有嘗試):

input {
  file {
    path => "/tmp/qtapp.log"
    type => "qtapp-access"
    start_position => "beginning"
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM