IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

<QtLogging> - Qt Logging Types

The <QtLogging> header file defines Qt logging types, functions and macros.

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

<QtLogging> - Qt Logging Types

  • Header: QtLogging

I. Detailed Description

The <QtLogging> header file contains several types, functions and macros for logging.

The QtMsgType enum identifies the various messages that can be generated and sent to a Qt message handler; QtMessageHandler is a type definition for a pointer to a function with the signature void myMessageHandler(QtMsgType, const QMessageLogContext &, const char *). qInstallMessageHandler() function can be used to install the given QtMessageHandler. QMessageLogContext class contains the line, file, and function the message was logged at. This information is created by the QMessageLogger class.

<QtLogging> also contains functions that generate messages from the given string argument: qDebug(), qInfo(), qWarning(), qCritical(), and qFatal(). These functions call the message handler with the given message.

Example:

 
Sélectionnez
if (!driver()-&gt;isOpen() || driver()-&gt;isOpenError()) {
    qWarning("QSqlQuery::exec: database not open");
    return false;
}

II. Type Documentation

 

II-1. QtMessageHandler

This is a typedef for a pointer to a function with the following signature:

 
Sélectionnez
void myMessageHandler(QtMsgType, const QMessageLogContext &amp;, const QString &amp;);
II-1-1. See Also

II-2. enum QtMsgType

This enum describes the messages that can be sent to a message handler (QtMessageHandler). You can use the enum to identify and associate the various message types with the appropriate actions.

Constant

Value

Description

QtDebugMsg

0

A message generated by the qDebug() function.

QtInfoMsg

4

A message generated by the qInfo() function.

QtWarningMsg

1

A message generated by the qWarning() function.

QtCriticalMsg

2

A message generated by the qCritical() function.

QtFatalMsg

3

A message generated by the qFatal() function.

QtSystemMsg

QtCriticalMsg

 

QtInfoMsg was added in Qt 5.5.

II-2-1. See Also

III. Function Documentation

 

III-1. QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)

Generates a formatted string out of the type, context, str arguments.

qFormatLogMessage returns a QString that is formatted according to the current message pattern. It can be used by custom message handlers to format output similar to Qt's default message handler.

The function is thread-safe.

III-1-1. See Also

III-2. QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)

Installs a Qt message handler which has been defined previously. Returns a pointer to the previous message handler.

The message handler is a function that prints out debug messages, warnings, critical and fatal error messages. The Qt library (debug mode) contains hundreds of warning messages that are printed when internal errors (usually invalid function arguments) occur. Qt built in release mode also contains such warnings unless QT_NO_WARNING_OUTPUT and/or QT_NO_DEBUG_OUTPUT have been set during compilation. If you implement your own message handler, you get total control of these messages.

The default message handler prints the message to the standard output under X11 or to the debugger under Windows. If it is a fatal message, the application aborts immediately after handling that message. Custom message handlers should not attempt to exit an application on their own.

Only one message handler can be defined, since this is usually done on an application-wide basis to control debug output.

To restore the message handler, call qInstallMessageHandler(0).

Example:

 
Sélectionnez
#include &lt;qapplication.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

void myMessageOutput(QtMsgType type, const QMessageLogContext &amp;context, const QString &amp;msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    const char *file = context.file ? context.file : "";
    const char *function = context.function ? context.function : "";
    switch (type) {
    case QtDebugMsg:
        fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtInfoMsg:
        fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtWarningMsg:
        fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtCriticalMsg:
        fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtFatalMsg:
        fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    }
}

int main(int argc, char **argv)
{
    qInstallMessageHandler(myMessageOutput);
    QApplication app(argc, argv);
    ...
    return app.exec();
}
III-2-1. See Also

III-3. void qSetMessagePattern(const QString &pattern)

Changes the output of the default message handler.

Allows to tweak the output of qDebug(), qInfo(), qWarning(), qCritical(), and qFatal(). The category logging output of qCDebug(), qCInfo(), qCWarning(), and qCCritical() is formatted, too.

Following placeholders are supported:

Placeholder

Description

%{appname}

QCoreApplication::applicationName()

%{category}

Logging category

%{file}

Path to source file

%{function}

Function

%{line}

Line in source file

%{message}

The actual message

%{pid}

QCoreApplication::applicationPid()

%{threadid}

The system-wide ID of current thread (if it can be obtained)

%{qthreadptr}

A pointer to the current QThread (result of QThread::currentThread())

%{type}

"debug", "warning", "critical" or "fatal"

%{time process}

time of the message, in seconds since the process started (the token "process" is literal)

%{time boot}

the time of the message, in seconds since the system boot if that can be determined (the token "boot" is literal). If the time since boot could not be obtained, the output is indeterminate (see QElapsedTimer::msecsSinceReference()).

%{time [format]}

system time when the message occurred, formatted by passing the format to QDateTime::toString(). If the format is not specified, the format of Qt::ISODate is used.

%{backtrace [depth=N] [separator="..."]}

A backtrace with the number of frames specified by the optional depth parameter (defaults to 5), and separated by the optional separator parameter (defaults to "|").

This expansion is available only on some platforms (currently only platfoms using glibc). Names are only known for exported functions. If you want to see the name of every function in your application, make sure your application is compiled and linked with -rdynamic, or an equivalent of it.

When reading backtraces, take into account that frames might be missing due to inlining or tail call optimization.

You can also use conditionals on the type of the message using %{if-debug}, %{if-info} %{if-warning}, %{if-critical} or %{if-fatal} followed by an %{endif}. What is inside the %{if-*} and %{endif} will only be printed if the type matches.

Finally, text inside %{if-category} ... %{endif} is only printed if the category is not the default one.

Example:

 
Sélectionnez
    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}"

The default pattern is %{if-category}%{category}: %{endif}%{message}.

The pattern can also be changed at runtime by setting the QT_MESSAGE_PATTERN environment variable; if both qSetMessagePattern() is called and QT_MESSAGE_PATTERN is set, the environment variable takes precedence.

The information for the placeholders category, file, function and line is only recorded in debug builds. Alternatively, QT_MESSAGELOGCONTEXT can be defined explicitly. For more information refer to the QMessageLogContext documentation.

The message pattern only applies to unstructured logging, such as the default stderr output. Structured logging such as systemd will record the message as is, along with as much structured information as can be captured.

Custom message handlers can use qFormatLogMessage() to take pattern into account.

III-3-1. See Also

IV. Macro Documentation

 

IV-1. qCritical(const char *message, ...)

Calls the message handler with the critical message message. If no message handler has been installed, the message is printed to stderr. Under Windows, the message is sent to the debugger. On QNX the message is sent to slogger2.

This function takes a format string and a list of arguments, similar to the C printf() function. The format should be a Latin-1 string.

Example:

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

If you include <QtDebug>, a more convenient syntax is also available:

 
Sélectionnez
qCritical() &lt;&lt; "Brush:" &lt;&lt; myQBrush &lt;&lt; "Other value:" &lt;&lt; i;

A space is inserted between the items, and a newline is appended at the end.

To suppress the output at runtime, you can define logging rules or register a custom filter.

For debugging purposes, it is sometimes convenient to let the program abort for critical messages. This allows you then to inspect the core dump, or attach a debugger - see also qFatal(). To enable this, set the environment variable QT_FATAL_CRITICALS to a number n. The program terminates then for the n-th critical message. That is, if the environment variable is set to 1, it will terminate on the first call; if it contains the value 10, it will exit on the 10th call. Any non-numeric value in the environment variable is equivalent to 1.

This macro is thread-safe.

IV-1-1. See Also

IV-2. qDebug(const char *message, ...)

Calls the message handler with the debug message message. If no message handler has been installed, the message is printed to stderr. Under Windows the message is sent to the console, if it is a console application; otherwise, it is sent to the debugger. On QNX, the message is sent to slogger2. This function does nothing if QT_NO_DEBUG_OUTPUT was defined during compilation.

If you pass the function a format string and a list of arguments, it works in similar way to the C printf() function. The format should be a Latin-1 string.

Example:

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

If you include <QtDebug>, a more convenient syntax is also available:

 
Sélectionnez
qDebug() &lt;&lt; "Brush:" &lt;&lt; myQBrush &lt;&lt; "Other value:" &lt;&lt; i;

With this syntax, the function returns a QDebug object that is configured to use the QtDebugMsg message type. It automatically puts a single space between each item, and outputs a newline at the end. It supports many C++ and Qt types.

To suppress the output at runtime, install your own message handler with qInstallMessageHandler().

This macro is thread-safe.

IV-2-1. See Also

IV-3. qFatal(const char *message, ...)

Calls the message handler with the fatal message message. If no message handler has been installed, the message is printed to stderr. Under Windows, the message is sent to the debugger. On QNX the message is sent to slogger2.

If you are using the default message handler this function will abort to create a core dump. On Windows, for debug builds, this function will report a _CRT_ERROR enabling you to connect a debugger to the application.

This function takes a format string and a list of arguments, similar to the C printf() function.

Example:

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

To suppress the output at runtime, install your own message handler with qInstallMessageHandler().

IV-3-1. See Also

IV-4. qInfo(const char *message, ...)

Calls the message handler with the informational message message. If no message handler has been installed, the message is printed to stderr. Under Windows, the message is sent to the console, if it is a console application; otherwise, it is sent to the debugger. On QNX the message is sent to slogger2. This function does nothing if QT_NO_INFO_OUTPUT was defined during compilation.

If you pass the function a format string and a list of arguments, it works in similar way to the C printf() function. The format should be a Latin-1 string.

Example:

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

If you include <QtDebug>, a more convenient syntax is also available:

 
Sélectionnez
qInfo() &lt;&lt; "Brush:" &lt;&lt; myQBrush &lt;&lt; "Other value:" &lt;&lt; i;

With this syntax, the function returns a QDebug object that is configured to use the QtInfoMsg message type. It automatically puts a single space between each item, and outputs a newline at the end. It supports many C++ and Qt types.

To suppress the output at runtime, install your own message handler using qInstallMessageHandler().

This macro is thread-safe.

IV-4-1. See Also

IV-5. qWarning(const char *message, ...)

Calls the message handler with the warning message message. If no message handler has been installed, the message is printed to stderr. Under Windows, the message is sent to the debugger. On QNX the message is sent to slogger2.

This function takes a format string and a list of arguments, similar to the C printf() function. The format should be a Latin-1 string.

Example:

 
Sélectionnez
void f(int c)
{
    if (c &gt; 200)
        qWarning("f: bad argument, c == %d", c);
}

If you include <QtDebug>, a more convenient syntax is also available:

 
Sélectionnez
qWarning() &lt;&lt; "Brush:" &lt;&lt; myQBrush &lt;&lt; "Other value:" &lt;&lt; i;

This syntax inserts a space between each item, and appends a newline at the end.

This function does nothing if QT_NO_WARNING_OUTPUT was defined during compilation. To suppress the output at runtime, you can set logging rules or register a custom filter.

For debugging purposes, it is sometimes convenient to let the program abort for warning messages. This allows you then to inspect the core dump, or attach a debugger - see also qFatal(). To enable this, set the environment variable QT_FATAL_WARNINGS to a number n. The program terminates then for the n-th warning. That is, if the environment variable is set to 1, it will terminate on the first call; if it contains the value 10, it will exit on the 10th call. Any non-numeric value in the environment variable is equivalent to 1.

This macro is thread-safe.

IV-5-1. See Also

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+