diff --git a/include/spdlog/details/spdlog_impl.h b/include/spdlog/details/spdlog_impl.h index 423ec43d..0d599697 100644 --- a/include/spdlog/details/spdlog_impl.h +++ b/include/spdlog/details/spdlog_impl.h @@ -14,7 +14,9 @@ #include #include #include +#ifdef _WIN32 #include +#endif #include #include @@ -59,11 +61,22 @@ inline std::shared_ptr spdlog::daily_logger_st(const std::string } // Create stdout/stderr loggers (with optinal color support) -inline std::shared_ptr create_console_logger(const std::string& logger_name, spdlog::sink_ptr sink, bool color) +inline std::shared_ptr create_console_logger_st(const std::string& logger_name, spdlog::sink_ptr sink, bool color) +{ + if (color) //use color wrapper sink +#ifdef _WIN32 + sink = std::make_shared(sink); +#else + sink = std::make_shared(sink); +#endif + return spdlog::details::registry::instance().create(logger_name, sink); +} + +inline std::shared_ptr create_console_logger_mt(const std::string& logger_name, spdlog::sink_ptr sink, bool color) { if (color) //use color wrapper sink #ifdef _WIN32 - sink = std::make_shared(sink); + sink = std::make_shared(sink); #else sink = std::make_shared(sink); #endif @@ -72,22 +85,22 @@ inline std::shared_ptr create_console_logger(const std::string& inline std::shared_ptr spdlog::stdout_logger_mt(const std::string& logger_name, bool color) { - return create_console_logger(logger_name, sinks::stdout_sink_mt::instance(), color); + return create_console_logger_mt(logger_name, sinks::stdout_sink_mt::instance(), color); } inline std::shared_ptr spdlog::stdout_logger_st(const std::string& logger_name, bool color) { - return create_console_logger(logger_name, sinks::stdout_sink_st::instance(), color); + return create_console_logger_st(logger_name, sinks::stdout_sink_st::instance(), color); } inline std::shared_ptr spdlog::stderr_logger_mt(const std::string& logger_name, bool color) { - return create_console_logger(logger_name, sinks::stderr_sink_mt::instance(), color); + return create_console_logger_mt(logger_name, sinks::stderr_sink_mt::instance(), color); } inline std::shared_ptr spdlog::stderr_logger_st(const std::string& logger_name, bool color) { - return create_console_logger(logger_name, sinks::stderr_sink_st::instance(), color); + return create_console_logger_st(logger_name, sinks::stderr_sink_st::instance(), color); } #if defined(__linux__) || defined(__APPLE__) diff --git a/include/spdlog/sinks/wincolor_sink.h b/include/spdlog/sinks/wincolor_sink.h index 74870bb5..501b2335 100644 --- a/include/spdlog/sinks/wincolor_sink.h +++ b/include/spdlog/sinks/wincolor_sink.h @@ -16,23 +16,13 @@ namespace spdlog namespace sinks { -#ifndef _WIN32 -#define FOREGROUND_INTENSITY 0 -#define FOREGROUND_RED 0 -#define FOREGROUND_GREEN 0 -#define FOREGROUND_BLUE 0 -#define BACKGROUND_INTENSITY 0 -#define BACKGROUND_RED 0 -#define BACKGROUND_GREEN 0 -#define BACKGROUND_BLUE 0 -#endif - /** * @brief The wincolor_sink is a decorator around another sink and uses * the windows api to set the color depending on the severity * of the message. */ -class wincolor_sink : public sink +template +class wincolor_sink : public base_sink { public: wincolor_sink(sink_ptr wrapped_sink); @@ -41,7 +31,6 @@ public: wincolor_sink(const wincolor_sink& other) = delete; wincolor_sink& operator=(const wincolor_sink& other) = delete; - virtual void log(const details::log_msg& msg) override; virtual void flush() override; // Formatting codes @@ -79,10 +68,16 @@ public: sink_ptr& wrapped_sink(); protected: + virtual void _sink_it(const details::log_msg& msg) override; + sink_ptr sink_; std::map colors_; }; +typedef wincolor_sink wincolor_sink_st; +typedef wincolor_sink wincolor_sink_mt; + + inline wincolor_sink::wincolor_sink(sink_ptr wrapped_sink) : sink_(wrapped_sink) { colors_[level::trace] = cyan; @@ -98,20 +93,14 @@ inline wincolor_sink::wincolor_sink(sink_ptr wrapped_sink) : sink_(wrapped_sink) colors_[level::emerg] = bold | yellow | on_red; } -inline void wincolor_sink::log(const details::log_msg& msg) +inline void wincolor_sink::_sink_it(const details::log_msg& msg) { // Wrap the originally formatted message in color codes -#ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle( STD_OUTPUT_HANDLE ), colors_[msg.level]); SetConsoleTextAttribute(GetStdHandle( STD_ERROR_HANDLE ), colors_[msg.level]); -#endif - sink_->log( msg ); - -#ifdef _WIN32 SetConsoleTextAttribute(GetStdHandle( STD_ERROR_HANDLE ), reset); SetConsoleTextAttribute(GetStdHandle( STD_OUTPUT_HANDLE ), reset); -#endif } inline void wincolor_sink::flush()