diff --git a/src/common/logging/log.cpp b/src/common/logging/log.cpp index 571cd08dc..69d7f0419 100644 --- a/src/common/logging/log.cpp +++ b/src/common/logging/log.cpp @@ -10,6 +10,9 @@ #include "common/logging/thread_name_formatter.h" #include "common/types.h" #include "core/emulator_settings.h" +#ifdef _WIN32 +#include +#endif namespace Common::Log { bool g_should_append = false; @@ -120,6 +123,42 @@ std::unordered_map> ALL_LOGGER {Class::Tty, nullptr}, }; +template +static auto UpdateColorLevels(T sink) { +#ifdef _WIN32 + using LogColor = std::uint16_t; + + const auto Grey = FOREGROUND_INTENSITY; + const auto Cyan = FOREGROUND_GREEN | FOREGROUND_BLUE; + const auto Bright_gray = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; + const auto Bright_yellow = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY; + const auto Bright_red = FOREGROUND_RED | FOREGROUND_INTENSITY; + const auto Bright_magenta = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY; +#else + using LogColor = std::string_view; + +#define ESC "\x1b" + const auto Grey = ESC "[1;30m"; + const auto Cyan = ESC "[0;36m"; + const auto Bright_gray = ESC "[0;37m"; + const auto Bright_yellow = ESC "[1;33m"; + const auto Bright_red = ESC "[1;31m"; + const auto Bright_magenta = ESC "[1;35m"; +#undef ESC +#endif + + const std::unordered_map colors{ + {spdlog::level::trace, Grey}, {spdlog::level::debug, Cyan}, + {spdlog::level::info, Bright_gray}, {spdlog::level::warn, Bright_yellow}, + {spdlog::level::err, Bright_red}, {spdlog::level::critical, Bright_magenta}}; + + for (const auto& [level, color] : colors) { + sink->set_color(level, color); + } + + return sink; +} + void Setup(std::string_view log_filename) { static bool already_registered = false; @@ -131,12 +170,14 @@ void Setup(std::string_view log_filename) { #ifdef _WIN32 if (EmulatorSettings.GetLogType() == "wincolor") { - g_console_sink = std::make_shared(); + g_console_sink = + UpdateColorLevels(std::make_shared()); } else { g_console_sink = std::make_shared(); } + #else - g_console_sink = std::make_shared(); + g_console_sink = UpdateColorLevels(std::make_shared()); #endif g_console_sink->set_formatter(std::make_unique(UNLIMITED_SIZE)); diff --git a/src/common/logging/thread_name_formatter.h b/src/common/logging/thread_name_formatter.h index 36b253aec..416795cfa 100644 --- a/src/common/logging/thread_name_formatter.h +++ b/src/common/logging/thread_name_formatter.h @@ -14,6 +14,13 @@ namespace Common::Log { static constexpr unsigned long long UNLIMITED_SIZE = 0; +static constexpr std::array level_string_views{"Trace", "Debug", "Info", "Warning", + "Error", "Critical", "Off"}; + +[[nodiscard]] static constexpr std::string_view to_string_view(spdlog::level lvl) noexcept { + return level_string_views.at(level_to_number(lvl)); +} + struct thread_name_formatter : spdlog::formatter { ~thread_name_formatter() override = default; @@ -31,8 +38,7 @@ struct thread_name_formatter : spdlog::formatter { dest.push_back(']'); dest.push_back(' '); dest.push_back('<'); - spdlog::details::fmt_helper::append_string_view(spdlog::to_string_view(msg.log_level), - dest); + spdlog::details::fmt_helper::append_string_view(Log::to_string_view(msg.log_level), dest); dest.push_back('>'); dest.push_back(' '); dest.push_back('(');