QT および QML でのロギング (デバッグ) を無効にする

QT では、 qDebug.h のいくつかの関数を使用できます qDebug() のようなヘッダー と qWarning() 情報をコンソールに記録します。 QML では console.log() などを使用できます 、 console.error() .独自のロガーを実装するのも非常に簡単です (例:SyslogMessageHandler ) syslog やコンソールへのロギングなど、別の方法が必要な場合。この投稿では、リリース ビルドで両方の形式のロギングを無効にする方法を紹介します。qml と qt では、出力を管理する方法が異なります。

QT_NO_DEBUG_OUTPUT を定義するために主に提案されたオンライン情報 、しかしそれはQMLロギングを無効にできませんでした。私のサンプルプロジェクトに独自の MessageHandler があったためかどうかはわかりません 、しかし、最終的にすべてを無効にする方法を見つけました。

デバッグと qml ロギングに関する QT のドキュメント ページは役に立ちますが、多くの場合、それらのドキュメントと同様に非常に包括的であるため、特定の 1 つのことを行う方法を見つけるのは簡単ではありません。この場合、リリース ビルドでロギングを無効にするだけです。 /P>

QT ログを無効にする

.pro で ファイルに次の行を追加します:

# 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

各フラグは、適切な qLog() を無効にします メソッド、たとえば QT_NO_DEBUG_OUTPUT qDebug() を無効にします .

.pro を編集した後 ファイルを削除したら、忘れずにプロジェクトを消去して再構築してください。

なぜ CONFIG(release): だけではないのか ?複数のオプションがある場合、これは最後のオプションが release の場合にのみトリガーされます .

CONFIG(release, debug|release) true に評価されます CONFIG の場合 release を含む debug ではありません 、または debug の両方が含まれている場合 と release しかし debug release が最後に出現した後は表示されません .例:

CONFIG += release debug release

最後の debug 最後の debug の後に来る 、 CONFIG(release, debug|release) true です .

QML ロギングを無効にする

main.cppQLoggingCategory を含める ヘッダー:

#include <QLoggingCategory>

他のロギング ハンドラの前 (qInstallMessageHandler() など) )、次のコードを追加します:

#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 リリース ビルドのコンパイル時に QT によって自動的にエクスポートされます。フィルター ルールを使用すると、いつ、どこでログに記録するかをより詳細に制御できますが、このコードは重要なもの以外をすべて無効にするだけです。改行で区切る必要があります (\n メソッド パラメーター内)、カンマは機能しません。

fprintf 行は省略可能ですが、何が起こっているのか、いつログが記録されているのか、いつログが無効になっているのかを知るのに役立ちます.

#if defined(QT_NO_DEBUG_OUTPUT) を使ってみた より詳細な制御を確認しますが、機能しませんでした。すべてのコンパイル (デバッグまたはリリース) でロギングが無効になりましたが、その理由は不明であり、あまり掘り下げませんでした。

もう 1 つの方法は、環境変数を使用することです。ここで彼らは次のフラグを提案します:

QT_LOGGING_RULES=qml=false

これは私にとってはうまくいきませんでした。コマンドラインまたは main.cpp でエクスポートされました 以下のように:

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

あなたのマイレージは異なる場合があります。うまくいく場合は、お知らせください。