// // Copyright(c) 2015 Gabi Melman. // Distributed under the MIT License (http://opensource.org/licenses/MIT) // #pragma once #ifndef SPDLOG_H #include "spdlog/spdlog.h" #endif #include "spdlog/details/console_globals.h" #include "spdlog/details/null_mutex.h" #include #include #include namespace spdlog { namespace sinks { template class stdout_sink final : public sink { public: using mutex_t = typename ConsoleMutex::mutex_t; stdout_sink() : mutex_(ConsoleMutex::mutex()) , file_(TargetStream::stream()) { } ~stdout_sink() override = default; stdout_sink(const stdout_sink &other) = delete; stdout_sink &operator=(const stdout_sink &other) = delete; void log(const details::log_msg &msg) override { std::lock_guard lock(mutex_); fmt::memory_buffer formatted; formatter_->format(msg, formatted); fwrite(formatted.data(), sizeof(char), formatted.size(), file_); fflush(TargetStream::stream()); } void flush() override { std::lock_guard lock(mutex_); fflush(file_); } void set_pattern(const std::string &pattern) override { std::lock_guard lock(mutex_); formatter_ = std::unique_ptr(new pattern_formatter(pattern)); } void set_formatter(std::unique_ptr sink_formatter) override { std::lock_guard lock(mutex_); formatter_ = std::move(sink_formatter); } private: mutex_t &mutex_; FILE *file_; }; using stdout_sink_mt = stdout_sink; using stdout_sink_st = stdout_sink; using stderr_sink_mt = stdout_sink; using stderr_sink_st = stdout_sink; } // namespace sinks // factory methods template inline std::shared_ptr stdout_logger_mt(const std::string &logger_name) { return Factory::template create(logger_name); } template inline std::shared_ptr stdout_logger_st(const std::string &logger_name) { return Factory::template create(logger_name); } template inline std::shared_ptr stderr_logger_mt(const std::string &logger_name) { return Factory::template create(logger_name); } template inline std::shared_ptr stderr_logger_st(const std::string &logger_name) { return Factory::template create(logger_name); } } // namespace spdlog