diff --git a/include/spdlog/details/fmt_helper.h b/include/spdlog/details/fmt_helper.h index 8ce61df8..0e606518 100644 --- a/include/spdlog/details/fmt_helper.h +++ b/include/spdlog/details/fmt_helper.h @@ -13,20 +13,6 @@ namespace spdlog { namespace details { namespace fmt_helper { -template -inline void append_str(const std::string &str, fmt::basic_memory_buffer &dest) -{ - auto *str_ptr = str.data(); - dest.append(str_ptr, str_ptr + str.size()); -} - -template -inline void append_c_str(const char *c_str, fmt::basic_memory_buffer &dest) -{ - auto len = std::char_traits::length(c_str); - dest.append(c_str, c_str + len); -} - template inline void append_buf(const fmt::basic_memory_buffer &buf, fmt::basic_memory_buffer &dest) { @@ -34,6 +20,13 @@ inline void append_buf(const fmt::basic_memory_buffer &buf, dest.append(buf_ptr, buf_ptr + buf.size()); } +template +inline void append_string_view(fmt::string_view view, fmt::basic_memory_buffer &dest) +{ + auto *buf_ptr = view.data(); + dest.append(buf_ptr, buf_ptr + view.size()); +} + template inline void append_int(T n, fmt::basic_memory_buffer &dest) { @@ -41,17 +34,6 @@ inline void append_int(T n, fmt::basic_memory_buffer &dest) dest.append(i.data(), i.data() + i.size()); } -template -inline void append_msg(const details::log_msg &msg, fmt::basic_memory_buffer &dest) -{ - auto *c_buf = msg.c_string.data(); - if (c_buf != nullptr) { - dest.append(c_buf, c_buf + msg.c_string.size()); - } else { - append_buf(msg.raw, dest); - } -} - template inline void pad2(int n, fmt::basic_memory_buffer &dest) { diff --git a/include/spdlog/details/log_msg.h b/include/spdlog/details/log_msg.h index bde4b978..71ed7208 100644 --- a/include/spdlog/details/log_msg.h +++ b/include/spdlog/details/log_msg.h @@ -17,7 +17,7 @@ struct log_msg { log_msg() = default; - log_msg(const std::string *loggers_name, level::level_enum lvl) + log_msg(const std::string *loggers_name, level::level_enum lvl, fmt::string_view view) : logger_name(loggers_name) , level(lvl) #ifndef SPDLOG_NO_DATETIME @@ -26,27 +26,31 @@ struct log_msg #ifndef SPDLOG_NO_THREAD_ID , thread_id(os::thread_id()) + , payload(view) #endif { } - log_msg(const log_msg &other) = delete; - log_msg(log_msg &&other) = delete; - log_msg &operator=(log_msg &&other) = delete; + log_msg(const log_msg &other) = default; + log_msg(log_msg &&other) = default; + log_msg &operator=(log_msg &&other) = default; const std::string *logger_name{nullptr}; - level::level_enum level {level::off}; + level::level_enum level{level::off}; log_clock::time_point time; - size_t thread_id {0}; - fmt::memory_buffer raw; - // if c_string.data() is not nullptr, c_string should be used as the message - // instead of raw above - fmt::string_view c_string; + size_t thread_id{0}; size_t msg_id; // info about wrapping the formatted text with color (updated by pattern_formatter). mutable size_t color_range_start{0}; mutable size_t color_range_end{0}; + + operator fmt::string_view() const SPDLOG_NOEXCEPT + { + return payload; + } + + const fmt::string_view payload; }; } // namespace details } // namespace spdlog diff --git a/include/spdlog/details/logger_impl.h b/include/spdlog/details/logger_impl.h index d3cc62db..a557d45d 100644 --- a/include/spdlog/details/logger_impl.h +++ b/include/spdlog/details/logger_impl.h @@ -63,28 +63,24 @@ inline void spdlog::logger::log(level::level_enum lvl, const char *fmt, const Ar try { - details::log_msg log_msg(&name_, lvl); - fmt::format_to(log_msg.raw, fmt, args...); + fmt::memory_buffer buf; + fmt::format_to(buf, fmt, args...); + details::log_msg log_msg(&name_, lvl, fmt::string_view(buf.data(), buf.size())); sink_it_(log_msg); } SPDLOG_CATCH_AND_HANDLE } inline void spdlog::logger::log(level::level_enum lvl, const char *msg) -{ - logn(lvl, msg, std::char_traits::length(msg)); -} - -inline void spdlog::logger::logn(level::level_enum lvl, const char *msg, size_t msg_len) { if (!should_log(lvl)) { return; } + try { - details::log_msg log_msg(&name_, lvl); - log_msg.c_string = fmt::string_view(msg, msg_len); + details::log_msg log_msg(&name_, lvl, msg); sink_it_(log_msg); } SPDLOG_CATCH_AND_HANDLE @@ -99,8 +95,9 @@ inline void spdlog::logger::log(level::level_enum lvl, const T &msg) } try { - details::log_msg log_msg(&name_, lvl); - fmt::format_to(log_msg.raw, "{}", msg); + fmt::memory_buffer buf; + fmt::format_to(buf, "{}", msg); + details::log_msg log_msg(&name_, lvl, fmt::string_view(buf.data(), buf.size())); sink_it_(log_msg); } SPDLOG_CATCH_AND_HANDLE diff --git a/include/spdlog/details/pattern_formatter.h b/include/spdlog/details/pattern_formatter.h index a8afa2b3..de384948 100644 --- a/include/spdlog/details/pattern_formatter.h +++ b/include/spdlog/details/pattern_formatter.h @@ -38,7 +38,8 @@ class name_formatter : public flag_formatter { void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { - fmt_helper::append_str(*msg.logger_name, dest); + // fmt_helper::append_str(*msg.logger_name, dest); + fmt_helper::append_string_view(*msg.logger_name, dest); } }; @@ -47,7 +48,8 @@ class level_formatter : public flag_formatter { void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { - fmt_helper::append_c_str(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_c_str(msg.level), dest); } }; @@ -56,7 +58,8 @@ class short_level_formatter : public flag_formatter { void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { - fmt_helper::append_c_str(level::to_short_c_str(msg.level), dest); + // fmt_helper::append_string_view(level::to_short_c_str(msg.level), dest); + fmt_helper::append_string_view(level::to_short_c_str(msg.level), dest); } }; @@ -80,7 +83,8 @@ class a_formatter : public flag_formatter { void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { - fmt_helper::append_c_str(days[tm_time.tm_wday], dest); + // fmt_helper::append_string_view(days[tm_time.tm_wday], dest); + fmt_helper::append_string_view(days[tm_time.tm_wday], dest); } }; @@ -90,7 +94,8 @@ class A_formatter : public flag_formatter { void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { - fmt_helper::append_c_str(full_days[tm_time.tm_wday], dest); + // fmt_helper::append_string_view(full_days[tm_time.tm_wday], dest); + fmt_helper::append_string_view(full_days[tm_time.tm_wday], dest); } }; @@ -100,7 +105,8 @@ class b_formatter : public flag_formatter { void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { - fmt_helper::append_c_str(months[tm_time.tm_mon], dest); + // fmt_helper::append_string_view(months[tm_time.tm_mon], dest); + fmt_helper::append_string_view(months[tm_time.tm_mon], dest); } }; @@ -111,7 +117,7 @@ class B_formatter : public flag_formatter { void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { - fmt_helper::append_c_str(full_months[tm_time.tm_mon], dest); + fmt_helper::append_string_view(full_months[tm_time.tm_mon], dest); } }; @@ -123,9 +129,9 @@ class c_formatter final : public flag_formatter // fmt::format_to(dest, "{} {} {} ", days[tm_time.tm_wday], // months[tm_time.tm_mon], tm_time.tm_mday); // date - fmt_helper::append_c_str(days[tm_time.tm_wday], dest); + fmt_helper::append_string_view(days[tm_time.tm_wday], dest); dest.push_back(' '); - fmt_helper::append_c_str(months[tm_time.tm_mon], dest); + fmt_helper::append_string_view(months[tm_time.tm_mon], dest); dest.push_back(' '); fmt_helper::append_int(tm_time.tm_mday, dest); dest.push_back(' '); @@ -272,7 +278,7 @@ class p_formatter final : public flag_formatter { void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { - fmt_helper::append_c_str(ampm(tm_time), dest); + fmt_helper::append_string_view(ampm(tm_time), dest); } }; @@ -287,7 +293,7 @@ class r_formatter final : public flag_formatter dest.push_back(':'); fmt_helper::pad2(tm_time.tm_sec, dest); dest.push_back(' '); - fmt_helper::append_c_str(ampm(tm_time), dest); + fmt_helper::append_string_view(ampm(tm_time), dest); } }; @@ -401,7 +407,7 @@ class v_formatter final : public flag_formatter { void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { - fmt_helper::append_msg(msg, dest); + fmt_helper::append_string_view(msg, dest); } }; @@ -433,7 +439,7 @@ public: } void format(const details::log_msg &, const std::tm &, fmt::memory_buffer &dest) override { - fmt_helper::append_str(str_, dest); + fmt_helper::append_string_view(str_, dest); } private: @@ -511,7 +517,8 @@ class full_formatter final : public flag_formatter if (!msg.logger_name->empty()) { dest.push_back('['); - fmt_helper::append_str(*msg.logger_name, dest); + // fmt_helper::append_str(*msg.logger_name, dest); + fmt_helper::append_string_view(*msg.logger_name, dest); dest.push_back(']'); dest.push_back(' '); } @@ -520,11 +527,13 @@ class full_formatter final : public flag_formatter dest.push_back('['); // wrap the level name with color msg.color_range_start = dest.size(); - fmt_helper::append_c_str(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_c_str(msg.level), dest); msg.color_range_end = dest.size(); dest.push_back(']'); dest.push_back(' '); - fmt_helper::append_msg(msg, dest); + // fmt_helper::append_string_view(msg.msg(), dest); + fmt_helper::append_string_view(msg, dest); } private: @@ -571,7 +580,8 @@ public: f->format(msg, cached_tm_, dest); } // write eol - details::fmt_helper::append_c_str(eol_.c_str(), dest); + // details::fmt_helper::append_string_view(eol_.c_str(), dest); + details::fmt_helper::append_string_view(eol_.c_str(), dest); } private: diff --git a/include/spdlog/details/thread_pool.h b/include/spdlog/details/thread_pool.h index b886e42f..63f27e7b 100644 --- a/include/spdlog/details/thread_pool.h +++ b/include/spdlog/details/thread_pool.h @@ -78,7 +78,7 @@ struct async_msg , msg_id(m.msg_id) , worker_ptr(std::move(worker)) { - fmt_helper::append_msg(m, raw); + fmt_helper::append_string_view(m, raw); } async_msg(async_logger_ptr &&worker, async_msg_type the_type) @@ -92,16 +92,15 @@ struct async_msg } // copy into log_msg - void to_log_msg(log_msg &msg) + log_msg to_log_msg() { - msg.logger_name = &worker_ptr->name(); - msg.level = level; + log_msg msg(&worker_ptr->name(), level, fmt::string_view(raw.data(), raw.size())); msg.time = time; msg.thread_id = thread_id; - fmt_helper::append_buf(raw, msg.raw); msg.msg_id = msg_id; msg.color_range_start = 0; msg.color_range_end = 0; + return msg; } }; @@ -204,8 +203,7 @@ private: { case async_msg_type::log: { - log_msg msg; - incoming_async_msg.to_log_msg(msg); + auto msg = incoming_async_msg.to_log_msg(); incoming_async_msg.worker_ptr->backend_log_(msg); return true; } diff --git a/include/spdlog/sinks/android_sink.h b/include/spdlog/sinks/android_sink.h index 86837db9..1286c173 100644 --- a/include/spdlog/sinks/android_sink.h +++ b/include/spdlog/sinks/android_sink.h @@ -47,7 +47,7 @@ protected: fmt::memory_buffer formatted; if (use_raw_msg_) { - details::fmt_helper::append_msg(msg, formatted); + details::fmt_helper::append_string_view(msg, formatted); } else { diff --git a/include/spdlog/sinks/syslog_sink.h b/include/spdlog/sinks/syslog_sink.h index 36537e77..d1c78210 100644 --- a/include/spdlog/sinks/syslog_sink.h +++ b/include/spdlog/sinks/syslog_sink.h @@ -53,12 +53,7 @@ public: protected: void sink_it_(const details::log_msg &msg) override { - if (msg.c_string.data() != nullptr) - { - ::syslog(syslog_prio_from_level(msg), "%.*s", static_cast(msg.c_string.size()), msg.c_string.data()); - } else { - ::syslog(syslog_prio_from_level(msg), "%s", fmt::to_string(msg.raw).c_str()); - } + ::syslog(syslog_prio_from_level(msg), "%s", fmt::to_string(msg).c_str()); } void flush_() override {} diff --git a/tests/test_misc.cpp b/tests/test_misc.cpp index 5b3b427b..f69a3487 100644 --- a/tests/test_misc.cpp +++ b/tests/test_misc.cpp @@ -231,22 +231,3 @@ TEST_CASE("default logger API", "[default logger]") spdlog::drop_all(); spdlog::set_pattern("%v"); } - -TEST_CASE("C string", "[c_string]") -{ - std::ostringstream oss; - auto oss_sink = std::make_shared(oss); - - spdlog::logger oss_logger("oss", oss_sink); - oss_logger.set_level(spdlog::level::debug); - oss_logger.set_pattern("*** %v"); - - const char *test_string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit massa nunc"; - - oss_logger.log(spdlog::level::debug, test_string); - REQUIRE(oss.str() == "*** " + std::string(test_string) + std::string(spdlog::details::os::default_eol)); - - oss.str(""); - oss_logger.logn(spdlog::level::debug, test_string, 11); - REQUIRE(oss.str() == "*** " + std::string(test_string, 11) + std::string(spdlog::details::os::default_eol)); -} diff --git a/tests/test_pattern_formatter.cpp b/tests/test_pattern_formatter.cpp index 17b61612..df48dc35 100644 --- a/tests/test_pattern_formatter.cpp +++ b/tests/test_pattern_formatter.cpp @@ -60,9 +60,12 @@ TEST_CASE("date MM/DD/YY ", "[pattern_formatter]") TEST_CASE("color range test1", "[pattern_formatter]") { auto formatter = std::make_shared("%^%v%$", spdlog::pattern_time_type::local, "\n"); - spdlog::details::log_msg msg; - fmt::format_to(msg.raw, "Hello"); + + fmt::memory_buffer buf; + fmt::format_to(buf, "Hello"); fmt::memory_buffer formatted; + std::string logger_name = "test"; + spdlog::details::log_msg msg(&logger_name, spdlog::level::info, fmt::string_view(buf.data(), buf.size())); formatter->format(msg, formatted); REQUIRE(msg.color_range_start == 0); REQUIRE(msg.color_range_end == 5); @@ -93,8 +96,9 @@ TEST_CASE("color range test3", "[pattern_formatter]") TEST_CASE("color range test4", "[pattern_formatter]") { auto formatter = std::make_shared("XX%^YYY%$", spdlog::pattern_time_type::local, "\n"); - spdlog::details::log_msg msg; - fmt::format_to(msg.raw, "ignored"); + std::string logger_name = "test"; + spdlog::details::log_msg msg(&logger_name, spdlog::level::info, "ignored"); + fmt::memory_buffer formatted; formatter->format(msg, formatted); REQUIRE(msg.color_range_start == 2);