|
|
|
@ -27,9 +27,61 @@ namespace details
|
|
|
|
|
class flag_formatter
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
flag_formatter()
|
|
|
|
|
{}
|
|
|
|
|
#endif
|
|
|
|
|
virtual ~flag_formatter()
|
|
|
|
|
{}
|
|
|
|
|
virtual void format(details::log_msg& msg, const std::tm& tm_time) = 0;
|
|
|
|
|
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
protected:
|
|
|
|
|
explicit flag_formatter(const format_padding& padding)
|
|
|
|
|
: _padding(padding)
|
|
|
|
|
{}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
inline bool has_padding() const
|
|
|
|
|
{
|
|
|
|
|
#ifndef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
return false;
|
|
|
|
|
#else
|
|
|
|
|
return _padding._width > 0;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
void format_pad(details::log_msg& msg, T val)
|
|
|
|
|
{
|
|
|
|
|
if (!has_padding())
|
|
|
|
|
msg.formatted << val;
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
auto spec = fmt::pad(val, _padding._width, _padding._char);
|
|
|
|
|
spec.align_ = _padding._alignment;
|
|
|
|
|
msg.formatted << spec;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
template<>
|
|
|
|
|
void format_pad(details::log_msg& msg, std::string str)
|
|
|
|
|
{
|
|
|
|
|
if (!has_padding())
|
|
|
|
|
msg.formatted << str;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
auto spec = fmt::pad(str.c_str(), _padding._width, _padding._char);
|
|
|
|
|
spec.align_ = _padding._alignment;
|
|
|
|
|
msg.formatted << spec;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const format_padding _padding;
|
|
|
|
|
#endif
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
@ -39,9 +91,16 @@ namespace
|
|
|
|
|
{
|
|
|
|
|
class name_formatter:public flag_formatter
|
|
|
|
|
{
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
public:
|
|
|
|
|
name_formatter(const format_padding& padding)
|
|
|
|
|
: flag_formatter(padding)
|
|
|
|
|
{}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void format(details::log_msg& msg, const std::tm&) override
|
|
|
|
|
{
|
|
|
|
|
msg.formatted << *msg.logger_name;
|
|
|
|
|
format_pad(msg, *msg.logger_name);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
@ -49,18 +108,32 @@ class name_formatter:public flag_formatter
|
|
|
|
|
// log level appender
|
|
|
|
|
class level_formatter:public flag_formatter
|
|
|
|
|
{
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
public:
|
|
|
|
|
level_formatter(const format_padding& padding)
|
|
|
|
|
: flag_formatter(padding)
|
|
|
|
|
{}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void format(details::log_msg& msg, const std::tm&) override
|
|
|
|
|
{
|
|
|
|
|
msg.formatted << level::to_str(msg.level);
|
|
|
|
|
format_pad(msg, level::to_str(msg.level));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// short log level appender
|
|
|
|
|
class short_level_formatter:public flag_formatter
|
|
|
|
|
{
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
public:
|
|
|
|
|
short_level_formatter(const format_padding& padding)
|
|
|
|
|
: flag_formatter(padding)
|
|
|
|
|
{}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void format(details::log_msg& msg, const std::tm&) override
|
|
|
|
|
{
|
|
|
|
|
msg.formatted << level::to_short_str(msg.level);
|
|
|
|
|
format_pad(msg, level::to_short_str(msg.level));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -87,9 +160,16 @@ static const days_array& days()
|
|
|
|
|
}
|
|
|
|
|
class a_formatter:public flag_formatter
|
|
|
|
|
{
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
public:
|
|
|
|
|
a_formatter(const format_padding& padding)
|
|
|
|
|
: flag_formatter(padding)
|
|
|
|
|
{}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void format(details::log_msg& msg, const std::tm& tm_time) override
|
|
|
|
|
{
|
|
|
|
|
msg.formatted << days()[tm_time.tm_wday];
|
|
|
|
|
format_pad(msg, days()[tm_time.tm_wday]);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
// message counter formatter
|
|
|
|
@ -97,7 +177,7 @@ class i_formatter SPDLOG_FINAL:public flag_formatter
|
|
|
|
|
{
|
|
|
|
|
void format(details::log_msg& msg, const std::tm&) override
|
|
|
|
|
{
|
|
|
|
|
msg.formatted << '#' << msg.msg_id;
|
|
|
|
|
msg.formatted << '#' << msg.msg_id; // TODO
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
//Full weekday name
|
|
|
|
@ -108,9 +188,16 @@ static const days_array& full_days()
|
|
|
|
|
}
|
|
|
|
|
class A_formatter SPDLOG_FINAL :public flag_formatter
|
|
|
|
|
{
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
public:
|
|
|
|
|
A_formatter(const format_padding& padding)
|
|
|
|
|
: flag_formatter(padding)
|
|
|
|
|
{}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void format(details::log_msg& msg, const std::tm& tm_time) override
|
|
|
|
|
{
|
|
|
|
|
msg.formatted << full_days()[tm_time.tm_wday];
|
|
|
|
|
format_pad(msg, full_days()[tm_time.tm_wday]);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -123,9 +210,16 @@ static const months_array& months()
|
|
|
|
|
}
|
|
|
|
|
class b_formatter:public flag_formatter
|
|
|
|
|
{
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
public:
|
|
|
|
|
b_formatter(const format_padding& padding)
|
|
|
|
|
: flag_formatter(padding)
|
|
|
|
|
{}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void format(details::log_msg& msg, const std::tm& tm_time) override
|
|
|
|
|
{
|
|
|
|
|
msg.formatted << months()[tm_time.tm_mon];
|
|
|
|
|
format_pad(msg, months()[tm_time.tm_mon]);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -137,9 +231,16 @@ static const months_array& full_months()
|
|
|
|
|
}
|
|
|
|
|
class B_formatter SPDLOG_FINAL :public flag_formatter
|
|
|
|
|
{
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
public:
|
|
|
|
|
B_formatter(const format_padding& padding)
|
|
|
|
|
: flag_formatter(padding)
|
|
|
|
|
{}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void format(details::log_msg& msg, const std::tm& tm_time) override
|
|
|
|
|
{
|
|
|
|
|
msg.formatted << full_months()[tm_time.tm_mon];
|
|
|
|
|
format_pad(msg, full_months()[tm_time.tm_mon]);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -384,18 +485,32 @@ private:
|
|
|
|
|
// Thread id
|
|
|
|
|
class t_formatter SPDLOG_FINAL:public flag_formatter
|
|
|
|
|
{
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
public:
|
|
|
|
|
t_formatter(const format_padding& padding)
|
|
|
|
|
: flag_formatter(padding)
|
|
|
|
|
{}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void format(details::log_msg& msg, const std::tm&) override
|
|
|
|
|
{
|
|
|
|
|
msg.formatted << msg.thread_id;
|
|
|
|
|
format_pad(msg, msg.thread_id);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Current pid
|
|
|
|
|
class pid_formatter SPDLOG_FINAL:public flag_formatter
|
|
|
|
|
{
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
public:
|
|
|
|
|
pid_formatter(const format_padding& padding)
|
|
|
|
|
: flag_formatter(padding)
|
|
|
|
|
{}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void format(details::log_msg& msg, const std::tm&) override
|
|
|
|
|
{
|
|
|
|
|
msg.formatted << details::os::pid();
|
|
|
|
|
format_pad(msg, details::os::pid());
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -511,9 +626,20 @@ inline void spdlog::pattern_formatter::compile_pattern(const std::string& patter
|
|
|
|
|
if (user_chars) //append user chars found so far
|
|
|
|
|
_formatters.push_back(std::move(user_chars));
|
|
|
|
|
|
|
|
|
|
if (++it != end)
|
|
|
|
|
handle_flag(*it);
|
|
|
|
|
else
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
format_padding padding;
|
|
|
|
|
#endif
|
|
|
|
|
while (++it != end)
|
|
|
|
|
{
|
|
|
|
|
#ifndef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
if (handle_flag(*it))
|
|
|
|
|
#else
|
|
|
|
|
if (handle_flag(*it, padding))
|
|
|
|
|
#endif
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (it == end)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else // chars not following the % sign should be displayed as is
|
|
|
|
@ -529,25 +655,64 @@ inline void spdlog::pattern_formatter::compile_pattern(const std::string& patter
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
inline void spdlog::pattern_formatter::handle_flag(char flag)
|
|
|
|
|
|
|
|
|
|
#ifndef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
inline bool spdlog::pattern_formatter::handle_flag(char flag)
|
|
|
|
|
#else
|
|
|
|
|
inline bool spdlog::pattern_formatter::handle_flag(char flag, format_padding& padding)
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
// handle format padding left alignment
|
|
|
|
|
if (flag == '-')
|
|
|
|
|
{
|
|
|
|
|
padding._alignment = fmt::ALIGN_LEFT;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
// handle format specifiers for padding
|
|
|
|
|
if (flag >= '0' && flag <= '9')
|
|
|
|
|
{
|
|
|
|
|
if (flag == '0' && padding._char == ' ')
|
|
|
|
|
padding._char = '0';
|
|
|
|
|
else
|
|
|
|
|
padding._width = padding._width * 10 + (flag - '0');
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
switch (flag)
|
|
|
|
|
{
|
|
|
|
|
// logger name
|
|
|
|
|
case 'n':
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::name_formatter()));
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::name_formatter(
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
padding
|
|
|
|
|
#endif
|
|
|
|
|
)));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'l':
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::level_formatter()));
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::level_formatter(
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
padding
|
|
|
|
|
#endif
|
|
|
|
|
)));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'L':
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::short_level_formatter()));
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::short_level_formatter(
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
padding
|
|
|
|
|
#endif
|
|
|
|
|
)));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case('t'):
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::t_formatter()));
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::t_formatter(
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
padding
|
|
|
|
|
#endif
|
|
|
|
|
)));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case('v'):
|
|
|
|
@ -555,20 +720,36 @@ inline void spdlog::pattern_formatter::handle_flag(char flag)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case('a'):
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::a_formatter()));
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::a_formatter(
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
padding
|
|
|
|
|
#endif
|
|
|
|
|
)));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case('A'):
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::A_formatter()));
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::A_formatter(
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
padding
|
|
|
|
|
#endif
|
|
|
|
|
)));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case('b'):
|
|
|
|
|
case('h'):
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::b_formatter()));
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::b_formatter(
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
padding
|
|
|
|
|
#endif
|
|
|
|
|
)));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case('B'):
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::B_formatter()));
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::B_formatter(
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
padding
|
|
|
|
|
#endif
|
|
|
|
|
)));
|
|
|
|
|
break;
|
|
|
|
|
case('c'):
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::c_formatter()));
|
|
|
|
@ -649,7 +830,11 @@ inline void spdlog::pattern_formatter::handle_flag(char flag)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case ('P'):
|
|
|
|
|
_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(
|
|
|
|
|
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
|
|
|
|
|
padding
|
|
|
|
|
#endif
|
|
|
|
|
)));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
#if defined(SPDLOG_ENABLE_MESSAGE_COUNTER)
|
|
|
|
@ -663,6 +848,8 @@ inline void spdlog::pattern_formatter::handle_flag(char flag)
|
|
|
|
|
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::ch_formatter(flag)));
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline std::tm spdlog::pattern_formatter::get_time(details::log_msg& msg)
|
|
|
|
|