support variable format padding

pull/475/head
Sascha Montellese 8 years ago committed by montellese
parent b75da32f4d
commit 5d7e4c7b62

@ -27,9 +27,61 @@ namespace details
class flag_formatter class flag_formatter
{ {
public: public:
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
flag_formatter()
{}
#endif
virtual ~flag_formatter() virtual ~flag_formatter()
{} {}
virtual void format(details::log_msg& msg, const std::tm& tm_time) = 0; 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 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 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 // log level appender
class level_formatter:public flag_formatter 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 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 // short log level appender
class short_level_formatter:public flag_formatter 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 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 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 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 // 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 void format(details::log_msg& msg, const std::tm&) override
{ {
msg.formatted << '#' << msg.msg_id; msg.formatted << '#' << msg.msg_id; // TODO
} }
}; };
//Full weekday name //Full weekday name
@ -108,9 +188,16 @@ static const days_array& full_days()
} }
class A_formatter SPDLOG_FINAL :public flag_formatter 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 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 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 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 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 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 // Thread id
class t_formatter SPDLOG_FINAL:public flag_formatter 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 void format(details::log_msg& msg, const std::tm&) override
{ {
msg.formatted << msg.thread_id; format_pad(msg, msg.thread_id);
} }
}; };
// Current pid // Current pid
class pid_formatter SPDLOG_FINAL:public flag_formatter 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 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 if (user_chars) //append user chars found so far
_formatters.push_back(std::move(user_chars)); _formatters.push_back(std::move(user_chars));
if (++it != end) #ifdef SPDLOG_ENABLE_PATTERN_PADDING
handle_flag(*it); format_padding padding;
else #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; break;
} }
else // chars not following the % sign should be displayed as is 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) switch (flag)
{ {
// logger name // logger name
case 'n': 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; break;
case 'l': 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; break;
case 'L': 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; break;
case('t'): 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; break;
case('v'): case('v'):
@ -555,20 +720,36 @@ inline void spdlog::pattern_formatter::handle_flag(char flag)
break; break;
case('a'): 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; break;
case('A'): 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; break;
case('b'): case('b'):
case('h'): 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; break;
case('B'): 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; break;
case('c'): case('c'):
_formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::c_formatter())); _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; break;
case ('P'): 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; break;
#if defined(SPDLOG_ENABLE_MESSAGE_COUNTER) #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))); _formatters.push_back(std::unique_ptr<details::flag_formatter>(new details::ch_formatter(flag)));
break; break;
} }
return true;
} }
inline std::tm spdlog::pattern_formatter::get_time(details::log_msg& msg) inline std::tm spdlog::pattern_formatter::get_time(details::log_msg& msg)

@ -25,6 +25,14 @@ public:
virtual void format(details::log_msg& msg) = 0; virtual void format(details::log_msg& msg) = 0;
}; };
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
struct format_padding {
fmt::Alignment _alignment = fmt::ALIGN_RIGHT;
char _char = ' ';
unsigned _width = 0;
};
#endif
class pattern_formatter SPDLOG_FINAL : public formatter class pattern_formatter SPDLOG_FINAL : public formatter
{ {
@ -38,7 +46,11 @@ private:
const pattern_time_type _pattern_time; const pattern_time_type _pattern_time;
std::vector<std::unique_ptr<details::flag_formatter>> _formatters; std::vector<std::unique_ptr<details::flag_formatter>> _formatters;
std::tm get_time(details::log_msg& msg); std::tm get_time(details::log_msg& msg);
void handle_flag(char flag); #ifndef SPDLOG_ENABLE_PATTERN_PADDING
bool handle_flag(char flag);
#else
bool handle_flag(char flag, format_padding& padding);
#endif
void compile_pattern(const std::string& pattern); void compile_pattern(const std::string& pattern);
}; };
} }

@ -138,4 +138,10 @@
// //
// #define SPDLOG_LEVEL_NAMES { " TRACE", " DEBUG", " INFO", // #define SPDLOG_LEVEL_NAMES { " TRACE", " DEBUG", " INFO",
// " WARNING", " ERROR", "CRITICAL", "OFF" }; // " WARNING", " ERROR", "CRITICAL", "OFF" };
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Uncomment to enable logger pattern padding.
//
// #define SPDLOG_ENABLE_PATTERN_PADDING
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

@ -0,0 +1,34 @@
#include "includes.h"
#ifdef SPDLOG_ENABLE_PATTERN_PADDING
template<class T>
std::string log_formatted(const T& what, const std::string& pattern = "%v")
{
std::ostringstream oss;
auto oss_sink = std::make_shared<spdlog::sinks::ostream_sink_mt>(oss);
spdlog::logger oss_logger("oss", oss_sink);
oss_logger.set_level(spdlog::level::info);
oss_logger.set_pattern(pattern);
oss_logger.info(what);
return oss.str().substr(0, oss.str().length() - spdlog::details::os::eol_size);
}
TEST_CASE("padding", "[padding]")
{
REQUIRE(log_formatted("Hello") == "Hello");
REQUIRE(log_formatted("Hello", "%l %v") == "info Hello");
REQUIRE(log_formatted("Hello", "%6l %v") == " info Hello");
REQUIRE(log_formatted("Hello", "%-6l %v") == "info Hello");
REQUIRE(log_formatted("Hello", "%06l %v") == "00info Hello");
REQUIRE(log_formatted("Hello", "%-06l %v") == "info00 Hello");
REQUIRE(log_formatted("Hello", "%12l %v") == " info Hello");
REQUIRE(log_formatted("Hello", "%-12l %v") == "info Hello");
REQUIRE(log_formatted("Hello", "%012l %v") == "00000000info Hello");
REQUIRE(log_formatted("Hello", "%012l %v") == "00000000info Hello");
REQUIRE(log_formatted("Hello", "%-012l %v") == "info00000000 Hello");
}
#endif

@ -131,6 +131,7 @@
<ClCompile Include="file_log.cpp" /> <ClCompile Include="file_log.cpp" />
<ClCompile Include="format.cpp" /> <ClCompile Include="format.cpp" />
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />
<ClCompile Include="padding.cpp" />
<ClCompile Include="registry.cpp" /> <ClCompile Include="registry.cpp" />
<ClCompile Include="utils.cpp" /> <ClCompile Include="utils.cpp" />
</ItemGroup> </ItemGroup>

@ -39,6 +39,9 @@
<ClCompile Include="cond_logging.cpp"> <ClCompile Include="cond_logging.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="padding.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="includes.h"> <ClInclude Include="includes.h">

Loading…
Cancel
Save