Protokollierung in QT und QML deaktivieren (debuggen).

 C Programming >> C-Programmierung >  >> Tags >> Qt
Protokollierung in QT und QML deaktivieren (debuggen).

In QT können Sie einige Funktionen aus dem qDebug.h verwenden Header wie qDebug() und qWarning() um Informationen in der Konsole zu protokollieren. In QML können Sie beispielsweise console.log() verwenden , console.error() . Es ist auch sehr einfach, einen eigenen Logger zu implementieren (z. B. SyslogMessageHandler ), wenn Sie etwas anderes wollen, wie die Protokollierung in Syslog und die Konsole. In diesem Beitrag zeige ich Ihnen, wie Sie beide Formen der Protokollierung in einem Release-Build deaktivieren können. qml und qt haben unterschiedliche Möglichkeiten, ihre Ausgabe zu verwalten.

Online-Informationen schlugen meistens vor, QT_NO_DEBUG_OUTPUT zu definieren , aber das konnte die QML-Protokollierung nicht deaktivieren. Ich bin mir nicht sicher, ob das daran liegt, dass mein Beispielprojekt einen eigenen MessageHandler hatte , aber am Ende habe ich herausgefunden, wie ich alles deaktivieren kann.

Die QT-Dokumentationsseiten zum Debuggen und zum qml-Logging sind hilfreich, aber wie so oft bei ihrer Dokumentation ist sie so umfassend, dass es nicht einfach ist, herauszufinden, wie man nur eine bestimmte Sache macht, in diesem Fall nur das Deaktivieren der Protokollierung in einem Release-Build.

QT-Protokollierung deaktivieren

In Ihrem .pro Datei fügen Sie die folgenden Zeilen hinzu:

# Suppress logging output for release build.
CONFIG(release, debug|release): DEFINES += QT_NO_DEBUG_OUTPUT
CONFIG(release, debug|release): DEFINES += QT_NO_INFO_OUTPUT
CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT

Jedes Flag deaktiviert den entsprechenden qLog() Methode, zum Beispiel QT_NO_DEBUG_OUTPUT deaktiviert qDebug() .

Nach dem Bearbeiten Ihres .pro Denken Sie daran, Ihr Projekt zu bereinigen und neu zu erstellen.

Warum nicht einfach CONFIG(release): ? Wenn Sie mehrere Optionen haben, wird dies nur ausgelöst, wenn die letzte Option release ist .

CONFIG(release, debug|release) ergibt true wenn CONFIG enthält release aber nicht debug , oder wenn es beides debug enthält und release aber debug erscheint nicht nach dem letzten Vorkommen von release . Zum Beispiel:

CONFIG += release debug release

Denn die letzte debug kommt nach dem letzten debug , CONFIG(release, debug|release) ist true .

QML-Protokollierung deaktivieren

In main.cpp schließen Sie den QLoggingCategory ein Kopfzeile:

#include <QLoggingCategory>

Bevor Ihre anderen Logging-Handler (wie qInstallMessageHandler() ), fügen Sie diesen Code hinzu:

#ifdef QT_NO_DEBUG
    QLoggingCategory::setFilterRules("*.debug=false\n"
                                     "*.info=false\n"
                                     "*.warning=false\n"
                                     "*.critical=true");
    fprintf(stderr, "Disabling QML logging in release build.\n");
#else
    fprintf(stderr, "QML logging enabled.\n");
#endif

QT_NO_DEBUG wird automatisch von QT exportiert, wenn ein Release-Build kompiliert wird. Filterregeln ermöglichen mehr Kontrolle darüber, was wann und wo protokolliert wird, aber dieser Code deaktiviert nur alles außer kritischen. Es muss durch Zeilenumbruch getrennt werden (\n in den Methodenparametern), funktionieren Kommas nicht.

Die fprintf Die Zeile ist optional, hilft aber zu wissen, was vor sich geht und wann eine Protokollierung stattfindet und wann die Protokollierung deaktiviert ist.

Ich habe versucht, einen #if defined(QT_NO_DEBUG_OUTPUT) zu verwenden Suchen Sie nach einer genaueren Steuerung, die jedoch nicht funktioniert hat. Jede Kompilierung (Debug oder Release) deaktivierte das Logging, ich bin mir nicht sicher warum und grub auch nicht zu viel hinein.

Der andere Weg ist mit einer Umgebungsvariablen. Hier schlagen sie folgendes Flag vor:

QT_LOGGING_RULES=qml=false

Dies hat bei mir nicht funktioniert, sowohl auf der Befehlszeile als auch in main.cpp exportiert wie unten:

#ifdef QT_NO_DEBUG
   qputenv("QT_LOGGING_RULES", "qml=false");
#endif

Ihr Kilometerstand kann variieren. Wenn es für Sie funktioniert, lassen Sie es mich bitte wissen.