* added support for specifying the level color range multiple times in the pattern

* added a few tests to check the multiple color range functionality
* updated the previous color range tests so they pass again with the above code changes.
pull/1616/head
Josh Schmiedlin 5 years ago
parent bd8649423c
commit e12d1356e2

@ -22,8 +22,8 @@ struct SPDLOG_API log_msg
size_t thread_id{0}; size_t thread_id{0};
// wrapping the formatted text with color (updated by pattern_formatter). // wrapping the formatted text with color (updated by pattern_formatter).
mutable size_t color_range_start{0}; mutable std::vector<size_t> color_range_start;
mutable size_t color_range_end{0}; mutable std::vector<size_t> color_range_end;
source_loc source; source_loc source;
string_view_t payload; string_view_t payload;

@ -734,7 +734,7 @@ public:
void format(const details::log_msg &msg, const std::tm &, memory_buf_t &dest) override void format(const details::log_msg &msg, const std::tm &, memory_buf_t &dest) override
{ {
msg.color_range_start = dest.size(); msg.color_range_start.push_back(dest.size());
} }
}; };
@ -747,7 +747,7 @@ public:
void format(const details::log_msg &msg, const std::tm &, memory_buf_t &dest) override void format(const details::log_msg &msg, const std::tm &, memory_buf_t &dest) override
{ {
msg.color_range_end = dest.size(); msg.color_range_end.push_back(dest.size());
} }
}; };
@ -963,10 +963,10 @@ public:
dest.push_back('['); dest.push_back('[');
// wrap the level name with color // wrap the level name with color
msg.color_range_start = dest.size(); msg.color_range_start.push_back(dest.size());
// fmt_helper::append_string_view(level::to_c_str(msg.level), dest); // fmt_helper::append_string_view(level::to_c_str(msg.level), dest);
fmt_helper::append_string_view(level::to_string_view(msg.level), dest); fmt_helper::append_string_view(level::to_string_view(msg.level), dest);
msg.color_range_end = dest.size(); msg.color_range_end.push_back(dest.size());
dest.push_back(']'); dest.push_back(']');
dest.push_back(' '); dest.push_back(' ');

@ -43,20 +43,31 @@ SPDLOG_INLINE void ansicolor_sink<ConsoleMutex>::log(const details::log_msg &msg
// Wrap the originally formatted message in color codes. // Wrap the originally formatted message in color codes.
// If color is not supported in the terminal, log as is instead. // If color is not supported in the terminal, log as is instead.
std::lock_guard<mutex_t> lock(mutex_); std::lock_guard<mutex_t> lock(mutex_);
msg.color_range_start = 0; msg.color_range_start.clear();
msg.color_range_end = 0; msg.color_range_end.clear();
memory_buf_t formatted; memory_buf_t formatted;
formatter_->format(msg, formatted); formatter_->format(msg, formatted);
if (should_do_colors_ && msg.color_range_end > msg.color_range_start) if (should_do_colors_ && !msg.color_range_start.empty() && msg.color_range_start.size() == msg.color_range_end.size())
{ {
// before color range // before color range
print_range_(formatted, 0, msg.color_range_start); print_range_(formatted, 0, msg.color_range_start[0]);
// in color range
print_ccode_(colors_[msg.level]); for(size_t i=0; i<msg.color_range_start.size(); i++)
print_range_(formatted, msg.color_range_start, msg.color_range_end); {
print_ccode_(reset); // in color range
// after color range print_ccode_(colors_[msg.level]);
print_range_(formatted, msg.color_range_end, formatted.size()); print_range_(formatted, msg.color_range_start[i], msg.color_range_end[i]);
print_ccode_(reset);
// after color range
if(i+1 < msg.color_range_end.size())
{
print_range_(formatted, msg.color_range_end[i], msg.color_range_start[i+1]);
}
else
{
print_range_(formatted, msg.color_range_end[i], formatted.size());
}
}
} }
else // no color else // no color
{ {

@ -52,8 +52,8 @@ template<typename ConsoleMutex>
void SPDLOG_INLINE wincolor_sink<ConsoleMutex>::log(const details::log_msg &msg) void SPDLOG_INLINE wincolor_sink<ConsoleMutex>::log(const details::log_msg &msg)
{ {
std::lock_guard<mutex_t> lock(mutex_); std::lock_guard<mutex_t> lock(mutex_);
msg.color_range_start = 0; msg.color_range_start.clear();
msg.color_range_end = 0; msg.color_range_end.clear();
memory_buf_t formatted; memory_buf_t formatted;
formatter_->format(msg, formatted); formatter_->format(msg, formatted);
if (!in_console_) if (!in_console_)
@ -61,17 +61,29 @@ void SPDLOG_INLINE wincolor_sink<ConsoleMutex>::log(const details::log_msg &msg)
write_to_file_(formatted); write_to_file_(formatted);
return; return;
} }
if (should_do_colors_ && msg.color_range_end > msg.color_range_start) if (should_do_colors_ && !msg.color_range_start.empty() && msg.color_range_start.size() == msg.color_range_end.size())
{ {
// before color range // before color range
print_range_(formatted, 0, msg.color_range_start); print_range_(formatted, 0, msg.color_range_start[0]);
// in color range for(size_t i=0; i<msg.color_range_start.size(); i++)
auto orig_attribs = set_foreground_color_(colors_[msg.level]); {
print_range_(formatted, msg.color_range_start, msg.color_range_end); // in color range
// reset to orig colors auto orig_attribs = set_foreground_color_(colors_[msg.level]);
::SetConsoleTextAttribute(out_handle_, orig_attribs); print_range_(formatted, msg.color_range_start[i], msg.color_range_end[i]);
print_range_(formatted, msg.color_range_end, formatted.size()); // reset to orig colors
::SetConsoleTextAttribute(out_handle_, orig_attribs);
// after color range
if(i+1 < msg.color_range_end.size())
{
print_range_(formatted, msg.color_range_end[i], msg.color_range_start[i+1]);
}
else
{
print_range_(formatted, msg.color_range_end[i], formatted.size());
}
}
} }
else // print without colors if color range is invalid (or color is disabled) else // print without colors if color range is invalid (or color is disabled)
{ {

@ -69,8 +69,10 @@ TEST_CASE("color range test1", "[pattern_formatter]")
std::string logger_name = "test"; std::string logger_name = "test";
spdlog::details::log_msg msg(logger_name, spdlog::level::info, spdlog::string_view_t(buf.data(), buf.size())); spdlog::details::log_msg msg(logger_name, spdlog::level::info, spdlog::string_view_t(buf.data(), buf.size()));
formatter->format(msg, formatted); formatter->format(msg, formatted);
REQUIRE(msg.color_range_start == 0); REQUIRE(msg.color_range_start.size() == 1);
REQUIRE(msg.color_range_end == 5); REQUIRE(msg.color_range_end.size() == 1);
REQUIRE(msg.color_range_start[0] == 0);
REQUIRE(msg.color_range_end[0] == 5);
REQUIRE(log_to_str("hello", "%^%v%$", spdlog::pattern_time_type::local, "\n") == "hello\n"); REQUIRE(log_to_str("hello", "%^%v%$", spdlog::pattern_time_type::local, "\n") == "hello\n");
} }
@ -81,8 +83,10 @@ TEST_CASE("color range test2", "[pattern_formatter]")
spdlog::details::log_msg msg(logger_name, spdlog::level::info, ""); spdlog::details::log_msg msg(logger_name, spdlog::level::info, "");
memory_buf_t formatted; memory_buf_t formatted;
formatter->format(msg, formatted); formatter->format(msg, formatted);
REQUIRE(msg.color_range_start == 0); REQUIRE(msg.color_range_start.size() == 1);
REQUIRE(msg.color_range_end == 0); REQUIRE(msg.color_range_end.size() == 1);
REQUIRE(msg.color_range_start[0] == 0);
REQUIRE(msg.color_range_end[0] == 0);
REQUIRE(log_to_str("", "%^%$", spdlog::pattern_time_type::local, "\n") == "\n"); REQUIRE(log_to_str("", "%^%$", spdlog::pattern_time_type::local, "\n") == "\n");
} }
@ -93,8 +97,10 @@ TEST_CASE("color range test3", "[pattern_formatter]")
spdlog::details::log_msg msg(logger_name, spdlog::level::info, "ignored"); spdlog::details::log_msg msg(logger_name, spdlog::level::info, "ignored");
memory_buf_t formatted; memory_buf_t formatted;
formatter->format(msg, formatted); formatter->format(msg, formatted);
REQUIRE(msg.color_range_start == 0); REQUIRE(msg.color_range_start.size() == 1);
REQUIRE(msg.color_range_end == 3); REQUIRE(msg.color_range_end.size() == 1);
REQUIRE(msg.color_range_start[0] == 0);
REQUIRE(msg.color_range_end[0] == 3);
} }
TEST_CASE("color range test4", "[pattern_formatter]") TEST_CASE("color range test4", "[pattern_formatter]")
@ -105,8 +111,10 @@ TEST_CASE("color range test4", "[pattern_formatter]")
memory_buf_t formatted; memory_buf_t formatted;
formatter->format(msg, formatted); formatter->format(msg, formatted);
REQUIRE(msg.color_range_start == 2); REQUIRE(msg.color_range_start.size() == 1);
REQUIRE(msg.color_range_end == 5); REQUIRE(msg.color_range_end.size() == 1);
REQUIRE(msg.color_range_start[0] == 2);
REQUIRE(msg.color_range_end[0] == 5);
REQUIRE(log_to_str("ignored", "XX%^YYY%$", spdlog::pattern_time_type::local, "\n") == "XXYYY\n"); REQUIRE(log_to_str("ignored", "XX%^YYY%$", spdlog::pattern_time_type::local, "\n") == "XXYYY\n");
} }
@ -117,8 +125,9 @@ TEST_CASE("color range test5", "[pattern_formatter]")
spdlog::details::log_msg msg(logger_name, spdlog::level::info, "ignored"); spdlog::details::log_msg msg(logger_name, spdlog::level::info, "ignored");
memory_buf_t formatted; memory_buf_t formatted;
formatter->format(msg, formatted); formatter->format(msg, formatted);
REQUIRE(msg.color_range_start == 2); REQUIRE(msg.color_range_start.size() == 1);
REQUIRE(msg.color_range_end == 0); REQUIRE(msg.color_range_end.empty());
REQUIRE(msg.color_range_start[0] == 2);
} }
TEST_CASE("color range test6", "[pattern_formatter]") TEST_CASE("color range test6", "[pattern_formatter]")
@ -128,8 +137,39 @@ TEST_CASE("color range test6", "[pattern_formatter]")
spdlog::details::log_msg msg(logger_name, spdlog::level::info, "ignored"); spdlog::details::log_msg msg(logger_name, spdlog::level::info, "ignored");
memory_buf_t formatted; memory_buf_t formatted;
formatter->format(msg, formatted); formatter->format(msg, formatted);
REQUIRE(msg.color_range_start == 0); REQUIRE(msg.color_range_start.empty());
REQUIRE(msg.color_range_end == 2); REQUIRE(msg.color_range_end.size() == 1);
REQUIRE(msg.color_range_end[0] == 2);
}
TEST_CASE("color multi-range test1", "[pattern_formatter]")
{
auto formatter = std::make_shared<spdlog::pattern_formatter>("%^%$%^%$");
std::string logger_name = "test";
spdlog::details::log_msg msg(logger_name, spdlog::level::info, "ignored");
memory_buf_t formatted;
formatter->format(msg, formatted);
REQUIRE(msg.color_range_start.size() == 2);
REQUIRE(msg.color_range_end.size() == 2);
REQUIRE(msg.color_range_start[0] == 0);
REQUIRE(msg.color_range_start[1] == 0);
REQUIRE(msg.color_range_end[0] == 0);
REQUIRE(msg.color_range_end[1] == 0);
}
TEST_CASE("color multi-range test2", "[pattern_formatter]")
{
auto formatter = std::make_shared<spdlog::pattern_formatter>("%^***%$***%^***%$");
std::string logger_name = "test";
spdlog::details::log_msg msg(logger_name, spdlog::level::info, "ignored");
memory_buf_t formatted;
formatter->format(msg, formatted);
REQUIRE(msg.color_range_start.size() == 2);
REQUIRE(msg.color_range_end.size() == 2);
REQUIRE(msg.color_range_start[0] == 0);
REQUIRE(msg.color_range_start[1] == 6);
REQUIRE(msg.color_range_end[0] == 3);
REQUIRE(msg.color_range_end[1] == 9);
} }
// //

@ -79,6 +79,17 @@ TEST_CASE("stderr_color_mt", "[stderr]")
spdlog::drop_all(); spdlog::drop_all();
} }
TEST_CASE("stderr_multi_color_range", "[stderr]")
{
auto l = spdlog::stderr_color_mt("test");
l->set_pattern("Test Mutliple Color Ranges -- %^First Color Range%$ %v %^Second Color Range%$ uncolored %^%l%$");
l->info("uncolored text");
l->warn("uncolored text");
l->error("uncolored text");
l->critical("uncolored text");
spdlog::drop_all();
}
#ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT #ifdef SPDLOG_WCHAR_TO_UTF8_SUPPORT
TEST_CASE("wchar_api", "[stdout]") TEST_CASE("wchar_api", "[stdout]")

Loading…
Cancel
Save