diff --git a/include/spdlog/details/line_logger_impl.h b/include/spdlog/details/line_logger_impl.h index d61225af..9c5b49e0 100644 --- a/include/spdlog/details/line_logger_impl.h +++ b/include/spdlog/details/line_logger_impl.h @@ -46,6 +46,11 @@ inline spdlog::details::line_logger::~line_logger() #endif _callback_logger->_log_msg(_log_msg); } + + if (_log_msg.level >= _callback_logger->_flush_level) + { + _callback_logger->flush(); + } } // diff --git a/include/spdlog/details/logger_impl.h b/include/spdlog/details/logger_impl.h index 428cd189..14d46b30 100644 --- a/include/spdlog/details/logger_impl.h +++ b/include/spdlog/details/logger_impl.h @@ -21,6 +21,7 @@ inline spdlog::logger::logger(const std::string& logger_name, const It& begin, c // no support under vs2013 for member initialization for std::atomic _level = level::info; + _flush_level = level::off; } // ctor with sinks as init list @@ -266,6 +267,11 @@ inline void spdlog::logger::set_level(spdlog::level::level_enum log_level) _level.store(log_level); } +inline void spdlog::logger::flush_on(level::level_enum log_level) +{ + _flush_level.store(log_level); +} + inline spdlog::level::level_enum spdlog::logger::level() const { return static_cast(_level.load(std::memory_order_relaxed)); diff --git a/include/spdlog/logger.h b/include/spdlog/logger.h index 41d51fbf..ca94e554 100644 --- a/include/spdlog/logger.h +++ b/include/spdlog/logger.h @@ -41,6 +41,9 @@ public: const std::string& name() const; bool should_log(level::level_enum) const; + // automatically call flush() after a message of level log_level or higher is emitted + void flush_on(level::level_enum log_level); + // logger.info(cppformat_string, arg1, arg2, arg3, ...) call style template details::line_logger trace(const char* fmt, const Args&... args); template details::line_logger debug(const char* fmt, const Args&... args); @@ -104,6 +107,7 @@ protected: std::vector _sinks; formatter_ptr _formatter; spdlog::level_t _level; + spdlog::level_t _flush_level; }; }