* multi ranges now utilize standard arrays instead of vectors to save on dynamic allocations.

pull/1621/head
Josh Schmiedlin 5 years ago
parent e12d1356e2
commit 34d7bc859c

@ -8,6 +8,8 @@
namespace spdlog {
namespace details {
const size_t MAX_RANGES = 5;
struct SPDLOG_API log_msg
{
log_msg() = default;
@ -22,8 +24,10 @@ struct SPDLOG_API log_msg
size_t thread_id{0};
// wrapping the formatted text with color (updated by pattern_formatter).
mutable std::vector<size_t> color_range_start;
mutable std::vector<size_t> color_range_end;
mutable size_t color_ranges_start[MAX_RANGES] = {0};
mutable size_t num_start_ranges = 0;
mutable size_t color_ranges_end[MAX_RANGES] = {0};
mutable size_t num_end_ranges = 0;
source_loc source;
string_view_t payload;

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

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

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

@ -69,10 +69,10 @@ TEST_CASE("color range test1", "[pattern_formatter]")
std::string logger_name = "test";
spdlog::details::log_msg msg(logger_name, spdlog::level::info, spdlog::string_view_t(buf.data(), buf.size()));
formatter->format(msg, formatted);
REQUIRE(msg.color_range_start.size() == 1);
REQUIRE(msg.color_range_end.size() == 1);
REQUIRE(msg.color_range_start[0] == 0);
REQUIRE(msg.color_range_end[0] == 5);
REQUIRE(msg.num_start_ranges == 1);
REQUIRE(msg.num_end_ranges == 1);
REQUIRE(msg.color_ranges_start[0] == 0);
REQUIRE(msg.color_ranges_end[0] == 5);
REQUIRE(log_to_str("hello", "%^%v%$", spdlog::pattern_time_type::local, "\n") == "hello\n");
}
@ -83,10 +83,10 @@ TEST_CASE("color range test2", "[pattern_formatter]")
spdlog::details::log_msg msg(logger_name, spdlog::level::info, "");
memory_buf_t formatted;
formatter->format(msg, formatted);
REQUIRE(msg.color_range_start.size() == 1);
REQUIRE(msg.color_range_end.size() == 1);
REQUIRE(msg.color_range_start[0] == 0);
REQUIRE(msg.color_range_end[0] == 0);
REQUIRE(msg.num_start_ranges == 1);
REQUIRE(msg.num_end_ranges == 1);
REQUIRE(msg.color_ranges_start[0] == 0);
REQUIRE(msg.color_ranges_end[0] == 0);
REQUIRE(log_to_str("", "%^%$", spdlog::pattern_time_type::local, "\n") == "\n");
}
@ -97,10 +97,10 @@ TEST_CASE("color range test3", "[pattern_formatter]")
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() == 1);
REQUIRE(msg.color_range_end.size() == 1);
REQUIRE(msg.color_range_start[0] == 0);
REQUIRE(msg.color_range_end[0] == 3);
REQUIRE(msg.num_start_ranges == 1);
REQUIRE(msg.num_end_ranges == 1);
REQUIRE(msg.color_ranges_start[0] == 0);
REQUIRE(msg.color_ranges_end[0] == 3);
}
TEST_CASE("color range test4", "[pattern_formatter]")
@ -111,10 +111,10 @@ TEST_CASE("color range test4", "[pattern_formatter]")
memory_buf_t formatted;
formatter->format(msg, formatted);
REQUIRE(msg.color_range_start.size() == 1);
REQUIRE(msg.color_range_end.size() == 1);
REQUIRE(msg.color_range_start[0] == 2);
REQUIRE(msg.color_range_end[0] == 5);
REQUIRE(msg.num_start_ranges == 1);
REQUIRE(msg.num_end_ranges == 1);
REQUIRE(msg.color_ranges_start[0] == 2);
REQUIRE(msg.color_ranges_end[0] == 5);
REQUIRE(log_to_str("ignored", "XX%^YYY%$", spdlog::pattern_time_type::local, "\n") == "XXYYY\n");
}
@ -125,9 +125,9 @@ TEST_CASE("color range test5", "[pattern_formatter]")
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() == 1);
REQUIRE(msg.color_range_end.empty());
REQUIRE(msg.color_range_start[0] == 2);
REQUIRE(msg.num_start_ranges == 1);
REQUIRE(msg.num_end_ranges == 0);
REQUIRE(msg.color_ranges_start[0] == 2);
}
TEST_CASE("color range test6", "[pattern_formatter]")
@ -137,9 +137,9 @@ TEST_CASE("color range test6", "[pattern_formatter]")
spdlog::details::log_msg msg(logger_name, spdlog::level::info, "ignored");
memory_buf_t formatted;
formatter->format(msg, formatted);
REQUIRE(msg.color_range_start.empty());
REQUIRE(msg.color_range_end.size() == 1);
REQUIRE(msg.color_range_end[0] == 2);
REQUIRE(msg.num_start_ranges == 0);
REQUIRE(msg.num_end_ranges == 1);
REQUIRE(msg.color_ranges_end[0] == 2);
}
TEST_CASE("color multi-range test1", "[pattern_formatter]")
@ -149,12 +149,12 @@ TEST_CASE("color multi-range test1", "[pattern_formatter]")
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);
REQUIRE(msg.num_start_ranges == 2);
REQUIRE(msg.num_end_ranges == 2);
REQUIRE(msg.color_ranges_start[0] == 0);
REQUIRE(msg.color_ranges_start[1] == 0);
REQUIRE(msg.color_ranges_end[0] == 0);
REQUIRE(msg.color_ranges_end[1] == 0);
}
TEST_CASE("color multi-range test2", "[pattern_formatter]")
@ -164,12 +164,12 @@ TEST_CASE("color multi-range test2", "[pattern_formatter]")
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);
REQUIRE(msg.num_start_ranges == 2);
REQUIRE(msg.num_end_ranges == 2);
REQUIRE(msg.color_ranges_start[0] == 0);
REQUIRE(msg.color_ranges_start[1] == 6);
REQUIRE(msg.color_ranges_end[0] == 3);
REQUIRE(msg.color_ranges_end[1] == 9);
}
//

@ -90,6 +90,17 @@ TEST_CASE("stderr_multi_color_range", "[stderr]")
spdlog::drop_all();
}
TEST_CASE("stderr_no_color_range", "[stderr]")
{
auto l = spdlog::stderr_color_mt("test");
l->set_pattern("No Color Ranges -- %v");
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
TEST_CASE("wchar_api", "[stdout]")

Loading…
Cancel
Save