From c2987bd03b55b8ce16e24c770c796592d3c2500b Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Sat, 8 Aug 2020 11:00:15 +0200 Subject: [PATCH 1/9] Use QElapsedTimer to measure time differences. QTime::elapsed() is deprecated in recent Qt5, and removed in Qt6. Use QElapsedTimer instead, which is the suggested replacement. --- include/Logger.h | 3 ++- src/Logger.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/Logger.h b/include/Logger.h index 509bc5f..941e556 100644 --- a/include/Logger.h +++ b/include/Logger.h @@ -18,6 +18,7 @@ #include #include #include +#include // Local #include "CuteLogger_global.h" @@ -224,7 +225,7 @@ class CUTELOGGERSHARED_EXPORT LoggerTimingHelper private: Logger* m_logger; - QTime m_time; + QElapsedTimer m_time; Logger::LogLevel m_logLevel; Logger::TimingMode m_timingMode; const char* m_file; diff --git a/src/Logger.cpp b/src/Logger.cpp index 16a18db..69e2007 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -1062,7 +1062,7 @@ LoggerTimingHelper::~LoggerTimingHelper() else message = QString(QLatin1String("\"%1\" finished in ")).arg(m_block); - int elapsed = m_time.elapsed(); + qint64 elapsed = m_time.elapsed(); if (elapsed >= 10000 && m_timingMode == Logger::TimingAuto) message += QString(QLatin1String("%1 s.")).arg(elapsed / 1000); else From 3c395f7b44a52bf7fb05c9d33b6f9c0e20b49d01 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Sat, 8 Aug 2020 11:02:21 +0200 Subject: [PATCH 2/9] Use QString::vasprintf() in newer Qt versions. vsprintf() is deprecated in recent Qt5, and removed in Qt6. Its replacement vasprintf() is available since Qt 5.5. --- src/Logger.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Logger.cpp b/src/Logger.cpp index 69e2007..ef5bfc2 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -1032,7 +1032,11 @@ void LoggerTimingHelper::start(const char* msg, ...) { va_list va; va_start(va, msg); +#if QT_VERSION >= 0x050500 + m_block = QString().vasprintf(msg, va); +#else m_block = QString().vsprintf(msg, va); +#endif va_end(va); m_time.start(); From c2bbd90b90bede4caee742bb34ec2b8e90a9f4b0 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Sun, 16 Aug 2020 11:26:34 +0200 Subject: [PATCH 3/9] Replace QDateTime::fromTime_t for newer Qt. fromTime_t has been deprecated and removed from Qt6. Use the replacement fromSecsSinceEpoch() on Qt 5.8+. --- src/RollingFileAppender.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/RollingFileAppender.cpp b/src/RollingFileAppender.cpp index 267744f..bc64a6f 100644 --- a/src/RollingFileAppender.cpp +++ b/src/RollingFileAppender.cpp @@ -200,7 +200,11 @@ void RollingFileAppender::computeRollOverTime() break; default: Q_ASSERT_X(false, "DailyRollingFileAppender::computeInterval()", "Invalid datePattern constant"); +#if QT_VERSION >= 0x050800 + m_rollOverTime = QDateTime::fromSecsSinceEpoch(0); +#else m_rollOverTime = QDateTime::fromTime_t(0); +#endif } m_rollOverSuffix = start.toString(m_datePatternString); From 68b90a90f86a966ee30fd57a74e871065e28e232 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Sun, 16 Aug 2020 11:12:54 +0200 Subject: [PATCH 4/9] Replace QRegExp with QRegularExpression. QRegExp is deprecated in recent Qt, and has been removed in Qt6. Use the replacement QRegularExpression. --- src/AbstractStringAppender.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/AbstractStringAppender.cpp b/src/AbstractStringAppender.cpp index ce64aae..ea5883f 100644 --- a/src/AbstractStringAppender.cpp +++ b/src/AbstractStringAppender.cpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include @@ -155,12 +155,13 @@ QByteArray AbstractStringAppender::qCleanupFuncinfo(const char* name) } bool hasLambda = false; - QRegExp lambdaRegex("::"); - int lambdaIndex = lambdaRegex.indexIn(QString::fromLatin1(info)); + QRegularExpression lambdaRegex("::"); + QRegularExpressionMatch match = lambdaRegex.match(QString::fromLatin1(info)); + int lambdaIndex = match.capturedStart(); if (lambdaIndex != -1) { hasLambda = true; - info.remove(lambdaIndex, lambdaRegex.matchedLength()); + info.remove(lambdaIndex, match.capturedLength()); } // operator names with '(', ')', '<', '>' in it @@ -405,7 +406,7 @@ QString AbstractStringAppender::formattedString(const QDateTime& timeStamp, Logg // Filename without a path else if (command == QLatin1String("file")) - chunk = QString(QLatin1String(file)).section(QRegExp("[/\\\\]"), -1); + chunk = QString(QLatin1String(file)).section(QRegularExpression("[/\\\\]"), -1); // Source line number else if (command == QLatin1String("line")) From 294f286e633bcd7579d48a4fa28aa01bcdbb0aa9 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Sun, 16 Aug 2020 11:37:40 +0200 Subject: [PATCH 5/9] Use range iterator for creating QSet on newer Qt. fromList() is deprecated and has been removed in Qt6. Since Qt 5.14 range constructors are available, use those instead. --- src/Logger.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Logger.cpp b/src/Logger.cpp index ef5bfc2..689bc42 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -600,8 +600,13 @@ Logger::~Logger() // Cleanup appenders QMutexLocker appendersLocker(&d->loggerMutex); +#if QT_VERSION >= 0x050e00 + QSet deleteList(QSet(d->appenders.begin(), d->appenders.end())); + deleteList.unite(QSet(d->categoryAppenders.values().begin(), d->categoryAppenders.values().end())); +#else QSet deleteList(QSet::fromList(d->appenders)); deleteList.unite(QSet::fromList(d->categoryAppenders.values())); +#endif qDeleteAll(deleteList); appendersLocker.unlock(); From 56c544654b7c0fc338763afa47a9ab2b6b361c38 Mon Sep 17 00:00:00 2001 From: Boris Moiseev Date: Mon, 24 May 2021 17:05:32 +0300 Subject: [PATCH 6/9] FileAppender: don't force flush data to file system (behavior change!) FileAppender will no longer call QFile::flush on every message write due to it dramatically slowing apps when writing a lot of log records to slow file system. The downside is some log data may be lost if application crashes before QFile manages to write all of the buffered data to file system. It is still possible to revert to an old behavior calling setFlushOnWrite(true) on FileAppender. --- include/FileAppender.h | 6 ++++++ src/FileAppender.cpp | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/include/FileAppender.h b/include/FileAppender.h index ab9e12a..b57a087 100644 --- a/include/FileAppender.h +++ b/include/FileAppender.h @@ -32,6 +32,11 @@ class CUTELOGGERSHARED_EXPORT FileAppender : public AbstractStringAppender QString fileName() const; void setFileName(const QString&); + bool flushOnWrite() const; + void setFlushOnWrite(bool); + + bool flush(); + bool reopenFile(); protected: @@ -42,6 +47,7 @@ class CUTELOGGERSHARED_EXPORT FileAppender : public AbstractStringAppender private: QFile m_logFile; + bool m_flushOnWrite; QTextStream m_logStream; mutable QMutex m_logFileMutex; }; diff --git a/src/FileAppender.cpp b/src/FileAppender.cpp index b9018b0..7e2b5b6 100644 --- a/src/FileAppender.cpp +++ b/src/FileAppender.cpp @@ -26,6 +26,7 @@ //! Constructs the new file appender assigned to file with the given name. FileAppender::FileAppender(const QString& fileName) + : m_flushOnWrite(false) { setFileName(fileName); } @@ -65,6 +66,37 @@ void FileAppender::setFileName(const QString& s) } +bool FileAppender::flushOnWrite() const +{ + return m_flushOnWrite; +} + + +//! Allows FileAppender to flush file immediately after writing a log record. +/** + * Default value is false. This could result in substantial app slowdown when writing massive amount of log records + * with FileAppender on a rather slow file system due to FileAppender blocking until the data would be phisically + * written. + * + * Leaving this as is may result in some log data not being written if the application crashes. + */ +void FileAppender::setFlushOnWrite(bool flush) +{ + m_flushOnWrite = flush; +} + + +//! Force-flush any remaining buffers to file system. Returns true if successful, otherwise returns false. +bool FileAppender::flush() +{ + QMutexLocker locker(&m_logFileMutex); + if (m_logFile.isOpen()) + return m_logFile.flush(); + else + return true; +} + + bool FileAppender::reopenFile() { closeFile(); @@ -104,7 +136,8 @@ void FileAppender::append(const QDateTime& timeStamp, Logger::LogLevel logLevel, { m_logStream << formattedString(timeStamp, logLevel, file, line, function, category, message); m_logStream.flush(); - m_logFile.flush(); + if (m_flushOnWrite) + m_logFile.flush(); } } From d4a11a398a861f5e3b2646692875efdb75326374 Mon Sep 17 00:00:00 2001 From: Boris Moiseev Date: Thu, 19 Aug 2021 16:09:40 +0300 Subject: [PATCH 7/9] Updated to newer version of CMake CMake started showing deprecation warning about CMake 2.8 files support. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 057c05d..f5e7f4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11) +CMAKE_MINIMUM_REQUIRED(VERSION 3.1) SET(CMAKE_CXX_STANDARD 11) SET(CMAKE_CXX_STANDARD_REQUIRED ON) From 61d2d1e2a295c21b1db93a1b6e84b0df8c0983ff Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Sat, 18 Dec 2021 16:24:57 +0100 Subject: [PATCH 8/9] Remove unused include. Qt6 moves QTextCodec to the Qt5Compat module. Since it's unused anyway remove it so we don't get the dependency on Qt5Compat. --- src/Logger.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Logger.cpp b/src/Logger.cpp index 689bc42..b813947 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #if defined(Q_OS_ANDROID) # include From b85d88667d86b09997c96b3568a73f2599325ef4 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Sat, 25 Dec 2021 09:30:16 +0100 Subject: [PATCH 9/9] Fix destructor segfault with newer Qt versions. Getting the values from a QMultiMap() returns a list, but not the same on consecutive calls. Thus calling it twice to get the iterators will yield different lists, causing the iterator to fail. Fixes segfault when destructing the logger. --- src/Logger.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Logger.cpp b/src/Logger.cpp index b813947..5499d03 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -600,8 +600,9 @@ Logger::~Logger() // Cleanup appenders QMutexLocker appendersLocker(&d->loggerMutex); #if QT_VERSION >= 0x050e00 - QSet deleteList(QSet(d->appenders.begin(), d->appenders.end())); - deleteList.unite(QSet(d->categoryAppenders.values().begin(), d->categoryAppenders.values().end())); + QSet deleteList(d->appenders.begin(), d->appenders.end()); + auto cal = d->categoryAppenders.values(); + deleteList.unite(QSet(cal.begin(), cal.end())); #else QSet deleteList(QSet::fromList(d->appenders)); deleteList.unite(QSet::fromList(d->categoryAppenders.values()));