Commit f29ff77a authored by Alexander Zilberkant's avatar Alexander Zilberkant

implement message counter feature

adds %i logger pattern for printing log message sequence ID
parent bf3a415b
...@@ -51,24 +51,27 @@ class async_log_helper ...@@ -51,24 +51,27 @@ class async_log_helper
size_t thread_id; size_t thread_id;
std::string txt; std::string txt;
async_msg_type msg_type; async_msg_type msg_type;
size_t msg_id;
async_msg() = default; async_msg() = default;
~async_msg() = default; ~async_msg() = default;
async_msg(async_msg&& other) SPDLOG_NOEXCEPT: async_msg(async_msg&& other) SPDLOG_NOEXCEPT:
logger_name(std::move(other.logger_name)), logger_name(std::move(other.logger_name)),
level(std::move(other.level)), level(std::move(other.level)),
time(std::move(other.time)), time(std::move(other.time)),
thread_id(other.thread_id), thread_id(other.thread_id),
txt(std::move(other.txt)), txt(std::move(other.txt)),
msg_type(std::move(other.msg_type)) msg_type(std::move(other.msg_type)),
msg_id(other.msg_id)
{} {}
async_msg(async_msg_type m_type): async_msg(async_msg_type m_type):
level(level::info), level(level::info),
thread_id(0), thread_id(0),
msg_type(m_type) msg_type(m_type),
msg_id(0)
{} {}
async_msg& operator=(async_msg&& other) SPDLOG_NOEXCEPT async_msg& operator=(async_msg&& other) SPDLOG_NOEXCEPT
...@@ -79,6 +82,7 @@ async_msg(async_msg&& other) SPDLOG_NOEXCEPT: ...@@ -79,6 +82,7 @@ async_msg(async_msg&& other) SPDLOG_NOEXCEPT:
thread_id = other.thread_id; thread_id = other.thread_id;
txt = std::move(other.txt); txt = std::move(other.txt);
msg_type = other.msg_type; msg_type = other.msg_type;
msg_id = other.msg_id;
return *this; return *this;
} }
...@@ -92,7 +96,8 @@ async_msg(async_msg&& other) SPDLOG_NOEXCEPT: ...@@ -92,7 +96,8 @@ async_msg(async_msg&& other) SPDLOG_NOEXCEPT:
time(m.time), time(m.time),
thread_id(m.thread_id), thread_id(m.thread_id),
txt(m.raw.data(), m.raw.size()), 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 #ifndef SPDLOG_NO_NAME
logger_name = *m.logger_name; logger_name = *m.logger_name;
...@@ -108,6 +113,7 @@ async_msg(async_msg&& other) SPDLOG_NOEXCEPT: ...@@ -108,6 +113,7 @@ async_msg(async_msg&& other) SPDLOG_NOEXCEPT:
msg.time = time; msg.time = time;
msg.thread_id = thread_id; msg.thread_id = thread_id;
msg.raw << txt; msg.raw << txt;
msg.msg_id = msg_id;
} }
}; };
......
...@@ -41,6 +41,8 @@ struct log_msg ...@@ -41,6 +41,8 @@ struct log_msg
size_t thread_id; size_t thread_id;
fmt::MemoryWriter raw; fmt::MemoryWriter raw;
fmt::MemoryWriter formatted; fmt::MemoryWriter formatted;
size_t msg_id;
}; };
} }
} }
...@@ -21,7 +21,8 @@ inline spdlog::logger::logger(const std::string& logger_name, const It& begin, c ...@@ -21,7 +21,8 @@ inline spdlog::logger::logger(const std::string& logger_name, const It& begin, c
_formatter(std::make_shared<pattern_formatter>("%+")), _formatter(std::make_shared<pattern_formatter>("%+")),
_level(level::info), _level(level::info),
_flush_level(level::off), _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) _err_handler = [this](const std::string &msg)
{ {
...@@ -37,10 +38,7 @@ inline spdlog::logger::logger(const std::string& logger_name, sinks_init_list si ...@@ -37,10 +38,7 @@ inline spdlog::logger::logger(const std::string& logger_name, sinks_init_list si
// ctor with single sink // ctor with single sink
inline spdlog::logger::logger(const std::string& logger_name, spdlog::sink_ptr single_sink): inline spdlog::logger::logger(const std::string& logger_name, spdlog::sink_ptr single_sink):
logger(logger_name, logger(logger_name, { single_sink })
{
single_sink
})
{} {}
...@@ -67,6 +65,7 @@ inline void spdlog::logger::log(level::level_enum lvl, const char* fmt, const Ar ...@@ -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); details::log_msg log_msg(&_name, lvl);
log_msg.raw.write(fmt, args...); log_msg.raw.write(fmt, args...);
log_msg.msg_id = _msg_counter.fetch_add(1, std::memory_order_relaxed);
_sink_it(log_msg); _sink_it(log_msg);
} }
catch (const std::exception &ex) catch (const std::exception &ex)
...@@ -87,6 +86,7 @@ inline void spdlog::logger::log(level::level_enum lvl, const char* msg) ...@@ -87,6 +86,7 @@ inline void spdlog::logger::log(level::level_enum lvl, const char* msg)
{ {
details::log_msg log_msg(&_name, lvl); details::log_msg log_msg(&_name, lvl);
log_msg.raw << msg; log_msg.raw << msg;
log_msg.msg_id = _msg_counter.fetch_add(1, std::memory_order_relaxed);
_sink_it(log_msg); _sink_it(log_msg);
} }
catch (const std::exception &ex) catch (const std::exception &ex)
...@@ -108,6 +108,7 @@ inline void spdlog::logger::log(level::level_enum lvl, const T& msg) ...@@ -108,6 +108,7 @@ inline void spdlog::logger::log(level::level_enum lvl, const T& msg)
{ {
details::log_msg log_msg(&_name, lvl); details::log_msg log_msg(&_name, lvl);
log_msg.raw << msg; log_msg.raw << msg;
log_msg.msg_id = _msg_counter.fetch_add(1, std::memory_order_relaxed);
_sink_it(log_msg); _sink_it(log_msg);
} }
catch (const std::exception &ex) catch (const std::exception &ex)
......
...@@ -92,7 +92,14 @@ class a_formatter:public flag_formatter ...@@ -92,7 +92,14 @@ class a_formatter:public flag_formatter
msg.formatted << days()[tm_time.tm_wday]; 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 //Full weekday name
static const days_array& full_days() static const days_array& full_days()
{ {
...@@ -645,6 +652,10 @@ inline void spdlog::pattern_formatter::handle_flag(char flag) ...@@ -645,6 +652,10 @@ inline void spdlog::pattern_formatter::handle_flag(char flag)
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::pid_formatter())); _formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::pid_formatter()));
break; break;
case ('i'):
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::i_formatter()));
break;
default: //Unknown flag appears as is default: //Unknown flag appears as is
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::ch_formatter('%'))); _formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::ch_formatter('%')));
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::ch_formatter(flag))); _formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::ch_formatter(flag)));
......
...@@ -98,6 +98,7 @@ protected: ...@@ -98,6 +98,7 @@ protected:
spdlog::level_t _flush_level; spdlog::level_t _flush_level;
log_err_handler _err_handler; log_err_handler _err_handler;
std::atomic<time_t> _last_err_time; std::atomic<time_t> _last_err_time;
std::atomic<size_t> _msg_counter;
}; };
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment