Add qFormatLogMessage()
Export the former qMessageFormatString() as qFormatLogMessage(). This allows custom message handlers to format their messages just like the default message handler, taking qSetMessagePattern() / QT_MESSAGE_PATTERN into account. The method should arguably not add the '\n' at the end, which a follow up commit will fix. Change-Id: Ib2a9cfda91473df079daf03bf3197e6ac63e013e Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
This commit is contained in:
parent
c38af4e6bb
commit
e968793e81
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||||
** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
|
** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
|
||||||
** Contact: http://www.qt-project.org/legal
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
@ -1052,10 +1052,20 @@ static void slog2_default_handler(QtMsgType msgType, const char *message)
|
|||||||
Q_GLOBAL_STATIC(QMessagePattern, qMessagePattern)
|
Q_GLOBAL_STATIC(QMessagePattern, qMessagePattern)
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\internal
|
\relates <QtGlobal>
|
||||||
*/
|
\since 5.4
|
||||||
Q_CORE_EXPORT QString qMessageFormatString(QtMsgType type, const QMessageLogContext &context,
|
|
||||||
const QString &str)
|
Generates a formatted string out of the \a type, \a context, \a 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.
|
||||||
|
|
||||||
|
\sa qInstallMessageHandler(), qSetMessagePattern()
|
||||||
|
*/
|
||||||
|
QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)
|
||||||
{
|
{
|
||||||
QString message;
|
QString message;
|
||||||
|
|
||||||
@ -1278,7 +1288,7 @@ static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &con
|
|||||||
bool toConsole;
|
bool toConsole;
|
||||||
};
|
};
|
||||||
|
|
||||||
QString logMessage = qMessageFormatString(type, context, buf);
|
QString logMessage = qFormatLogMessage(type, context, buf);
|
||||||
|
|
||||||
#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
|
#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
|
||||||
if (!qWinLogToStderr()) {
|
if (!qWinLogToStderr()) {
|
||||||
@ -1583,7 +1593,7 @@ void qErrnoWarning(int code, const char *msg, ...)
|
|||||||
environment variable; if both qSetMessagePattern() is called and QT_MESSAGE_PATTERN is
|
environment variable; if both qSetMessagePattern() is called and QT_MESSAGE_PATTERN is
|
||||||
set, the environment variable takes precedence.
|
set, the environment variable takes precedence.
|
||||||
|
|
||||||
qSetMessagePattern() has no effect if a custom message handler is installed.
|
Custom message handlers can use qFormatLogMessage() to take \a pattern into account.
|
||||||
|
|
||||||
\sa qInstallMessageHandler(), {Debugging Techniques}
|
\sa qInstallMessageHandler(), {Debugging Techniques}
|
||||||
*/
|
*/
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||||
** Contact: http://www.qt-project.org/legal
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
** This file is part of the QtCore module of the Qt Toolkit.
|
** This file is part of the QtCore module of the Qt Toolkit.
|
||||||
@ -167,6 +167,8 @@ typedef void (*QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QS
|
|||||||
Q_CORE_EXPORT QtMessageHandler qInstallMessageHandler(QtMessageHandler);
|
Q_CORE_EXPORT QtMessageHandler qInstallMessageHandler(QtMessageHandler);
|
||||||
|
|
||||||
Q_CORE_EXPORT void qSetMessagePattern(const QString &messagePattern);
|
Q_CORE_EXPORT void qSetMessagePattern(const QString &messagePattern);
|
||||||
|
Q_CORE_EXPORT QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context,
|
||||||
|
const QString &buf);
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
#endif // QLOGGING_H
|
#endif // QLOGGING_H
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||||
** Contact: http://www.qt-project.org/legal
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
** This file is part of the QtTest module of the Qt Toolkit.
|
** This file is part of the QtTest module of the Qt Toolkit.
|
||||||
@ -59,8 +59,6 @@
|
|||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
Q_CORE_EXPORT QString qMessageFormatString(QtMsgType type, const QMessageLogContext &context, const QString& msg);
|
|
||||||
|
|
||||||
static void saveCoverageTool(const char * appname, bool testfailed, bool installedTestCoverage)
|
static void saveCoverageTool(const char * appname, bool testfailed, bool installedTestCoverage)
|
||||||
{
|
{
|
||||||
#ifdef __COVERAGESCANNER__
|
#ifdef __COVERAGESCANNER__
|
||||||
@ -287,7 +285,7 @@ namespace QTest {
|
|||||||
// the message is expected, so just swallow it.
|
// the message is expected, so just swallow it.
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QString msg = qMessageFormatString(type, context, message);
|
QString msg = qFormatLogMessage(type, context, message);
|
||||||
msg.chop(1); // remove trailing newline
|
msg.chop(1); // remove trailing newline
|
||||||
|
|
||||||
if (type != QtFatalMsg) {
|
if (type != QtFatalMsg) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**
|
**
|
||||||
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
|
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
||||||
** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
|
** Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
|
||||||
** Contact: http://www.qt-project.org/legal
|
** Contact: http://www.qt-project.org/legal
|
||||||
**
|
**
|
||||||
@ -68,6 +68,9 @@ private slots:
|
|||||||
void qMessagePattern();
|
void qMessagePattern();
|
||||||
void setMessagePattern();
|
void setMessagePattern();
|
||||||
|
|
||||||
|
void formatLogMessage_data();
|
||||||
|
void formatLogMessage();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_appDir;
|
QString m_appDir;
|
||||||
QStringList m_baseEnvironment;
|
QStringList m_baseEnvironment;
|
||||||
@ -803,6 +806,63 @@ void tst_qmessagehandler::setMessagePattern()
|
|||||||
#endif // !QT_NO_PROCESS
|
#endif // !QT_NO_PROCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(QtMsgType)
|
||||||
|
|
||||||
|
void tst_qmessagehandler::formatLogMessage_data()
|
||||||
|
{
|
||||||
|
QTest::addColumn<QString>("pattern");
|
||||||
|
QTest::addColumn<QString>("result");
|
||||||
|
|
||||||
|
QTest::addColumn<QtMsgType>("type");
|
||||||
|
QTest::addColumn<QByteArray>("file");
|
||||||
|
QTest::addColumn<int>("line");
|
||||||
|
QTest::addColumn<QByteArray>("function");
|
||||||
|
QTest::addColumn<QByteArray>("category");
|
||||||
|
QTest::addColumn<QString>("message");
|
||||||
|
|
||||||
|
#define BA QByteArrayLiteral
|
||||||
|
|
||||||
|
QTest::newRow("basic") << "%{type} %{file} %{line} %{function} %{message}"
|
||||||
|
<< "debug main.cpp 1 func msg\n"
|
||||||
|
<< QtDebugMsg << BA("main.cpp") << 1 << BA("func") << BA("") << "msg";
|
||||||
|
|
||||||
|
// test the if conditions
|
||||||
|
QString format = "[%{if-debug}D%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{if-category}%{category}: %{endif}%{message}";
|
||||||
|
QTest::newRow("if-debug")
|
||||||
|
<< format << "[D] msg\n"
|
||||||
|
<< QtDebugMsg << BA("") << 0 << BA("func") << QByteArray() << "msg";
|
||||||
|
QTest::newRow("if_warning")
|
||||||
|
<< format << "[W] msg\n"
|
||||||
|
<< QtWarningMsg << BA("") << 0 << BA("func") << QByteArray() << "msg";
|
||||||
|
QTest::newRow("if_critical")
|
||||||
|
<< format << "[C] msg\n"
|
||||||
|
<< QtCriticalMsg << BA("") << 0 << BA("func") << QByteArray() << "msg";
|
||||||
|
QTest::newRow("if_fatal")
|
||||||
|
<< format << "[F] msg\n"
|
||||||
|
<< QtFatalMsg << BA("") << 0 << BA("func") << QByteArray() << "msg";
|
||||||
|
QTest::newRow("if_cat")
|
||||||
|
<< format << "[F] cat: msg\n"
|
||||||
|
<< QtFatalMsg << BA("") << 0 << BA("func") << BA("cat") << "msg";
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_qmessagehandler::formatLogMessage()
|
||||||
|
{
|
||||||
|
QFETCH(QString, pattern);
|
||||||
|
QFETCH(QString, result);
|
||||||
|
|
||||||
|
QFETCH(QtMsgType, type);
|
||||||
|
QFETCH(QByteArray, file);
|
||||||
|
QFETCH(int, line);
|
||||||
|
QFETCH(QByteArray, function);
|
||||||
|
QFETCH(QByteArray, category);
|
||||||
|
QFETCH(QString, message);
|
||||||
|
|
||||||
|
qSetMessagePattern(pattern);
|
||||||
|
QMessageLogContext ctxt(file, line, function, category.isEmpty() ? 0 : category.data());
|
||||||
|
QString r = qFormatLogMessage(type, ctxt, message);
|
||||||
|
QCOMPARE(r, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QTEST_MAIN(tst_qmessagehandler)
|
QTEST_MAIN(tst_qmessagehandler)
|
||||||
#include "tst_qlogging.moc"
|
#include "tst_qlogging.moc"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user