From f29ff77ae70b49997a74f1b27e1873a0d9cd0dbe Mon Sep 17 00:00:00 2001 From: Alexander Zilberkant Date: Thu, 18 May 2017 22:36:48 +0300 Subject: [PATCH] implement message counter feature adds %i logger pattern for printing log message sequence ID --- include/spdlog/details/async_log_helper.h | 24 ++++++++++++------- include/spdlog/details/log_msg.h | 2 ++ include/spdlog/details/logger_impl.h | 11 +++++---- .../spdlog/details/pattern_formatter_impl.h | 13 +++++++++- include/spdlog/logger.h | 1 + 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/include/spdlog/details/async_log_helper.h b/include/spdlog/details/async_log_helper.h index faa23cbe..70b18555 100644 --- a/include/spdlog/details/async_log_helper.h +++ b/include/spdlog/details/async_log_helper.h @@ -51,24 +51,27 @@ class async_log_helper size_t thread_id; std::string txt; async_msg_type msg_type; + size_t msg_id; async_msg() = default; ~async_msg() = default; -async_msg(async_msg&& other) SPDLOG_NOEXCEPT: - logger_name(std::move(other.logger_name)), - level(std::move(other.level)), - time(std::move(other.time)), - thread_id(other.thread_id), - txt(std::move(other.txt)), - msg_type(std::move(other.msg_type)) + async_msg(async_msg&& other) SPDLOG_NOEXCEPT: + logger_name(std::move(other.logger_name)), + level(std::move(other.level)), + time(std::move(other.time)), + thread_id(other.thread_id), + txt(std::move(other.txt)), + msg_type(std::move(other.msg_type)), + msg_id(other.msg_id) {} async_msg(async_msg_type m_type): level(level::info), thread_id(0), - msg_type(m_type) + msg_type(m_type), + msg_id(0) {} async_msg& operator=(async_msg&& other) SPDLOG_NOEXCEPT @@ -79,6 +82,7 @@ async_msg(async_msg&& other) SPDLOG_NOEXCEPT: thread_id = other.thread_id; txt = std::move(other.txt); msg_type = other.msg_type; + msg_id = other.msg_id; return *this; } @@ -92,7 +96,8 @@ async_msg(async_msg&& other) SPDLOG_NOEXCEPT: time(m.time), thread_id(m.thread_id), txt(m.raw.data(), m.raw.size()), - msg_type(async_msg_type::log) + msg_type(async_msg_type::log), + msg_id(m.msg_id) { #ifndef SPDLOG_NO_NAME logger_name = *m.logger_name; @@ -108,6 +113,7 @@ async_msg(async_msg&& other) SPDLOG_NOEXCEPT: msg.time = time; msg.thread_id = thread_id; msg.raw << txt; + msg.msg_id = msg_id; } }; diff --git a/include/spdlog/details/log_msg.h b/include/spdlog/details/log_msg.h index ecdc73d7..789a7338 100644 --- a/include/spdlog/details/log_msg.h +++ b/include/spdlog/details/log_msg.h @@ -41,6 +41,8 @@ struct log_msg size_t thread_id; fmt::MemoryWriter raw; fmt::MemoryWriter formatted; + size_t msg_id; + }; } } diff --git a/include/spdlog/details/logger_impl.h b/include/spdlog/details/logger_impl.h index 02ebc875..7f94c625 100644 --- a/include/spdlog/details/logger_impl.h +++ b/include/spdlog/details/logger_impl.h @@ -21,7 +21,8 @@ inline spdlog::logger::logger(const std::string& logger_name, const It& begin, c _formatter(std::make_shared("%+")), _level(level::info), _flush_level(level::off), - _last_err_time(0) + _last_err_time(0), + _msg_counter(1) // message counter will start from 1. 0-message id will be reserved for controll messages { _err_handler = [this](const std::string &msg) { @@ -37,10 +38,7 @@ inline spdlog::logger::logger(const std::string& logger_name, sinks_init_list si // ctor with single sink inline spdlog::logger::logger(const std::string& logger_name, spdlog::sink_ptr single_sink): - logger(logger_name, -{ - single_sink -}) + logger(logger_name, { single_sink }) {} @@ -67,6 +65,7 @@ inline void spdlog::logger::log(level::level_enum lvl, const char* fmt, const Ar { details::log_msg log_msg(&_name, lvl); log_msg.raw.write(fmt, args...); + log_msg.msg_id = _msg_counter.fetch_add(1, std::memory_order_relaxed); _sink_it(log_msg); } catch (const std::exception &ex) @@ -87,6 +86,7 @@ inline void spdlog::logger::log(level::level_enum lvl, const char* msg) { details::log_msg log_msg(&_name, lvl); log_msg.raw << msg; + log_msg.msg_id = _msg_counter.fetch_add(1, std::memory_order_relaxed); _sink_it(log_msg); } catch (const std::exception &ex) @@ -108,6 +108,7 @@ inline void spdlog::logger::log(level::level_enum lvl, const T& msg) { details::log_msg log_msg(&_name, lvl); log_msg.raw << msg; + log_msg.msg_id = _msg_counter.fetch_add(1, std::memory_order_relaxed); _sink_it(log_msg); } catch (const std::exception &ex) diff --git a/include/spdlog/details/pattern_formatter_impl.h b/include/spdlog/details/pattern_formatter_impl.h index 5d47a04e..95ccda21 100644 --- a/include/spdlog/details/pattern_formatter_impl.h +++ b/include/spdlog/details/pattern_formatter_impl.h @@ -92,7 +92,14 @@ class a_formatter:public flag_formatter msg.formatted << days()[tm_time.tm_wday]; } }; - +// message counter formatter +class i_formatter SPDLOG_FINAL:public flag_formatter +{ + void format(details::log_msg& msg, const std::tm& tm_time) override + { + msg.formatted << '#' << msg.msg_id; + } +}; //Full weekday name static const days_array& full_days() { @@ -645,6 +652,10 @@ inline void spdlog::pattern_formatter::handle_flag(char flag) _formatters.push_back(std::unique_ptr(new details::pid_formatter())); break; + case ('i'): + _formatters.push_back(std::unique_ptr(new details::i_formatter())); + break; + default: //Unknown flag appears as is _formatters.push_back(std::unique_ptr(new details::ch_formatter('%'))); _formatters.push_back(std::unique_ptr(new details::ch_formatter(flag))); diff --git a/include/spdlog/logger.h b/include/spdlog/logger.h index af6f93fd..07ed53f8 100644 --- a/include/spdlog/logger.h +++ b/include/spdlog/logger.h @@ -98,6 +98,7 @@ protected: spdlog::level_t _flush_level; log_err_handler _err_handler; std::atomic _last_err_time; + std::atomic _msg_counter; }; }