stdout을 stderr로 리디렉션하는 방법

스플래 튼

JavaScript도 사용하는 C ++ QT 응용 프로그램으로 작업하고 있습니다. C ++에서는 qDebug 함수를 사용하고 qInstallMessageHandler로 모든 데이터를 캡처합니다.

이것은 stderr로 향하는 모든 것을 캡처합니다. JavaScript에서 stdout에 데이터를 쓰는 console.info를 사용하고 있습니다.

내가 원하는 것은 console.info에 의해 작성된 모든 메시지가 동일한 메시지 처리기로 들어가도록 stdout을 stderr로 리디렉션하는 것입니다.

void qDebugMsgHandler(QtMsgType type, const QMessageLogContext& context, const QString& strMsg) {
    QString strOutput;

    if ( context.file ) {
        strOutput += QString(context.file);

        if ( context.function ) {
            if ( context.line > 0 ) {
                strOutput += QString(" L%1").arg(context.line, 8, 10, QChar('0')) + QString(":");
           }
            strOutput += QString(context.function);
        }
    }
    if ( strMsg.length() > 0 ) {
        if ( strOutput.length() > 0 ) {
            strOutput += ": ";
        }
        strOutput += strMsg;
    }
    switch( type ) {
    case QtDebugMsg:
        fprintf(stderr, "   Debug:%s\n", strOutput.toLatin1().data());
        break;
    case QtInfoMsg:
        fprintf(stderr, "    Info:%s\n", strOutput.toLatin1().data());
        break;
    case QtWarningMsg:
        fprintf(stderr, " Warning:%s\n", strOutput.toLatin1().data());
        break;
    case QtCriticalMsg:
        fprintf(stderr, "Critical:%s\n", strOutput.toLatin1().data());
        break;
    case QtFatalMsg:
        fprintf(stderr, "   Fatal:%s\n", strOutput.toLatin1().data());
        break;
    }
    fflush(stderr);
}
스플래 튼

내 목적을 위해 JavaScript, C ++ 프로토 타입에서 호출 할 수있는 호출 가능한 루틴을 C ++로 만들었습니다.

Q_INVOKABLE void log(QString strMsg, QString strFile, long ulngLine);

C ++ 구현 :

void clsScriptHelper::log(QString strMsg, QString strFile, long ulngLine) {
    QJsonObject json;
    json["file"] = strFile;
    json["line"] = QString("%1").arg(ulngLine);
    json["msg"] = strMsg;
    json["type"] = QString("%1").arg(QtDebugMsg);
    qDebug() << json;
}

JavaScript에서 객체 참조 "api"를 통해 내 C ++ 계층을 노출 한 다음 로그 루틴을 호출합니다.

api.log("Testing", "SomeFile.js", 99);

이제 메시지 핸들러는 다음과 같습니다.

void qDebugMsgHandler(QtMsgType type, const QMessageLogContext& context, const QString& strMsg) {
    static const QString scstrQJSONObject("QJsonObject(");

    QString strFile, strFunction, strInfo, strOutput;
    long lngLine = 0;

    switch( type ) {
    case QtDebugMsg:
        strOutput = "   Debug:";
        break;
    case QtInfoMsg:
        strOutput = "    Info:";
        break;
    case QtWarningMsg:
        strOutput = " Warning:";
        break;
    case QtCriticalMsg:
        strOutput = "Critical:";
        break;
    case QtFatalMsg:
        strOutput = "   Fatal:";
        break;
    }
    if ( strMsg.startsWith(scstrQJSONObject) ) {
//Message contains a JSON object, extract the details
        int intLength = strMsg.length() - (scstrQJSONObject.length() + 1);
        QString strJSON = strMsg.mid(scstrQJSONObject.length(), intLength);
        QJsonDocument objDoc = QJsonDocument::fromJson(strJSON.toUtf8());

        if ( objDoc.isNull() ) {
            return;
        }
        QJsonObject objJSON = objDoc.object();
        strFile = objJSON.take("file").toString();
        lngLine = static_cast<long>(objJSON.take("line").toDouble());
        strInfo = objJSON.take("msg").toString();
        type = static_cast<QtMsgType>(objJSON.take("type").toInt());
    } else {
        strFile = QString(context.file);

        if ( context.function ) {
            strFunction = QString(context.function);
        }
        if ( context.line > 0 ) {
            lngLine = context.line;
        }
        strInfo = strMsg;
    }
    if ( strFile.length() > 0 ) {
        strOutput += strFile;
    }
    if ( lngLine > 0 ) {
        strOutput += QString(" L%1").arg(lngLine, 8, 10, QChar('0')) + QString(":");
    }
    if ( strFunction.length() > 0 ) {
        strOutput += strFunction;
    }
    if ( strInfo.length() > 0 ) {
        if ( strOutput.length() > 0 ) {
            strOutput += ": ";
        }
        strOutput += strInfo;
    }
    std::cout << strOutput.toLatin1().data() << std::endl << std::flush;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

STDERR을 파일과 콘솔로 리디렉션하고 STDOUT을 파일로만 리디렉션하는 방법

분류에서Dev

stderr 및 stdout을 동일한 파일로 리디렉션하는 방법

분류에서Dev

stdout을 파일로 리디렉션하고 stdout + stderr을 다른 파일로 리디렉션하는 방법은 무엇입니까?

분류에서Dev

systemd : stdout을 로그 파일로 리디렉션하는 방법

분류에서Dev

stderr 및 stdout의 일부를 / dev / null로 리디렉션하는 방법

분류에서Dev

stdout 및 stderr를 파일로 리디렉션하는 POSIX 호환 방법

분류에서Dev

stderr을 stdout으로 리디렉션 한 다음 파이프 (apt-cache)하는 방법

분류에서Dev

C 프로그램에서 STDOUT을 STDIN으로 리디렉션하는 방법

분류에서Dev

stdout 및 stderr을 파일로, stderr을 stdout으로 리디렉션

분류에서Dev

명령의`stdin`과`stdout`을 출력으로 리디렉션하는 방법

분류에서Dev

stdout을 오른쪽에서 왼쪽으로 리디렉션하는 방법

분류에서Dev

명령의`stdin`과`stdout`을 출력으로 리디렉션하는 방법

분류에서Dev

Linux : stdout 및 stderr를 로거로 리디렉션하는 방법은 무엇입니까?

분류에서Dev

stdout을 tcsh의 stderr로 리디렉션

분류에서Dev

터미널에서 stdout 및 stderr을 systemd의 저널로 리디렉션하는 프로그램을 실행하는 방법은 무엇입니까?

분류에서Dev

변수에서 stderr을 리디렉션하지만 콘솔에서 stdout을 유지하는 방법

분류에서Dev

stderr를 파일로 리디렉션하고 일부 에코 (stdout 아님)를 동일한 파일로 리디렉션하는 방법

분류에서Dev

macOS : 터미널을 사용하여 시작된 후 프로세스의 STDERR / STDOUT을 리디렉션하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 Gtk.Window () 호출의 stderr / stdout을 리디렉션하는 방법은 무엇입니까?

분류에서Dev

bash에서 stdin과 stdout 및 stderr을 동시에 리디렉션하는 방법은 무엇입니까?

분류에서Dev

stderr 및 stdout을 다른 파일로 리디렉션하고 터미널에 표시하는 방법은 무엇입니까?

분류에서Dev

stderr 및 stdout을 다른 파일로 리디렉션하고 터미널에 표시하는 방법은 무엇입니까?

분류에서Dev

stdout과 stderr을 bash 스크립트 내에서 파일로 리디렉션하는 방법은 무엇입니까?

분류에서Dev

명령이 변수로 전달 될 때 명령 대체와 함께 stdout / stderr 리디렉션을 포함하는 방법은 무엇입니까?

분류에서Dev

stdout 및 / 또는 stderr을 변수의 경로로 리디렉션

분류에서Dev

stdout 및 stderr를 파일로 리디렉션하고 stderr를 콘솔에 표시하는 방법은 무엇입니까?

분류에서Dev

버퍼없이 stderr을 파일로 리디렉션하는 방법은 무엇입니까?

분류에서Dev

Unix : 실행중인 모든 프로세스의 stdout을 수정하고 리디렉션하는 방법

분류에서Dev

stdout 및 stdin을 텔넷으로 리디렉션하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    STDERR을 파일과 콘솔로 리디렉션하고 STDOUT을 파일로만 리디렉션하는 방법

  2. 2

    stderr 및 stdout을 동일한 파일로 리디렉션하는 방법

  3. 3

    stdout을 파일로 리디렉션하고 stdout + stderr을 다른 파일로 리디렉션하는 방법은 무엇입니까?

  4. 4

    systemd : stdout을 로그 파일로 리디렉션하는 방법

  5. 5

    stderr 및 stdout의 일부를 / dev / null로 리디렉션하는 방법

  6. 6

    stdout 및 stderr를 파일로 리디렉션하는 POSIX 호환 방법

  7. 7

    stderr을 stdout으로 리디렉션 한 다음 파이프 (apt-cache)하는 방법

  8. 8

    C 프로그램에서 STDOUT을 STDIN으로 리디렉션하는 방법

  9. 9

    stdout 및 stderr을 파일로, stderr을 stdout으로 리디렉션

  10. 10

    명령의`stdin`과`stdout`을 출력으로 리디렉션하는 방법

  11. 11

    stdout을 오른쪽에서 왼쪽으로 리디렉션하는 방법

  12. 12

    명령의`stdin`과`stdout`을 출력으로 리디렉션하는 방법

  13. 13

    Linux : stdout 및 stderr를 로거로 리디렉션하는 방법은 무엇입니까?

  14. 14

    stdout을 tcsh의 stderr로 리디렉션

  15. 15

    터미널에서 stdout 및 stderr을 systemd의 저널로 리디렉션하는 프로그램을 실행하는 방법은 무엇입니까?

  16. 16

    변수에서 stderr을 리디렉션하지만 콘솔에서 stdout을 유지하는 방법

  17. 17

    stderr를 파일로 리디렉션하고 일부 에코 (stdout 아님)를 동일한 파일로 리디렉션하는 방법

  18. 18

    macOS : 터미널을 사용하여 시작된 후 프로세스의 STDERR / STDOUT을 리디렉션하는 방법은 무엇입니까?

  19. 19

    파이썬에서 Gtk.Window () 호출의 stderr / stdout을 리디렉션하는 방법은 무엇입니까?

  20. 20

    bash에서 stdin과 stdout 및 stderr을 동시에 리디렉션하는 방법은 무엇입니까?

  21. 21

    stderr 및 stdout을 다른 파일로 리디렉션하고 터미널에 표시하는 방법은 무엇입니까?

  22. 22

    stderr 및 stdout을 다른 파일로 리디렉션하고 터미널에 표시하는 방법은 무엇입니까?

  23. 23

    stdout과 stderr을 bash 스크립트 내에서 파일로 리디렉션하는 방법은 무엇입니까?

  24. 24

    명령이 변수로 전달 될 때 명령 대체와 함께 stdout / stderr 리디렉션을 포함하는 방법은 무엇입니까?

  25. 25

    stdout 및 / 또는 stderr을 변수의 경로로 리디렉션

  26. 26

    stdout 및 stderr를 파일로 리디렉션하고 stderr를 콘솔에 표시하는 방법은 무엇입니까?

  27. 27

    버퍼없이 stderr을 파일로 리디렉션하는 방법은 무엇입니까?

  28. 28

    Unix : 실행중인 모든 프로세스의 stdout을 수정하고 리디렉션하는 방법

  29. 29

    stdout 및 stdin을 텔넷으로 리디렉션하는 방법은 무엇입니까?

뜨겁다태그

보관