1// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
2// Distributed under the MIT License (http://opensource.org/licenses/MIT)
3
4#pragma once
5
6#include <cstdio>
7#include <spdlog/details/console_globals.h>
8#include <spdlog/details/synchronous_factory.h>
9#include <spdlog/sinks/sink.h>
10
11#ifdef _WIN32
12 #include <spdlog/details/windows_include.h>
13#endif
14
15namespace spdlog {
16
17namespace sinks {
18
19template <typename ConsoleMutex>
20class stdout_sink_base : public sink {
21public:
22 using mutex_t = typename ConsoleMutex::mutex_t;
23 explicit stdout_sink_base(FILE *file);
24 ~stdout_sink_base() override = default;
25
26 stdout_sink_base(const stdout_sink_base &other) = delete;
27 stdout_sink_base(stdout_sink_base &&other) = delete;
28
29 stdout_sink_base &operator=(const stdout_sink_base &other) = delete;
30 stdout_sink_base &operator=(stdout_sink_base &&other) = delete;
31
32 void log(const details::log_msg &msg) override;
33 void flush() override;
34 void set_pattern(const std::string &pattern) override;
35
36 void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) override;
37
38protected:
39 mutex_t &mutex_;
40 FILE *file_;
41 std::unique_ptr<spdlog::formatter> formatter_;
42#ifdef _WIN32
43 HANDLE handle_;
44#endif // WIN32
45};
46
47template <typename ConsoleMutex>
48class stdout_sink : public stdout_sink_base<ConsoleMutex> {
49public:
50 stdout_sink();
51};
52
53template <typename ConsoleMutex>
54class stderr_sink : public stdout_sink_base<ConsoleMutex> {
55public:
56 stderr_sink();
57};
58
59using stdout_sink_mt = stdout_sink<details::console_mutex>;
60using stdout_sink_st = stdout_sink<details::console_nullmutex>;
61
62using stderr_sink_mt = stderr_sink<details::console_mutex>;
63using stderr_sink_st = stderr_sink<details::console_nullmutex>;
64
65} // namespace sinks
66
67// factory methods
68template <typename Factory = spdlog::synchronous_factory>
69std::shared_ptr<logger> stdout_logger_mt(const std::string &logger_name);
70
71template <typename Factory = spdlog::synchronous_factory>
72std::shared_ptr<logger> stdout_logger_st(const std::string &logger_name);
73
74template <typename Factory = spdlog::synchronous_factory>
75std::shared_ptr<logger> stderr_logger_mt(const std::string &logger_name);
76
77template <typename Factory = spdlog::synchronous_factory>
78std::shared_ptr<logger> stderr_logger_st(const std::string &logger_name);
79
80} // namespace spdlog
81
82#ifdef SPDLOG_HEADER_ONLY
83 #include "stdout_sinks-inl.h"
84#endif
85