12 #if defined(_WIN32) || defined (__linux) || defined (__APPLE__) 13 class cColouredConsoleListener
19 virtual void SetDefaultLogColour() = 0;
23 SetLogColour(a_LogLevel);
24 fputs(a_Message.c_str(), stdout);
25 SetDefaultLogColour();
35 class cWindowsConsoleListener
36 :
public cColouredConsoleListener
38 typedef cColouredConsoleListener super;
40 cWindowsConsoleListener(HANDLE a_Console, WORD a_DefaultConsoleAttrib) :
42 m_DefaultConsoleAttrib(a_DefaultConsoleAttrib)
49 super::Log(a_Message, a_LogLevel);
51 OutputDebugStringA(a_Message.c_str());
59 WORD Attrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
65 Attrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
71 Attrib = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;
77 Attrib = FOREGROUND_RED | FOREGROUND_INTENSITY;
83 Attrib = BACKGROUND_RED | BACKGROUND_INTENSITY;
87 SetConsoleTextAttribute(m_Console, Attrib);
91 virtual void SetDefaultLogColour()
override 93 SetConsoleTextAttribute(m_Console, m_DefaultConsoleAttrib);
99 WORD m_DefaultConsoleAttrib;
104 #elif defined (__linux) || defined (__APPLE__) 108 class cANSIConsoleListener
109 :
public cColouredConsoleListener
125 printf(
"\x1b[33;1m");
131 printf(
"\x1b[31;1m");
137 printf(
"\x1b[1;33;41;1m");
144 virtual void SetDefaultLogColour()
override 169 LogLevelString =
"Log";
174 LogLevelString =
"Info";
179 LogLevelString =
"Warning";
184 LogLevelString =
"Error";
188 printf(
"%s: %s", LogLevelString.c_str(), a_Message.c_str());
213 return cpp14::make_unique<cNullConsoleListener>();
218 bool ShouldColorOutput = (_isatty(_fileno(stdin)) != 0);
219 if (ShouldColorOutput)
221 CONSOLE_SCREEN_BUFFER_INFO sbi;
222 HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE);
223 GetConsoleScreenBufferInfo(Console, &sbi);
224 WORD DefaultConsoleAttrib = sbi.wAttributes;
225 return cpp14::make_unique<cWindowsConsoleListener>(Console, DefaultConsoleAttrib);
229 return cpp14::make_unique<cVanillaCPPConsoleListener>();
231 #elif (defined (__linux) && !defined(ANDROID)) || defined (__APPLE__) 233 if (isatty(fileno(stdout)))
235 return cpp14::make_unique<cANSIConsoleListener>();
239 return cpp14::make_unique<cVanillaCPPConsoleListener>();
242 return cpp14::make_unique<cVanillaCPPConsoleListener>();
264 bool success = m_File.Open(
267 std::chrono::duration_cast<std::chrono::duration<
int, std::ratio<1>>>(
268 std::chrono::system_clock::now().time_since_epoch()
278 const char * LogLevelPrefix =
"Unkn ";
279 bool ShouldFlush =
false;
284 LogLevelPrefix =
" ";
289 LogLevelPrefix =
"Info ";
294 LogLevelPrefix =
"Warn ";
300 LogLevelPrefix =
"Err ";
305 m_File.Printf(
"%s%s", LogLevelPrefix, a_Message.c_str());
323 auto listener = cpp14::make_unique<cFileListener>();
324 if (!listener->Open())
326 return {
false,
nullptr};
328 return {
true, std::move(listener)};
virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override
virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override
static bool CreateFolder(const AString &a_FolderPath)
Creates a new folder with the specified name.
virtual void Log(AString a_Message, eLogLevel a_LogLevel)=0
virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override
std::unique_ptr< cLogger::cListener > MakeConsoleListener(bool a_IsService)
std::pair< bool, std::unique_ptr< cLogger::cListener > > MakeFileListener()
AString & Printf(AString &str, const char *format, fmt::ArgList args)
Output the formatted text into the string.