wincolor_sink.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
  2. // Distributed under the MIT License (http://opensource.org/licenses/MIT)
  3. #pragma once
  4. #include <spdlog/common.h>
  5. #include <spdlog/details/console_globals.h>
  6. #include <spdlog/details/null_mutex.h>
  7. #include <spdlog/sinks/sink.h>
  8. #include <memory>
  9. #include <mutex>
  10. #include <string>
  11. #include <array>
  12. #include <cstdint>
  13. namespace spdlog {
  14. namespace sinks {
  15. /*
  16. * Windows color console sink. Uses WriteConsoleA to write to the console with
  17. * colors
  18. */
  19. template<typename ConsoleMutex>
  20. class wincolor_sink : public sink
  21. {
  22. public:
  23. wincolor_sink(void *out_handle, color_mode mode);
  24. ~wincolor_sink() override;
  25. wincolor_sink(const wincolor_sink &other) = delete;
  26. wincolor_sink &operator=(const wincolor_sink &other) = delete;
  27. // change the color for the given level
  28. void set_color(level::level_enum level, std::uint16_t color);
  29. void log(const details::log_msg &msg) final override;
  30. void flush() final override;
  31. void set_pattern(const std::string &pattern) override final;
  32. void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) override final;
  33. void set_color_mode(color_mode mode);
  34. protected:
  35. using mutex_t = typename ConsoleMutex::mutex_t;
  36. void *out_handle_;
  37. mutex_t &mutex_;
  38. bool should_do_colors_;
  39. std::unique_ptr<spdlog::formatter> formatter_;
  40. std::array<std::uint16_t, level::n_levels> colors_;
  41. // set foreground color and return the orig console attributes (for resetting later)
  42. std::uint16_t set_foreground_color_(std::uint16_t attribs);
  43. // print a range of formatted message to console
  44. void print_range_(const memory_buf_t &formatted, size_t start, size_t end);
  45. // in case we are redirected to file (not in console mode)
  46. void write_to_file_(const memory_buf_t &formatted);
  47. void set_color_mode_impl(color_mode mode);
  48. };
  49. template<typename ConsoleMutex>
  50. class wincolor_stdout_sink : public wincolor_sink<ConsoleMutex>
  51. {
  52. public:
  53. explicit wincolor_stdout_sink(color_mode mode = color_mode::automatic);
  54. };
  55. template<typename ConsoleMutex>
  56. class wincolor_stderr_sink : public wincolor_sink<ConsoleMutex>
  57. {
  58. public:
  59. explicit wincolor_stderr_sink(color_mode mode = color_mode::automatic);
  60. };
  61. using wincolor_stdout_sink_mt = wincolor_stdout_sink<details::console_mutex>;
  62. using wincolor_stdout_sink_st = wincolor_stdout_sink<details::console_nullmutex>;
  63. using wincolor_stderr_sink_mt = wincolor_stderr_sink<details::console_mutex>;
  64. using wincolor_stderr_sink_st = wincolor_stderr_sink<details::console_nullmutex>;
  65. } // namespace sinks
  66. } // namespace spdlog
  67. #ifdef SPDLOG_HEADER_ONLY
  68. # include "wincolor_sink-inl.h"
  69. #endif