From 2d035b6bacb538dc09be8ac5c1efa2a87205dc09 Mon Sep 17 00:00:00 2001 From: Filippo Gentile Date: Tue, 14 Feb 2023 23:13:21 +0100 Subject: [PATCH] logging: Fix MinGW broken std::put_time() Workaround missing specifier support in MinGW 12.2.0 by using old pre-C+ +11 specifiers. --- server/src/log/consolelogger.cpp | 4 +++- server/src/log/filelogger.cpp | 4 +++- server/src/log/logger.hpp | 10 ++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/server/src/log/consolelogger.cpp b/server/src/log/consolelogger.cpp index ca66a60e..3150e851 100644 --- a/server/src/log/consolelogger.cpp +++ b/server/src/log/consolelogger.cpp @@ -41,11 +41,13 @@ void ConsoleLogger::write(const std::chrono::system_clock::time_point& time, std const auto us = std::chrono::duration_cast(time.time_since_epoch()) % 1000000; tm tm; + const char time_format[] = TRAINTASTIC_LOG_DATE_FORMAT " " TRAINTASTIC_LOG_TIME_FORMAT; + std::lock_guard lock(m_streamMutex); std::ostream& ss = (isErrorLogMessage(code) || isCriticalLogMessage(code) || isFatalLogMessage(code)) ? std::cerr : std::cout; ss - << std::put_time(localTime(&systemTime, &tm), "%F %T") << '.' << std::setfill('0') << std::setw(6) << us.count() << ' ' + << std::put_time(localTime(&systemTime, &tm), time_format) << '.' << std::setfill('0') << std::setw(6) << us.count() << ' ' << objectId << ' ' << logMessageChar(code) << std::setw(4) << logMessageNumber(code) << ": " << message diff --git a/server/src/log/filelogger.cpp b/server/src/log/filelogger.cpp index faa1988d..c4f037be 100644 --- a/server/src/log/filelogger.cpp +++ b/server/src/log/filelogger.cpp @@ -55,8 +55,10 @@ void FileLogger::write(const std::chrono::system_clock::time_point& time, std::s std::lock_guard lock(m_fileMutex); + const char time_format[] = TRAINTASTIC_LOG_DATE_FORMAT ";" TRAINTASTIC_LOG_TIME_FORMAT; + m_file - << std::put_time(localTime(&systemTime, &tm), "%F;%T") << '.' << std::setfill('0') << std::setw(6) << us.count() << ';' + << std::put_time(localTime(&systemTime, &tm), time_format) << '.' << std::setfill('0') << std::setw(6) << us.count() << ';' << objectId << ';' << logMessageChar(code) << std::setw(4) << logMessageNumber(code) << ';' << message diff --git a/server/src/log/logger.hpp b/server/src/log/logger.hpp index 8a125365..6eb6d18e 100644 --- a/server/src/log/logger.hpp +++ b/server/src/log/logger.hpp @@ -29,6 +29,16 @@ #include #include +#if defined(__MINGW32__) || defined(__MINGW64__) +//NOTE: MinGW does not yet support all C++11 std::put_time specifiers +//See bug: https://sourceforge.net/p/mingw-w64/bugs/793 +#define TRAINTASTIC_LOG_DATE_FORMAT "%Y-%m-%d" +#define TRAINTASTIC_LOG_TIME_FORMAT "%H:%M:%S" +#else +#define TRAINTASTIC_LOG_DATE_FORMAT "%F" +#define TRAINTASTIC_LOG_TIME_FORMAT "%T" +#endif + class Logger { protected: