diff --git a/include/spdlog/async_logger.h b/include/spdlog/async_logger.h index 73f34ced..a7ecb787 100644 --- a/include/spdlog/async_logger.h +++ b/include/spdlog/async_logger.h @@ -58,7 +58,7 @@ public: std::shared_ptr clone(std::string new_name) override; protected: - void sink_it_(const details::log_msg &msg) override; + void sink_it_(details::log_msg &msg) override; void flush_() override; void backend_log_(const details::log_msg &incoming_log_msg); diff --git a/include/spdlog/details/async_logger_impl.h b/include/spdlog/details/async_logger_impl.h index 2923a10e..e604d4ed 100644 --- a/include/spdlog/details/async_logger_impl.h +++ b/include/spdlog/details/async_logger_impl.h @@ -36,14 +36,14 @@ inline spdlog::async_logger::async_logger( } // send the log message to the thread pool -inline void spdlog::async_logger::sink_it_(const details::log_msg &msg) +inline void spdlog::async_logger::sink_it_(details::log_msg &msg) { #if defined(SPDLOG_ENABLE_MESSAGE_COUNTER) incr_msg_counter_(msg); #endif if (auto pool_ptr = thread_pool_.lock()) { - pool_ptr->post_log(shared_from_this(), msg, overflow_policy_); + pool_ptr->post_log(shared_from_this(), std::move(msg), overflow_policy_); } else { diff --git a/include/spdlog/details/log_msg.h b/include/spdlog/details/log_msg.h index 3894b0a4..f94aa7f4 100644 --- a/include/spdlog/details/log_msg.h +++ b/include/spdlog/details/log_msg.h @@ -39,8 +39,9 @@ struct log_msg log_clock::time_point time; size_t thread_id; fmt::memory_buffer raw; - mutable size_t msg_id{0}; - // info about wrapping the formatted text with color + size_t msg_id{0}; + + // info about wrapping the formatted text with color (updated by pattern_formatter). mutable size_t color_range_start{0}; mutable size_t color_range_end{0}; }; diff --git a/include/spdlog/details/logger_impl.h b/include/spdlog/details/logger_impl.h index 27f0eb46..46301ea1 100644 --- a/include/spdlog/details/logger_impl.h +++ b/include/spdlog/details/logger_impl.h @@ -317,7 +317,7 @@ inline bool spdlog::logger::should_log(spdlog::level::level_enum msg_level) cons // protected virtual called at end of each user log call (if enabled) by the // line_logger // -inline void spdlog::logger::sink_it_(const details::log_msg &msg) +inline void spdlog::logger::sink_it_(details::log_msg &msg) { #if defined(SPDLOG_ENABLE_MESSAGE_COUNTER) incr_msg_counter_(msg); diff --git a/include/spdlog/details/thread_pool.h b/include/spdlog/details/thread_pool.h index 64dc6a26..9107cd1b 100644 --- a/include/spdlog/details/thread_pool.h +++ b/include/spdlog/details/thread_pool.h @@ -69,7 +69,7 @@ struct async_msg #endif // construct from log_msg with given type - async_msg(async_logger_ptr &&worker, async_msg_type the_type, const details::log_msg &m) + async_msg(async_logger_ptr &&worker, async_msg_type the_type, details::log_msg &&m) : msg_type(the_type) , level(m.level) , time(m.time) @@ -149,9 +149,9 @@ public: thread_pool(const thread_pool &) = delete; thread_pool &operator=(thread_pool &&) = delete; - void post_log(async_logger_ptr &&worker_ptr, const details::log_msg &msg, async_overflow_policy overflow_policy) + void post_log(async_logger_ptr &&worker_ptr, details::log_msg &&msg, async_overflow_policy overflow_policy) { - async_msg async_m(std::forward(worker_ptr), async_msg_type::log, msg); + async_msg async_m(std::forward(worker_ptr), async_msg_type::log, std::forward(msg)); post_async_msg_(std::move(async_m), overflow_policy); } diff --git a/include/spdlog/logger.h b/include/spdlog/logger.h index 13ef910f..1bcf4bc2 100644 --- a/include/spdlog/logger.h +++ b/include/spdlog/logger.h @@ -142,7 +142,7 @@ public: virtual std::shared_ptr clone(std::string logger_name); protected: - virtual void sink_it_(const details::log_msg &msg); + virtual void sink_it_(details::log_msg &msg); virtual void flush_(); bool should_flush_(const details::log_msg &msg); diff --git a/tests/includes.h b/tests/includes.h index bce67418..2090bcb4 100644 --- a/tests/includes.h +++ b/tests/includes.h @@ -12,6 +12,7 @@ #define SPDLOG_TRACE_ON #define SPDLOG_DEBUG_ON +#define SPDLOG_ENABLE_MESSAGE_COUNTER #include "spdlog/async.h" #include "spdlog/sinks/basic_file_sink.h" diff --git a/tests/test_misc.cpp b/tests/test_misc.cpp index 22dfb4b8..66ae7c87 100644 --- a/tests/test_misc.cpp +++ b/tests/test_misc.cpp @@ -175,3 +175,19 @@ TEST_CASE("to_hex_no_delimiter", "[to_hex]") auto output = oss.str(); REQUIRE(ends_with(output, "0000: 090A0B0CFFFF" + std::string(spdlog::details::os::default_eol))); } + +TEST_CASE("message_counter", "[message_counter]") +{ + std::ostringstream oss; + auto oss_sink = std::make_shared(oss); + spdlog::logger oss_logger("oss", oss_sink); + oss_logger.set_pattern("%i %v"); + + oss_logger.info("Hello"); + REQUIRE(oss.str() == "000001 Hello" + std::string(spdlog::details::os::default_eol)); + + oss.str(""); + oss_logger.info("Hello again"); + + REQUIRE(oss.str() == "000002 Hello again" + std::string(spdlog::details::os::default_eol)); +}