From 3187dbf0aa0943d9eca0c5c1259f8a8ca549709b Mon Sep 17 00:00:00 2001 From: tycho Date: Sun, 30 Aug 2015 22:57:43 +0100 Subject: Increase robustness of the logging subsystem --- src/LoggerListeners.cpp | 120 ++++++++++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 49 deletions(-) (limited to 'src/LoggerListeners.cpp') diff --git a/src/LoggerListeners.cpp b/src/LoggerListeners.cpp index ba8139678..3b6ed2147 100644 --- a/src/LoggerListeners.cpp +++ b/src/LoggerListeners.cpp @@ -251,11 +251,11 @@ class cNullConsoleListener -cLogger::cListener * MakeConsoleListener(bool a_IsService) +std::unique_ptr MakeConsoleListener(bool a_IsService) { if (a_IsService) { - return new cNullConsoleListener; + return cpp14::make_unique(); } #ifdef _WIN32 @@ -267,25 +267,25 @@ cLogger::cListener * MakeConsoleListener(bool a_IsService) HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(Console, &sbi); WORD DefaultConsoleAttrib = sbi.wAttributes; - return new cWindowsConsoleListener(Console, DefaultConsoleAttrib); + return cpp14::make_unique(Console, DefaultConsoleAttrib); } else { - return new cVanillaCPPConsoleListener; + return cpp14::make_unique(); } #elif defined (__linux) && !defined(ANDROID_NDK) // TODO: lookup terminal in terminfo if (isatty(fileno(stdout))) { - return new cLinuxConsoleListener(); + return cpp14::make_unique(); } else { - return new cVanillaCPPConsoleListener(); + return cpp14::make_unique(); } #else - return new cVanillaCPPConsoleListener(); + return cpp14::make_unique(); #endif } @@ -296,60 +296,82 @@ cLogger::cListener * MakeConsoleListener(bool a_IsService) //////////////////////////////////////////////////////////////////////////////// // cFileListener: -cFileListener::cFileListener(void) +class cFileListener + : public cLogger::cListener { - cFile::CreateFolder(FILE_IO_PREFIX + AString("logs")); - m_File.Open( - FILE_IO_PREFIX + Printf( - "logs/LOG_%d.txt", - std::chrono::duration_cast>>( - std::chrono::system_clock::now().time_since_epoch() - ).count() - ), - cFile::fmAppend - ); -} - - +public: + cFileListener(void) {} + bool Open() + { + // Assume creation succeeds, as the API does not provide a way to tell if the folder exists. + cFile::CreateFolder(FILE_IO_PREFIX + AString("logs")); + bool success = m_File.Open( + FILE_IO_PREFIX + Printf( + "logs/LOG_%d.txt", + std::chrono::duration_cast>>( + std::chrono::system_clock::now().time_since_epoch() + ).count() + ), + cFile::fmAppend + ); + return success; + } -void cFileListener::Log(AString a_Message, cLogger::eLogLevel a_LogLevel) -{ - const char * LogLevelPrefix = "Unkn "; - bool ShouldFlush = false; - switch (a_LogLevel) + virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override { - case cLogger::llRegular: - { - LogLevelPrefix = " "; - break; - } - case cLogger::llInfo: - { - LogLevelPrefix = "Info "; - break; - } - case cLogger::llWarning: + const char * LogLevelPrefix = "Unkn "; + bool ShouldFlush = false; + switch (a_LogLevel) { - LogLevelPrefix = "Warn "; - ShouldFlush = true; - break; + case cLogger::llRegular: + { + LogLevelPrefix = " "; + break; + } + case cLogger::llInfo: + { + LogLevelPrefix = "Info "; + break; + } + case cLogger::llWarning: + { + LogLevelPrefix = "Warn "; + ShouldFlush = true; + break; + } + case cLogger::llError: + { + LogLevelPrefix = "Err "; + ShouldFlush = true; + break; + } } - case cLogger::llError: + m_File.Printf("%s%s", LogLevelPrefix, a_Message.c_str()); + if (ShouldFlush) { - LogLevelPrefix = "Err "; - ShouldFlush = true; - break; + m_File.Flush(); } } - m_File.Printf("%s%s", LogLevelPrefix, a_Message.c_str()); - if (ShouldFlush) + +private: + + cFile m_File; +}; + + + + + +std::pair> MakeFileListener() +{ + auto listener = cpp14::make_unique(); + if (!listener->Open()) { - m_File.Flush(); + return {false, nullptr}; } + return {true, std::move(listener)}; } - - -- cgit v1.2.3