stdout_sinks.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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/details/console_globals.h>
  5. #include <spdlog/details/synchronous_factory.h>
  6. #include <spdlog/sinks/sink.h>
  7. #include <cstdio>
  8. #ifdef _WIN32
  9. # include <spdlog/details/windows_include.h>
  10. #endif
  11. namespace spdlog {
  12. namespace sinks {
  13. template<typename ConsoleMutex>
  14. class stdout_sink_base : public sink
  15. {
  16. public:
  17. using mutex_t = typename ConsoleMutex::mutex_t;
  18. explicit stdout_sink_base(FILE *file);
  19. ~stdout_sink_base() override = default;
  20. stdout_sink_base(const stdout_sink_base &other) = delete;
  21. stdout_sink_base(stdout_sink_base &&other) = delete;
  22. stdout_sink_base &operator=(const stdout_sink_base &other) = delete;
  23. stdout_sink_base &operator=(stdout_sink_base &&other) = delete;
  24. void log(const details::log_msg &msg) override;
  25. void flush() override;
  26. void set_pattern(const std::string &pattern) override;
  27. void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) override;
  28. protected:
  29. mutex_t &mutex_;
  30. FILE *file_;
  31. std::unique_ptr<spdlog::formatter> formatter_;
  32. #ifdef _WIN32
  33. HANDLE handle_;
  34. #endif // WIN32
  35. };
  36. template<typename ConsoleMutex>
  37. class stdout_sink : public stdout_sink_base<ConsoleMutex>
  38. {
  39. public:
  40. stdout_sink();
  41. };
  42. template<typename ConsoleMutex>
  43. class stderr_sink : public stdout_sink_base<ConsoleMutex>
  44. {
  45. public:
  46. stderr_sink();
  47. };
  48. using stdout_sink_mt = stdout_sink<details::console_mutex>;
  49. using stdout_sink_st = stdout_sink<details::console_nullmutex>;
  50. using stderr_sink_mt = stderr_sink<details::console_mutex>;
  51. using stderr_sink_st = stderr_sink<details::console_nullmutex>;
  52. } // namespace sinks
  53. // factory methods
  54. template<typename Factory = spdlog::synchronous_factory>
  55. std::shared_ptr<logger> stdout_logger_mt(const std::string &logger_name);
  56. template<typename Factory = spdlog::synchronous_factory>
  57. std::shared_ptr<logger> stdout_logger_st(const std::string &logger_name);
  58. template<typename Factory = spdlog::synchronous_factory>
  59. std::shared_ptr<logger> stderr_logger_mt(const std::string &logger_name);
  60. template<typename Factory = spdlog::synchronous_factory>
  61. std::shared_ptr<logger> stderr_logger_st(const std::string &logger_name);
  62. } // namespace spdlog
  63. #ifdef SPDLOG_HEADER_ONLY
  64. # include "stdout_sinks-inl.h"
  65. #endif