#include #include #include #include #include namespace scwx { namespace util { namespace Logger { static const std::string logPattern_ = "[%Y-%m-%d %T.%e] [%t] [%^%l%$] [%n] %v"; static std::vector> extraSinks_ {}; void Initialize() { spdlog::set_pattern(logPattern_); // Periodically flush every 3 seconds spdlog::flush_every(std::chrono::seconds(3)); // Flush whenever logging info or higher spdlog::flush_on(spdlog::level::level_enum::info); } void AddFileSink(const std::string& baseFilename) { constexpr std::size_t maxSize = 20u * 1024u * 1024u; // 20 MB constexpr std::size_t maxFiles = 5u; constexpr bool rotateOnOpen = true; auto fileSink = std::make_shared( baseFilename, maxSize, maxFiles, rotateOnOpen); fileSink->set_pattern(logPattern_); spdlog::apply_all( [&](std::shared_ptr logger) { auto& sinks = logger->sinks(); sinks.push_back(fileSink); }); extraSinks_.push_back(fileSink); } std::shared_ptr Create(const std::string& name) { // Create a shared sink static auto sink = std::make_shared(); // Create the logger std::shared_ptr logger = std::make_shared(name, sink); // Add additional registered sinks for (auto& extraSink : extraSinks_) { auto& sinks = logger->sinks(); sinks.push_back(extraSink); } // Register the logger, so it can be retrieved later using spdlog::get() spdlog::register_logger(logger); return logger; } } // namespace Logger } // namespace util } // namespace scwx