#pragma once #define SPDLOG_FINAL #define SPDLOG_ALLOW_PROTECT #define SPDLOG_NO_FINAL //We need to override the rotating logger #include #include namespace logger { struct force_log_msg : public spdlog::details::log_msg { force_log_msg() = default; virtual ~force_log_msg() = default; force_log_msg(const std::string *loggers_name, spdlog::level::level_enum lvl, bool force) : log_msg(loggers_name, lvl), force(force) { } force_log_msg(const log_msg& other) = delete; force_log_msg(log_msg&& other) = delete; force_log_msg(const force_log_msg& other) = delete; force_log_msg& operator=(force_log_msg&& other) = delete; force_log_msg(force_log_msg&& other) = delete; bool force; }; class TerminalSink : public spdlog::sinks::sink { public: void log(const spdlog::details::log_msg &msg) override; void flush(); bool should_log_(const spdlog::details::log_msg &msg) const override; }; class ColoredFileSink : public spdlog::sinks::rotating_file_sink_mt { public: ColoredFileSink(const spdlog::filename_t &base_filename, size_t max_size, size_t max_files); protected: void _sink_it(const spdlog::details::log_msg &msg) override; }; class CostumeFormatter : public spdlog::formatter { public: void format(spdlog::details::log_msg &msg) override; private: inline std::string time(std::chrono::time_point point); }; }