implement message counter feature

adds %i logger pattern for printing log message sequence ID
This commit is contained in:
Alexander Zilberkant 2017-05-18 22:36:48 +03:00
parent bf3a415b1d
commit f29ff77ae7
5 changed files with 36 additions and 15 deletions

View File

@ -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;
}
};

View File

@ -41,6 +41,8 @@ struct log_msg
size_t thread_id;
fmt::MemoryWriter raw;
fmt::MemoryWriter formatted;
size_t msg_id;
};
}
}

View File

@ -21,7 +21,8 @@ inline spdlog::logger::logger(const std::string& logger_name, const It& begin, c
_formatter(std::make_shared<pattern_formatter>("%+")),
_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)

View File

@ -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<details::flag_formatter>(new details::pid_formatter()));
break;
case ('i'):
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::i_formatter()));
break;
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(flag)));

View File

@ -98,6 +98,7 @@ protected:
spdlog::level_t _flush_level;
log_err_handler _err_handler;
std::atomic<time_t> _last_err_time;
std::atomic<size_t> _msg_counter;
};
}