繁体   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