| @@ -54,12 +54,22 @@ void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len) { | |||||||
|         TrimSourcePath(entry.location.c_str()), entry.message.c_str()); |         TrimSourcePath(entry.location.c_str()), entry.message.c_str()); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void ChangeConsoleColor(Level level) { | void PrintMessage(const Entry& entry) { | ||||||
|  |     std::array<char, 4 * 1024> format_buffer; | ||||||
|  |     FormatLogMessage(entry, format_buffer.data(), format_buffer.size()); | ||||||
|  |     fputs(format_buffer.data(), stderr); | ||||||
|  |     fputc('\n', stderr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void PrintColoredMessage(const Entry& entry) { | ||||||
| #ifdef _WIN32 | #ifdef _WIN32 | ||||||
|     static HANDLE console_handle = GetStdHandle(STD_ERROR_HANDLE); |     static HANDLE console_handle = GetStdHandle(STD_ERROR_HANDLE); | ||||||
|  |  | ||||||
|  |     CONSOLE_SCREEN_BUFFER_INFO original_info = {0}; | ||||||
|  |     GetConsoleScreenBufferInfo(console_handle, &original_info); | ||||||
|  |  | ||||||
|     WORD color = 0; |     WORD color = 0; | ||||||
|     switch (level) { |     switch (entry.log_level) { | ||||||
|     case Level::Trace: // Grey |     case Level::Trace: // Grey | ||||||
|         color = FOREGROUND_INTENSITY; break; |         color = FOREGROUND_INTENSITY; break; | ||||||
|     case Level::Debug: // Cyan |     case Level::Debug: // Cyan | ||||||
| @@ -76,9 +86,9 @@ static void ChangeConsoleColor(Level level) { | |||||||
|  |  | ||||||
|     SetConsoleTextAttribute(console_handle, color); |     SetConsoleTextAttribute(console_handle, color); | ||||||
| #else | #else | ||||||
| #define ESC "\x1b" | #   define ESC "\x1b" | ||||||
|     const char* color = ""; |     const char* color = ""; | ||||||
|     switch (level) { |     switch (entry.log_level) { | ||||||
|     case Level::Trace: // Grey |     case Level::Trace: // Grey | ||||||
|         color = ESC "[1;30m"; break; |         color = ESC "[1;30m"; break; | ||||||
|     case Level::Debug: // Cyan |     case Level::Debug: // Cyan | ||||||
| @@ -92,18 +102,18 @@ static void ChangeConsoleColor(Level level) { | |||||||
|     case Level::Critical: // Bright magenta |     case Level::Critical: // Bright magenta | ||||||
|         color = ESC "[1;35m"; break; |         color = ESC "[1;35m"; break; | ||||||
|     } |     } | ||||||
| #undef ESC |  | ||||||
|  |  | ||||||
|     fputs(color, stderr); |     fputs(color, stderr); | ||||||
| #endif | #endif | ||||||
| } |  | ||||||
|  |  | ||||||
| void PrintMessage(const Entry& entry) { |     PrintMessage(entry); | ||||||
|     ChangeConsoleColor(entry.log_level); |  | ||||||
|     std::array<char, 4 * 1024> format_buffer; | #ifdef _WIN32 | ||||||
|     FormatLogMessage(entry, format_buffer.data(), format_buffer.size()); |     SetConsoleTextAttribute(console_handle, original_info.wAttributes); | ||||||
|     fputs(format_buffer.data(), stderr); | #else | ||||||
|     fputc('\n', stderr); |     fputs(ESC "[0m", stderr); | ||||||
|  | #   undef ESC | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void TextLoggingLoop(std::shared_ptr<Logger> logger, const Filter* filter) { | void TextLoggingLoop(std::shared_ptr<Logger> logger, const Filter* filter) { | ||||||
| @@ -117,7 +127,7 @@ void TextLoggingLoop(std::shared_ptr<Logger> logger, const Filter* filter) { | |||||||
|         for (size_t i = 0; i < num_entries; ++i) { |         for (size_t i = 0; i < num_entries; ++i) { | ||||||
|             const Entry& entry = entry_buffer[i]; |             const Entry& entry = entry_buffer[i]; | ||||||
|             if (filter->CheckMessage(entry.log_class, entry.log_level)) { |             if (filter->CheckMessage(entry.log_class, entry.log_level)) { | ||||||
|                 PrintMessage(entry); |                 PrintColoredMessage(entry); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -29,6 +29,8 @@ const char* TrimSourcePath(const char* path, const char* root = "src"); | |||||||
| void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len); | void FormatLogMessage(const Entry& entry, char* out_text, size_t text_len); | ||||||
| /// Formats and prints a log entry to stderr. | /// Formats and prints a log entry to stderr. | ||||||
| void PrintMessage(const Entry& entry); | void PrintMessage(const Entry& entry); | ||||||
|  | /// Prints the same message as `PrintMessage`, but colored acoording to the severity level. | ||||||
|  | void PrintColoredMessage(const Entry& entry); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Logging loop that repeatedly reads messages from the provided logger and prints them to the |  * Logging loop that repeatedly reads messages from the provided logger and prints them to the | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Yuri Kunde Schlesner
					Yuri Kunde Schlesner