|
|
@ -1041,7 +1041,7 @@ SPDLOG_INLINE pattern_formatter::pattern_formatter(pattern_time_type time_type,
|
|
|
|
, last_log_secs_(0)
|
|
|
|
, last_log_secs_(0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
std::memset(&cached_tm_, 0, sizeof(cached_tm_));
|
|
|
|
std::memset(&cached_tm_, 0, sizeof(cached_tm_));
|
|
|
|
formatters_.push_back(details::make_unique<details::full_formatter>(details::padding_info{}));
|
|
|
|
formatters_.push_back(std::make_unique<details::full_formatter>(details::padding_info{}));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SPDLOG_INLINE std::unique_ptr<formatter> pattern_formatter::clone() const
|
|
|
|
SPDLOG_INLINE std::unique_ptr<formatter> pattern_formatter::clone() const
|
|
|
@ -1051,7 +1051,7 @@ SPDLOG_INLINE std::unique_ptr<formatter> pattern_formatter::clone() const
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cloned_custom_formatters[it.first] = it.second->clone();
|
|
|
|
cloned_custom_formatters[it.first] = it.second->clone();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
auto cloned = details::make_unique<pattern_formatter>(pattern_, pattern_time_type_, eol_, std::move(cloned_custom_formatters));
|
|
|
|
auto cloned = std::make_unique<pattern_formatter>(pattern_, pattern_time_type_, eol_, std::move(cloned_custom_formatters));
|
|
|
|
cloned->need_localtime(need_localtime_);
|
|
|
|
cloned->need_localtime(need_localtime_);
|
|
|
|
#if defined(__GNUC__) && __GNUC__ < 5
|
|
|
|
#if defined(__GNUC__) && __GNUC__ < 5
|
|
|
|
return std::move(cloned);
|
|
|
|
return std::move(cloned);
|
|
|
@ -1118,198 +1118,198 @@ SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_i
|
|
|
|
switch (flag)
|
|
|
|
switch (flag)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
case ('+'): // default formatter
|
|
|
|
case ('+'): // default formatter
|
|
|
|
formatters_.push_back(details::make_unique<details::full_formatter>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::full_formatter>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 'n': // logger name
|
|
|
|
case 'n': // logger name
|
|
|
|
formatters_.push_back(details::make_unique<details::name_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::name_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 'l': // level
|
|
|
|
case 'l': // level
|
|
|
|
formatters_.push_back(details::make_unique<details::level_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::level_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case 'L': // short level
|
|
|
|
case 'L': // short level
|
|
|
|
formatters_.push_back(details::make_unique<details::short_level_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::short_level_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('t'): // thread id
|
|
|
|
case ('t'): // thread id
|
|
|
|
formatters_.push_back(details::make_unique<details::t_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::t_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('v'): // the message text
|
|
|
|
case ('v'): // the message text
|
|
|
|
formatters_.push_back(details::make_unique<details::v_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::v_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('a'): // weekday
|
|
|
|
case ('a'): // weekday
|
|
|
|
formatters_.push_back(details::make_unique<details::a_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::a_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('A'): // short weekday
|
|
|
|
case ('A'): // short weekday
|
|
|
|
formatters_.push_back(details::make_unique<details::A_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::A_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('b'):
|
|
|
|
case ('b'):
|
|
|
|
case ('h'): // month
|
|
|
|
case ('h'): // month
|
|
|
|
formatters_.push_back(details::make_unique<details::b_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::b_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('B'): // short month
|
|
|
|
case ('B'): // short month
|
|
|
|
formatters_.push_back(details::make_unique<details::B_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::B_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('c'): // datetime
|
|
|
|
case ('c'): // datetime
|
|
|
|
formatters_.push_back(details::make_unique<details::c_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::c_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('C'): // year 2 digits
|
|
|
|
case ('C'): // year 2 digits
|
|
|
|
formatters_.push_back(details::make_unique<details::C_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::C_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('Y'): // year 4 digits
|
|
|
|
case ('Y'): // year 4 digits
|
|
|
|
formatters_.push_back(details::make_unique<details::Y_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::Y_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('D'):
|
|
|
|
case ('D'):
|
|
|
|
case ('x'): // datetime MM/DD/YY
|
|
|
|
case ('x'): // datetime MM/DD/YY
|
|
|
|
formatters_.push_back(details::make_unique<details::D_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::D_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('m'): // month 1-12
|
|
|
|
case ('m'): // month 1-12
|
|
|
|
formatters_.push_back(details::make_unique<details::m_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::m_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('d'): // day of month 1-31
|
|
|
|
case ('d'): // day of month 1-31
|
|
|
|
formatters_.push_back(details::make_unique<details::d_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::d_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('H'): // hours 24
|
|
|
|
case ('H'): // hours 24
|
|
|
|
formatters_.push_back(details::make_unique<details::H_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::H_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('I'): // hours 12
|
|
|
|
case ('I'): // hours 12
|
|
|
|
formatters_.push_back(details::make_unique<details::I_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::I_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('M'): // minutes
|
|
|
|
case ('M'): // minutes
|
|
|
|
formatters_.push_back(details::make_unique<details::M_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::M_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('S'): // seconds
|
|
|
|
case ('S'): // seconds
|
|
|
|
formatters_.push_back(details::make_unique<details::S_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::S_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('e'): // milliseconds
|
|
|
|
case ('e'): // milliseconds
|
|
|
|
formatters_.push_back(details::make_unique<details::e_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::e_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('f'): // microseconds
|
|
|
|
case ('f'): // microseconds
|
|
|
|
formatters_.push_back(details::make_unique<details::f_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::f_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('F'): // nanoseconds
|
|
|
|
case ('F'): // nanoseconds
|
|
|
|
formatters_.push_back(details::make_unique<details::F_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::F_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('E'): // seconds since epoch
|
|
|
|
case ('E'): // seconds since epoch
|
|
|
|
formatters_.push_back(details::make_unique<details::E_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::E_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('p'): // am/pm
|
|
|
|
case ('p'): // am/pm
|
|
|
|
formatters_.push_back(details::make_unique<details::p_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::p_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('r'): // 12 hour clock 02:55:02 pm
|
|
|
|
case ('r'): // 12 hour clock 02:55:02 pm
|
|
|
|
formatters_.push_back(details::make_unique<details::r_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::r_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('R'): // 24-hour HH:MM time
|
|
|
|
case ('R'): // 24-hour HH:MM time
|
|
|
|
formatters_.push_back(details::make_unique<details::R_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::R_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('T'):
|
|
|
|
case ('T'):
|
|
|
|
case ('X'): // ISO 8601 time format (HH:MM:SS)
|
|
|
|
case ('X'): // ISO 8601 time format (HH:MM:SS)
|
|
|
|
formatters_.push_back(details::make_unique<details::T_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::T_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('z'): // timezone
|
|
|
|
case ('z'): // timezone
|
|
|
|
formatters_.push_back(details::make_unique<details::z_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::z_formatter<Padder>>(padding));
|
|
|
|
need_localtime_ = true;
|
|
|
|
need_localtime_ = true;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('P'): // pid
|
|
|
|
case ('P'): // pid
|
|
|
|
formatters_.push_back(details::make_unique<details::pid_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::pid_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('^'): // color range start
|
|
|
|
case ('^'): // color range start
|
|
|
|
formatters_.push_back(details::make_unique<details::color_start_formatter>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::color_start_formatter>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('$'): // color range end
|
|
|
|
case ('$'): // color range end
|
|
|
|
formatters_.push_back(details::make_unique<details::color_stop_formatter>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::color_stop_formatter>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('@'): // source location (filename:filenumber)
|
|
|
|
case ('@'): // source location (filename:filenumber)
|
|
|
|
formatters_.push_back(details::make_unique<details::source_location_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::source_location_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('s'): // short source filename - without directory name
|
|
|
|
case ('s'): // short source filename - without directory name
|
|
|
|
formatters_.push_back(details::make_unique<details::short_filename_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::short_filename_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('g'): // full source filename
|
|
|
|
case ('g'): // full source filename
|
|
|
|
formatters_.push_back(details::make_unique<details::source_filename_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::source_filename_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('#'): // source line number
|
|
|
|
case ('#'): // source line number
|
|
|
|
formatters_.push_back(details::make_unique<details::source_linenum_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::source_linenum_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('!'): // source funcname
|
|
|
|
case ('!'): // source funcname
|
|
|
|
formatters_.push_back(details::make_unique<details::source_funcname_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::source_funcname_formatter<Padder>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('%'): // % char
|
|
|
|
case ('%'): // % char
|
|
|
|
formatters_.push_back(details::make_unique<details::ch_formatter>('%'));
|
|
|
|
formatters_.push_back(std::make_unique<details::ch_formatter>('%'));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('u'): // elapsed time since last log message in nanos
|
|
|
|
case ('u'): // elapsed time since last log message in nanos
|
|
|
|
formatters_.push_back(details::make_unique<details::elapsed_formatter<Padder, std::chrono::nanoseconds>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::elapsed_formatter<Padder, std::chrono::nanoseconds>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('i'): // elapsed time since last log message in micros
|
|
|
|
case ('i'): // elapsed time since last log message in micros
|
|
|
|
formatters_.push_back(details::make_unique<details::elapsed_formatter<Padder, std::chrono::microseconds>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::elapsed_formatter<Padder, std::chrono::microseconds>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('o'): // elapsed time since last log message in millis
|
|
|
|
case ('o'): // elapsed time since last log message in millis
|
|
|
|
formatters_.push_back(details::make_unique<details::elapsed_formatter<Padder, std::chrono::milliseconds>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::elapsed_formatter<Padder, std::chrono::milliseconds>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ('O'): // elapsed time since last log message in seconds
|
|
|
|
case ('O'): // elapsed time since last log message in seconds
|
|
|
|
formatters_.push_back(details::make_unique<details::elapsed_formatter<Padder, std::chrono::seconds>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::elapsed_formatter<Padder, std::chrono::seconds>>(padding));
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default: // Unknown flag appears as is
|
|
|
|
default: // Unknown flag appears as is
|
|
|
|
auto unknown_flag = details::make_unique<details::aggregate_formatter>();
|
|
|
|
auto unknown_flag = std::make_unique<details::aggregate_formatter>();
|
|
|
|
|
|
|
|
|
|
|
|
if (!padding.truncate_)
|
|
|
|
if (!padding.truncate_)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -1323,7 +1323,7 @@ SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_i
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
padding.truncate_ = false;
|
|
|
|
padding.truncate_ = false;
|
|
|
|
formatters_.push_back(details::make_unique<details::source_funcname_formatter<Padder>>(padding));
|
|
|
|
formatters_.push_back(std::make_unique<details::source_funcname_formatter<Padder>>(padding));
|
|
|
|
unknown_flag->add_ch(flag);
|
|
|
|
unknown_flag->add_ch(flag);
|
|
|
|
formatters_.push_back((std::move(unknown_flag)));
|
|
|
|
formatters_.push_back((std::move(unknown_flag)));
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1423,7 +1423,7 @@ SPDLOG_INLINE void pattern_formatter::compile_pattern_(const std::string &patter
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!user_chars)
|
|
|
|
if (!user_chars)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
user_chars = details::make_unique<details::aggregate_formatter>();
|
|
|
|
user_chars = std::make_unique<details::aggregate_formatter>();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
user_chars->add_ch(*it);
|
|
|
|
user_chars->add_ch(*it);
|
|
|
|
}
|
|
|
|
}
|
|
|
|