From 3189a3cbee8eb9d7ded7605776a75f35e5e2f122 Mon Sep 17 00:00:00 2001 From: Peter Bell Date: Fri, 15 May 2020 03:35:43 +0100 Subject: Update logging code to reduce unnecessary string copying: * Write into a single fmt::memory_buffer * Use string_view instead of AString for listener callbacks * Also collapsed vFLOG and vLOG functions into one per formatting type --- src/LoggerListeners.cpp | 69 +++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 34 deletions(-) (limited to 'src/LoggerListeners.cpp') diff --git a/src/LoggerListeners.cpp b/src/LoggerListeners.cpp index 995cc4b20..24a4e5d45 100644 --- a/src/LoggerListeners.cpp +++ b/src/LoggerListeners.cpp @@ -15,13 +15,13 @@ { protected: - virtual void SetLogColour(cLogger::eLogLevel a_LogLevel) = 0; + virtual void SetLogColour(eLogLevel a_LogLevel) = 0; virtual void SetDefaultLogColour() = 0; - virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override + virtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override { SetLogColour(a_LogLevel); - fputs(a_Message.c_str(), stdout); + fwrite(a_Message.data(), 1, a_Message.size(), stdout); SetDefaultLogColour(); } }; @@ -46,40 +46,40 @@ } #ifdef _DEBUG - virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override + virtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override { Super::Log(a_Message, a_LogLevel); // In a Windows Debug build, output the log to debug console as well: - OutputDebugStringA(a_Message.c_str()); + OutputDebugStringA(AString(a_Message).c_str()); } #endif - virtual void SetLogColour(cLogger::eLogLevel a_LogLevel) override + virtual void SetLogColour(eLogLevel a_LogLevel) override { // by default, gray on black WORD Attrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; switch (a_LogLevel) { - case cLogger::llRegular: + case eLogLevel::Regular: { // Gray on black Attrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; break; } - case cLogger::llInfo: + case eLogLevel::Info: { // Yellow on black Attrib = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY; break; } - case cLogger::llWarning: + case eLogLevel::Warning: { // Red on black Attrib = FOREGROUND_RED | FOREGROUND_INTENSITY; break; } - case cLogger::llError: + case eLogLevel::Error: { // Black on red Attrib = BACKGROUND_RED | BACKGROUND_INTENSITY; @@ -111,29 +111,29 @@ : public cColouredConsoleListener { public: - virtual void SetLogColour(cLogger::eLogLevel a_LogLevel) override + virtual void SetLogColour(eLogLevel a_LogLevel) override { switch (a_LogLevel) { - case cLogger::llRegular: + case eLogLevel::Regular: { // Whatever the console default is printf("\x1b[0m"); break; } - case cLogger::llInfo: + case eLogLevel::Info: { // Yellow on black printf("\x1b[33;1m"); break; } - case cLogger::llWarning: + case eLogLevel::Warning: { // Red on black printf("\x1b[31;1m"); break; } - case cLogger::llError: + case eLogLevel::Error: { // Yellow on red printf("\x1b[1;33;41;1m"); @@ -161,33 +161,32 @@ class cVanillaCPPConsoleListener : public cLogger::cListener { public: - virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override + virtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override { - AString LogLevelString; switch (a_LogLevel) { - case cLogger::llRegular: + case eLogLevel::Regular: { - LogLevelString = "Log"; + fputs("Log: ", stdout); break; } - case cLogger::llInfo: + case eLogLevel::Info: { - LogLevelString = "Info"; + fputs("Info: ", stdout); break; } - case cLogger::llWarning: + case eLogLevel::Warning: { - LogLevelString = "Warning"; + fputs("Warning: ", stdout); break; } - case cLogger::llError: + case eLogLevel::Error: { - LogLevelString = "Error"; + fputs("Error: ", stdout); break; } } - printf("%s: %s", LogLevelString.c_str(), a_Message.c_str()); + fwrite(a_Message.data(), 1, a_Message.size(), stdout); } }; @@ -199,7 +198,7 @@ public: class cNullConsoleListener : public cLogger::cListener { - virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override + virtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override { } }; @@ -275,36 +274,38 @@ public: return success; } - virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override + virtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override { - const char * LogLevelPrefix = "Unkn "; + std::string_view LogLevelPrefix = "Unkn "; bool ShouldFlush = false; switch (a_LogLevel) { - case cLogger::llRegular: + case eLogLevel::Regular: { LogLevelPrefix = " "; break; } - case cLogger::llInfo: + case eLogLevel::Info: { LogLevelPrefix = "Info "; break; } - case cLogger::llWarning: + case eLogLevel::Warning: { LogLevelPrefix = "Warn "; ShouldFlush = true; break; } - case cLogger::llError: + case eLogLevel::Error: { LogLevelPrefix = "Err "; ShouldFlush = true; break; } } - m_File.Printf("%s%s", LogLevelPrefix, a_Message.c_str()); + m_File.Write(LogLevelPrefix); + m_File.Write(a_Message); + if (ShouldFlush) { m_File.Flush(); -- cgit v1.2.3