<QtLogging> - Qt Logging Types

<QtLogging> ヘッダーファイルは Qt のロギングタイプ、関数、マクロを定義しています。詳細...

Header: #include <QtLogging>

QtMessageHandler
enum QtMsgType { QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg }

関数

QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
void qSetMessagePattern(const QString &pattern)

マクロ

qCritical(const char *message, ...)
qDebug(const char *message, ...)
qFatal(const char *message, ...)
qInfo(const char *message, ...)
qWarning(const char *message, ...)

詳しい説明

<QtLogging> ヘッダファイルには、ロギングのためのいくつかの型、関数、マクロが含まれています。

QtMsgType enum は、Qt メッセージハンドラに生成・送信できる様々なメッセージを識別します。QtMessageHandler は、void myMessageHandler(QtMsgType, const QMessageLogContext &, const char *) というシグネチャを持つ関数へのポインタの型定義です。qInstallMessageHandler QtMessageHandler(QMessageLogContext クラスには、メッセージが記録された行、ファイル、関数が含まれます。この情報はQMessageLogger クラスによって作成されます。

<QtLogging> には、与えられた文字列引数からメッセージを生成する関数も含まれています:qDebug(),qInfo(),qWarning(),qCritical(),qFatal()。これらの関数は、与えられたメッセージでメッセージ・ハンドラを呼び出します。

if (!driver()->isOpen() || driver()->isOpenError()) {
    qWarning("QSqlQuery::exec: database not open");
    return false;
}

QLoggingCategoryも参照のこと

型定義

QtMessageHandler

これは、以下のシグネチャを持つ関数へのポインタの typedef である:

void myMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);

QtMsgType およびqInstallMessageHandler() も参照の こと。

enum QtMsgType

この列挙型は、メッセージ・ハンドラ (QtMessageHandler) に送信できるメッセージを記述します。この列挙型を使用して、さまざまなメッセージ・タイプを識別し、適切なアクショ ンと関連付けることができます。この列挙型の値は、重要度の高い順に次のとおりです:

定数説明
QtDebugMsg0qDebug() 関数によって生成されたメッセージ。
QtInfoMsg4qInfo() 関数によって生成されたメッセージ。
QtWarningMsg1qWarning() 関数によって生成されたメッセージ。
QtCriticalMsg2qCritical() 関数によって生成されたメッセージ。
QtFatalMsg3qFatal() 関数によって生成されたメッセージ。

QtMessageHandlerqInstallMessageHandler()、QLoggingCategoryも参照のこと

関数ドキュメント

QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)

type,context,str の引数からフォーマットされた文字列を生成します。

qFormatLogMessage は、現在のメッセージ・パターンに従ってフォーマットされたQString を返します。この関数は、Qtのデフォルトのメッセージ・ハンドラと同様に出力をフォーマットするために、カスタムのメッセージ・ハンドラで使用することができます。

この関数はスレッドセーフです。

qInstallMessageHandler() およびqSetMessagePattern()も参照してください

QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)

Qt メッセージhandler をインストールします。以前にインストールされたメッセージ・ハンドラへのポインタを返します。

メッセージハンドラは、Qt のロギング基盤からデバッグ、情報、警告、重要、致命的なメッセージを出力する関数です。デフォルトでは、Qt は標準のメッセージハンドラを使用し、オペレーティングシステムや Qt の設定に特化した異なるシンクにメッセージをフォーマットして出力します。独自のメッセージハンドラをインストールすることで、完全に制御することができ、例えば、ファイルシステムにメッセージを記録することができます。

Qt はlogging categories をサポートしており、関連するメッセージをセマンティックなカテゴリに分類することができます。これらを使って、カテゴリやmessage type ごとにロギングを有効/無効にすることができます。ロギング・カテゴリのフィルタリングはメッセージが作成される前に行われるので、無効なタイプやカテゴリのメッ セージはメッセージ・ハンドラに届きません。

メッセージ・ハンドラはreentrant である必要があります。つまり、異なるスレッドから並列に呼び出される可能性があります。そのため、共通のシンク(データベースやファイルなど)への書き込みは、しばしば同期させる必要があります。

Qt では、qSetMessagePattern() を呼び出すか、QT_MESSAGE_PATTERN 環境変数を設定することで、ロギングメッセージにさらなるメタ情報を付加することができます。このフォーマットを維持するために、カスタムメッセージハンドラはqFormatLogMessage() を使うことができます。

高価な処理はアプリケーションをブロックするかもしれないので、メッセージ・ハンドラ自体のコードは最小限に保つようにしてください。また、再帰を避けるために、メッセージ・ハンドラで生成されたロギング・メッセージは無視されます。

メッセージ・ハンドラは常にリターンを返すべきです。fatal messages の場合、そのメッセージを処理した後、アプリケーションはすぐに終了します。

アプリケーション全体に対して、一度にインストールできるメッセージ・ハンドラ は 1 つだけです。以前にカスタム・メッセージ・ハンドラがインストー ルされていた場合、この関数はそのハンドラへのポインタを返します。このハンドラは、後で別のメソッドを呼び出すことで再インストールできます。また、qInstallMessageHandler(nullptr) を呼び出すと、デフォルトのメッセージ・ハンドラが復元されます。

以下は、デフォルト・ハンドラを呼び出す前にローカル・ファイルにログを記録するメッセージ・ハンドラの例です:

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

QtMessageHandler originalHandler = nullptr;

void logToFile(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QString message = qFormatLogMessage(type, context, msg);
    static FILE *f = fopen("log.txt", "a");
    fprintf(f, "%s\n", qPrintable(message));
    fflush(f);

    if (originalHandler)
        *originalHandler(type, context, msg);
}

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

C++標準は、static FILE *f がスレッドセーフな方法で初期化されることを保証していることに注意してください。また、fprintf()fflush() もスレッドセーフであることが期待できるので、それ以上の同期は必要ない。

QtMessageHandlerQtMsgTypeqDebug()、qInfo()、qWarning()、qCritical()、qFatal()、デバッグ手法qFormatLogMessage()も参照の こと。

void qSetMessagePattern(const QString &pattern)

デフォルトのメッセージ・ハンドラの出力を変更する。

qDebug()、qInfo()、qWarning()、qCritical()、qFatal() の出力を微調整できる。qCDebug()、qCInfo()、qCWarning()、qCCritical() のカテゴリ・ログ出力もフォーマットされます。

以下のプレースホルダーがサポートされています:

プレースホルダー説明
%{appname}QCoreApplication::applicationName()
%{category}ロギング・カテゴリー
%{file}ソースファイルへのパス
%{function}機能
%{line}ソースファイルの行
%{message}実際のメッセージ
%{pid}QCoreApplication::applicationPid()
%{threadid}現在のスレッドのシステムワイドID(取得できる場合)
%{qthreadptr}現在のQThread へのポインタ (QThread::currentThread() の結果)
%{type}"debug"、"warning"、"critical"、または "fatal"
%{time process}プロセスが開始してから秒単位のメッセージの時間("process "というトークンはリテラルである)
%{time boot}判断できる場合は、メッセージの時刻をシステム起動からの秒数で表す("boot "というトークンはリテラル)。ブートからの時間が取得できなかった場合、出力は不定になる(QElapsedTimer::msecsSinceReference()を参照)。
%{time [format]}formatQDateTime::toString() に渡すことでフォーマットされた、メッセージが発生したシステム時刻。フォーマットが指定されていない場合、Qt::ISODate のフォーマットが使用される。
%{backtrace [depth=N] [separator="..."]}オプションのパラメータdepth (デフォルトは5)で指定されたフレーム数を、オプショ ンのパラメータseparator (デフォルトは"|")で区切ったバックトレース。

この拡張は、一部のプラットフォームでのみ利用可能です:

  • glibc を使用しているプラットフォーム;
  • <stacktrace> Qt を C++23 モードでコンパイルする必要があります)。

プラットフォームによっては、この拡張で表示される関数名に制限があります。

いくつかのプラットフォームでは、名前はエクスポートされた関数に対してのみ知られています。アプリケーション内のすべての関数の名前を確認したい場合は、アプリケーションが-rdynamic またはそれと同等のものでコンパイルされ、リンクされていることを確認してください。

バックトレースを読む際には、インライン化やテールコールの最適化によってフレームが欠落している可能性があることを考慮してください。

また、%{if-debug}%{if-info}%{if-warning}%{if-critical}%{if-fatal} の後に、%{endif} を続けることで、メッセージの型に関する条件分岐を使用することもできます。%{if-*}%{endif} の中にあるものは、型が一致した場合のみ出力されます。

最後に、%{if-category}...%{endif} の中のテキストは、カテゴリーがデフォルトでない場合のみ表示されます。

    QT_MESSAGE_PATTERN="[%{time yyyyMMdd h:mm:ss.zzz t} %{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{file}:%{line} - %{message}"

デフォルトのpattern%{if-category}%{category}: %{endif}%{message}

QT_MESSAGE_PATTERN 環境変数を設定することで、pattern を実行時に変更することもできます。qSetMessagePattern() が呼び出され、QT_MESSAGE_PATTERN が設定されている場合は、環境変数が優先されます。

注: プレースホルダcategoryfilefunctionline の情報は、デバッグビルドでのみ記録されます。あるいは、QT_MESSAGELOGCONTEXT を明示的に定義することもできる。詳しくはQMessageLogContext のドキュメントを参照してください。

注意: このメッセージパターンは、デフォルトのstderr 出力のような、構造化されていないロギングにのみ適用されます。systemd のような構造化されたロギングは、構造化された情報とともにメッセージをそのまま記録します。

カスタムメッセージハンドラはpattern を考慮するためにqFormatLogMessage() を使うことができます。

qInstallMessageHandler()、デバッグ・テクニックQLoggingCategoryQMessageLogContextも参照のこと

マクロ・ドキュメント

qCritical(const char *message, ...)

クリティカル・メッセージmessage を持つメッセージ・ハンドラを呼び出します。メッセージ・ハンドラがインストールされていない場合、メッセージは標準エラー出力に出力される。Windows では、メッセージはデバッガに送信されます。QNX では、メッセージは slogger2 に送信されます。

この関数は、Cのprintf()関数と同様に、フォーマット文字列と引数のリストを受け取ります。フォーマットは Latin-1 文字列でなければなりません。

void load(const QString &fileName)
{
    QFile file(fileName);
    if (!file.exists())
        qCritical("File '%s' does not exist!", qUtf8Printable(fileName));
}

<QtDebug> をインクルードすると、より便利な構文が利用できます:

qCritical() << "Brush:" << myQBrush << "Other value:" << i;

項目の間にスペースが挿入され、最後に改行が追加されます。

実行時に出力を抑制するには、logging rules を定義するか、カスタムfilter を登録します。

デバッグの目的で、クリティカルなメッセージに対してプログラムを中断させると便利な場合がある。これにより、コア・ダンプを検査したり、デバッガをアタッチしたりすることができる -qFatal() も参照。これを有効にするには、環境変数QT_FATAL_CRITICALS を数値n に設定する。プログラムはn番目のクリティカル・メッセージで終了する。つまり、環境変数に1が設定されていれば、最初の呼び出しで終了し、10が設定されていれば、10回目の呼び出しで終了する。環境変数に数値以外の値が設定されている場合は、1と等価である。

注意:このマクロはスレッドセーフである。

qCCritical()、qDebug()、qInfo()、qWarning()、qFatal()、qInstallMessageHandler()、デバッグ手法も参照のこと

qDebug(const char *message, ...)

デバッグ・メッセージmessage を持つメッセージ・ハンドラを呼び出します。メッセージ・ハンドラがインストールされていない場合、メッセージは標準エラー出力に出力される。Windows では、コンソール・アプリケーションの場合、メッセージはコンソールに送信されます。QNX では、メッセージは slogger2 に送信されます。コンパイル時にQT_NO_DEBUG_OUTPUT が定義されている場合、この関数は何も行いません。

この関数にフォーマット文字列と引数のリストを渡すと、Cのprintf()関数と同じように動作します。書式はLatin-1文字列でなければならない。

qDebug("Items in list: %d", myList.size());

<QtDebug> を含めると、より便利な構文も利用できる:

qDebug() << "Brush:" << myQBrush << "Other value:" << i;

この構文では、関数はQtDebugMsg メッセージ・タイプを使うように設定されたQDebug オブジェクトを返します。この構文では、 メッセージ・タイプを使用するように設定された オブジェクトを返します。各項目の間には自動的にスペースが 1 つ入り、最後には改行が出力されます。多くのC++とQtの型をサポートしています。

実行時に出力を抑制するには、qInstallMessageHandler() を使用して独自のメッセージ・ハンドラをインストールしてください。

注:このマクロはスレッドセーフです。

qCDebug(),qInfo(),qWarning(),qCritical(),qFatal(),qInstallMessageHandler(),デバッグ技法も参照

qFatal(const char *message, ...)

message という致命的なメッセージを持つメッセージ・ハンドラを呼び出します。メッセージ・ハンドラがインストールされていない場合、メッセージは標準エラー出力に出力される。Windows では、メッセージはデバッガに送信されます。QNX では、メッセージは slogger2 に送信されます。

デフォルトのメッセージ・ハンドラを使用している場合、この関数はコア・ダンプを作成するためにアボートします。Windowsでは、デバッグ・ビルドの場合、この関数は_CRT_ERRORを報告し、アプリケーションにデバッガを接続できるようにします。

この関数は、Cのprintf()関数と同様に、フォーマット文字列と引数のリストを受け取ります。

int divide(int a, int b)
{
    if (b == 0)                                // program error
        qFatal("divide: cannot divide by zero");
    return a / b;
}

例:実行時に出力を抑制するには、qInstallMessageHandler() を使用して独自のメッセージ・ハンドラをインストールします。

qCFatal()、qDebug()、qInfo()、qWarning()、qCritical()、qInstallMessageHandler()、デバッグ・テクニックも参照

qInfo(const char *message, ...)

情報メッセージでメッセージ・ハンドラを呼び出すmessage 。メッセージ・ハンドラがインストー ルされていない場合、メッセージは標準エラー出力に出力される。Windows では、コンソール・アプリケーションの場合、メッセージはコンソールに送信されます。QNX では、メッセージは slogger2 に送信されます。コンパイル時にQT_NO_INFO_OUTPUT が定義されている場合、この関数は何も行いません。

この関数にフォーマット文字列と引数のリストを渡すと、Cのprintf()関数と同じように動作します。書式はLatin-1文字列でなければならない。

qInfo("Items in list: %d", myList.size());

<QtDebug> を含めると、より便利な構文も利用できる:

qInfo() << "Brush:" << myQBrush << "Other value:" << i;

この構文では、関数はQtInfoMsg メッセージ・タイプを使うように設定されたQDebug オブジェクトを返します。この構文では、 メッセージ・タイプを使用するように設定された オブジェクトを返します。各項目の間には自動的にスペースが 1 つ入り、最後には改行が出力されます。多くのC++とQtの型をサポートしています。

実行時に出力を抑制するには、qInstallMessageHandler() を使用して独自のメッセージ・ハンドラをインストールしてください。

注:このマクロはスレッドセーフです。

qCInfo(),qDebug(),qWarning(),qCritical(),qFatal(),qInstallMessageHandler(),デバッグ技法も参照

qWarning(const char *message, ...)

警告メッセージmessage を持つメッセージ・ハンドラを呼び出します。メッセージ・ハンドラがインストールされていない場合、メッセージは標準エラー出力に出力される。Windows では、メッセージはデバッガに送信されます。QNX では、メッセージは slogger2 に送信されます。

この関数は、Cのprintf()関数と同様に、フォーマット文字列と引数のリストを受け取ります。フォーマットは Latin-1 文字列でなければなりません。

void f(int c)
{
    if (c > 200)
        qWarning("f: bad argument, c == %d", c);
}

<QtDebug> をインクルードすると、より便利な構文が利用できます:

qWarning() << "Brush:" << myQBrush << "Other value:" << i;

この構文は、各項目の間にスペースを挿入し、最後に改行を追加します。

この関数は、コンパイル時にQT_NO_WARNING_OUTPUT 。実行時に出力を抑制するには、logging rules を設定するか、カスタムfilter を登録する。

デバッグの目的で、警告メッセージに対してプログラムを中断させると便利な場合がある。これにより、コア・ダンプを検査したり、デバッガをアタッチしたりすることができる -qFatal() も参照のこと。これを有効にするには、環境変数QT_FATAL_WARNINGS を数値n に設定する。プログラムはn番目の警告に対して終了する。つまり、環境変数に1が設定されていれば、最初の呼び出しで終了し、 10が設定されていれば、10回目の呼び出しで終了する。環境変数に数値以外の値が設定されている場合は、1と等価である。

注意:このマクロはスレッドセーフである。

qCWarning(),qDebug(),qInfo(),qCritical(),qFatal(),qInstallMessageHandler(),デバッグテクニックも参照してください

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。