<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 *format, ...)
qDebug(const char *format, ...)
qFatal(const char *format, ...)
qInfo(const char *format, ...)
qWarning(const char *format, ...)

詳細な説明

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

QtMsgType 列挙型は、生成されて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() 関数によって生成されたメッセージ。

QtMessageHandler 、qInstallMessageHandler()、および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 XMLでは、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() もスレッドセーフであると想定できるため、これ以上の同期処理は必要ありません。

関連項目: QtMessageHandler 、QtMsgType 、qDebug()、qInfo()、qWarning()、qCritical()、qFatal()、「デバッグ手法」、およびqFormatLogMessage()。

void qSetMessagePattern(const QString &pattern)

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

qDebug()、qInfo()、qWarning()、qCritical()、およびqFatal() の出力を微調整できます。また、qCDebug()、qCInfo()、qCWarning()、およびqCCritical() のカテゴリ「logging」の出力もフォーマットされます。

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

プレースホルダー説明
%{appname}QCoreApplication::applicationName()
%{category}ロギングカテゴリ
%{file}ソースファイルへのパス
%{function}関数
%{line}ソースファイル内の行
%{message}実際のメッセージ
%{pid}QCoreApplication::applicationPid()
%{threadid}現在のスレッドのシステム全体でのID(取得可能な場合)
%{threadname}現在のスレッド名(取得可能な場合。Qt 6.10以降はスレッドID)
%{qthreadptr}現在のQThread へのポインタ(QThread::currentThread() の結果)
%{type}「debug」、「warning」、「critical」、または「fatal」
%{time process}メッセージの時刻。プロセスの起動からの経過時間(秒単位)(トークン「process」はリテラル)
%{time boot}メッセージの時刻(システム起動からの経過秒数。算出可能な場合。トークン「boot」はリテラル)。起動からの経過時間を取得できなかった場合、出力は不定となる(QElapsedTimer::msecsSinceReference() を参照)。
%{time [format]}メッセージが発生した時点のシステム時刻。format をQDateTime::toString()に渡してフォーマットされます。フォーマットが指定されていない場合は、Qt::ISODate のフォーマットが使用されます。
%{backtrace [depth=N] [separator="..."]}オプションのdepth パラメータで指定されたフレーム数(デフォルトは5)のバックトレースで、オプションのseparator パラメータで指定された区切り文字(デフォルトは"|")で区切られます。Qt 6.12以降、depth の最大値は16384フレームに制限されています。

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

  • glibc を使用するプラットフォーム;
  • C++23の<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 ttt} %{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} です。

注: Androidでは 、デフォルトの `pattern ` は `%{message} ` です。これは、Android の logcat にはロギングカテゴリ専用のフィールドがあるため、カテゴリがタグとして使用されるためです(Android ロギングを参照)。カテゴリを含むカスタム `pattern ` が使用される場合、`QCoreApplication::applicationName()`がタグとして使用されます。

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

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

注:このメッセージパターンは 、デフォルトの `stderr ` 出力のような非構造化ロギングにのみ適用されます。systemd のような構造化ロギングでは、メッセージはそのまま記録され、取得可能な限りの構造化情報も併せて記録されます。

カスタムメッセージハンドラは、qFormatLogMessage() を使用してpattern を考慮に入れることができます。

セキュリティ上の考慮事項

Qtは、pattern から制御文字(LF 、CR 、NUL バイト、および端末制御シーケンスを含む)を削除したりエスケープしたりしません。したがって、信頼できないソースからのパターンを受け入れると、ログの偽造や、ログストリームの受信者への制御シーケンスの送信が可能になります。さらに、一部のロギングバックエンドでは、NUL バイトが存在する場合、メッセージがそこで切り詰められることがあります。

関連項目: ` qInstallMessageHandler()`、デバッグ手法、QLoggingCategory 、およびQMessageLogContext 。

マクロのドキュメント

qCritical(const char *format, ...)

重要なメッセージ「format 」を中央メッセージハンドラに記録します。format には、追加の引数で指定された値に置き換えられる書式指定子を含めることができます。

例:

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

format UTF-8文字列用の%s や、整数用の%i といったフォーマット指定子を含めることができます。これは、C言語のprintf() 関数の動作と似ています。フォーマットの詳細については、QString::asprintf() を参照してください。

利便性を高め、さらに多くの型に対応させるために、ストリーミングパラダイムに従うQDebug::qCritical() を使用することもできます(std::cout やstd::cerr と同様です)。

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

デバッグの目的で、重大なメッセージが発生した際にプログラムを異常終了させるのが便利な場合があります。これにより、コアダンプを調査したり、デバッガをアタッチしたりすることができます。qFatal() も参照してください。これを有効にするには、環境変数QT_FATAL_CRITICALS を数値n に設定します。これにより、プログラムは n 番目の重大なメッセージで終了します。 つまり、環境変数が 1 に設定されている場合は最初の呼び出しで終了し、値が 10 の場合、10 回目の呼び出しで終了します。環境変数に数値以外の値が設定されている場合は、すべて 1 として扱われます。

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

関連項目: QDebug::qCritical 、qCCritical()、qDebug()、qInfo()、qWarning()、qFatal()、qInstallMessageHandler()、および「デバッグ手法」。

qDebug(const char *format, ...)

デバッグメッセージ「format 」を中央メッセージハンドラに記録します。format には、追加の引数で指定された値に置き換えられる書式指定子を含めることができます。

例:

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

format UTF-8文字列用の `%s ` や、整数用の `%i ` といったフォーマット指定子を含めることができます。これは、C言語の `printf() ` 関数の動作と似ています。フォーマットの詳細については、`QString::asprintf()` を参照してください。

利便性を高め、さらに多くの型をサポートするために、ストリーミングパラダイムに従うQDebug::qDebug() を使用することもできます(std::cout やstd::cerr と同様です)。

コンパイル時にQT_NO_DEBUG_OUTPUT が定義されている場合、この関数は何も実行しません。

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

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

QDebug::qDebug()、qCDebug()、qInfo()、qWarning()、qCritical()、qFatal()、qInstallMessageHandler()、および「デバッグ手法」も参照してください。

qFatal(const char *format, ...)

致命的なメッセージ「format 」を中央メッセージハンドラに記録します。format には、追加の引数で指定された値に置き換えられる書式指定子を含めることができます。

例:

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

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

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

関連項目: qCFatal(),qDebug(),qInfo(),qWarning(),qCritical(),qInstallMessageHandler(), および「デバッグ手法」。

qInfo(const char *format, ...)

情報メッセージ「format 」を中央メッセージハンドラーに記録します。format には、追加の引数で指定された値に置き換えられる書式指定子を指定できます。

例:

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

format UTF-8文字列の場合は `%s `、整数の場合は `%i ` といった形式指定子を含めることができます。これは、C言語の `printf() ` 関数の動作と似ています。書式設定の詳細については、`QString::asprintf()` を参照してください。

利便性を高め、さらに多くの型をサポートするために、ストリーミングパラダイムに従うQDebug::qInfo() を使用することもできます(std::cout やstd::cerr と同様です)。

コンパイル時にQT_NO_INFO_OUTPUT が定義されていた場合、この関数は何も実行しません。

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

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

QDebug::qInfo()、qCInfo()、qDebug()、qWarning()、qCritical()、qFatal()、qInstallMessageHandler()、および「デバッグ手法」も参照してください。

qWarning(const char *format, ...)

警告メッセージ「format 」を中央メッセージハンドラに記録します。format には、追加の引数で指定された値に置き換えられるフォーマット指定子を含めることができます。

例:

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

format UTF-8文字列用の%s や、整数用の%i といったフォーマット指定子を含めることができます。これは、C言語のprintf() 関数の動作と似ています。フォーマットの詳細については、QString::asprintf()を参照してください。

利便性を高め、さらに多くの型をサポートするために、ストリーミングパラダイムに従うQDebug::qWarning() を使用することもできます(std::cout やstd::cerr と同様です)。

コンパイル時にQT_NO_WARNING_OUTPUT が定義されている場合、この関数は何もしません。実行時の出力を抑制するには、logging rules を設定するか、カスタムfilter を登録します。

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

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

関連項目: QDebug::qWarning()、qCWarning()、qDebug()、qInfo()、qCritical()、qFatal()、qInstallMessageHandler()、および「デバッグ手法」。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.