12 #if defined(_WIN32) || defined (__linux) || defined (__APPLE__)
13 class cColouredConsoleListener
18 virtual void SetLogColour(
eLogLevel a_LogLevel) = 0;
19 virtual void SetDefaultLogColour() = 0;
21 virtual void Log(std::string_view a_Message,
eLogLevel a_LogLevel)
override
23 SetLogColour(a_LogLevel);
24 fwrite(a_Message.data(),
sizeof(
char), a_Message.size(), stdout);
25 SetDefaultLogColour();
35 class cWindowsConsoleListener:
36 public cColouredConsoleListener
38 using Super = cColouredConsoleListener;
42 cWindowsConsoleListener(HANDLE a_Console, WORD a_DefaultConsoleAttrib):
44 m_DefaultConsoleAttrib(a_DefaultConsoleAttrib)
49 virtual void Log(std::string_view a_Message,
eLogLevel a_LogLevel)
override
51 Super::Log(a_Message, a_LogLevel);
53 OutputDebugStringA(
AString(a_Message).c_str());
58 virtual void SetLogColour(
eLogLevel a_LogLevel)
override
61 WORD Attrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
67 Attrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
73 Attrib = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;
79 Attrib = FOREGROUND_RED | FOREGROUND_INTENSITY;
85 Attrib = BACKGROUND_RED | BACKGROUND_INTENSITY;
89 SetConsoleTextAttribute(m_Console, Attrib);
93 virtual void SetDefaultLogColour()
override
95 SetConsoleTextAttribute(m_Console, m_DefaultConsoleAttrib);
101 WORD m_DefaultConsoleAttrib;
106 #elif defined (__linux) || defined (__APPLE__)
110 class cANSIConsoleListener
111 :
public cColouredConsoleListener
114 virtual void SetLogColour(
eLogLevel a_LogLevel)
override
127 printf(
"\x1b[33;1m");
133 printf(
"\x1b[31;1m");
139 printf(
"\x1b[1;33;41;1m");
146 virtual void SetDefaultLogColour()
override
164 virtual void Log(std::string_view a_Message,
eLogLevel a_LogLevel)
override
170 fputs(
"Log: ", stdout);
175 fputs(
"Info: ", stdout);
180 fputs(
"Warning: ", stdout);
185 fputs(
"Error: ", stdout);
189 fwrite(a_Message.data(),
sizeof(
char), a_Message.size(), stdout);
201 virtual void Log(std::string_view a_Message,
eLogLevel a_LogLevel)
override
214 return std::make_unique<cNullConsoleListener>();
219 bool ShouldColorOutput = (_isatty(_fileno(stdin)) != 0);
220 if (ShouldColorOutput)
222 CONSOLE_SCREEN_BUFFER_INFO sbi;
223 HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE);
224 GetConsoleScreenBufferInfo(Console, &sbi);
225 WORD DefaultConsoleAttrib = sbi.wAttributes;
226 return std::make_unique<cWindowsConsoleListener>(Console, DefaultConsoleAttrib);
230 return std::make_unique<cVanillaCPPConsoleListener>();
232 #elif defined (__linux) || defined (__APPLE__)
234 if (isatty(fileno(stdout)))
236 return std::make_unique<cANSIConsoleListener>();
240 return std::make_unique<cVanillaCPPConsoleListener>();
243 return std::make_unique<cVanillaCPPConsoleListener>();
267 FMT_STRING(
"logs/LOG_{}.txt"),
268 std::chrono::duration_cast<std::chrono::duration<
int, std::ratio<1>>>(
269 std::chrono::system_clock::now().time_since_epoch()
277 virtual void Log(std::string_view a_Message,
eLogLevel a_LogLevel)
override
279 std::string_view LogLevelPrefix =
"Unkn ";
280 bool ShouldFlush =
false;
285 LogLevelPrefix =
" ";
290 LogLevelPrefix =
"Info ";
295 LogLevelPrefix =
"Warn ";
301 LogLevelPrefix =
"Err ";
326 auto listener = std::make_unique<cFileListener>();
327 if (!listener->Open())
329 return {
false,
nullptr};
331 return {
true, std::move(listener)};
std::unique_ptr< cLogger::cListener > MakeConsoleListener(bool a_IsService)
std::pair< bool, std::unique_ptr< cLogger::cListener > > MakeFileListener()
virtual void Log(std::string_view a_Message, eLogLevel a_LogLevel)=0
virtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override
virtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override
virtual void Log(std::string_view a_Message, eLogLevel a_LogLevel) override
void Flush()
Flushes all the bufferef output into the file (only when writing)
static bool CreateFolder(const AString &a_FolderPath)
Creates a new folder with the specified name.
bool Open(const AString &iFileName, eMode iMode)
int Write(const void *a_Buffer, size_t a_NumBytes)
Writes up to a_NumBytes bytes from a_Buffer, returns the number of bytes actually written,...