diff --git a/include/spdlog/details/fmt_helper.h b/include/spdlog/details/fmt_helper.h index 743d9a3c..4f9a9fc4 100644 --- a/include/spdlog/details/fmt_helper.h +++ b/include/spdlog/details/fmt_helper.h @@ -8,13 +8,16 @@ namespace spdlog { namespace details { namespace fmt_helper { -inline void append_str(const std::string &str, fmt::memory_buffer &dest) + +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()); } -inline void append_c_str(const char *c_str, fmt::memory_buffer &dest) +template +inline void append_c_str(const char *c_str, fmt::basic_memory_buffer &dest) { char ch; while ((ch = *c_str) != '\0') @@ -24,21 +27,22 @@ inline void append_c_str(const char *c_str, fmt::memory_buffer &dest) } } -template -inline void append_buf(const fmt::basic_memory_buffer &buf, fmt::basic_memory_buffer &dest) +template +inline void append_buf(const fmt::basic_memory_buffer &buf, fmt::basic_memory_buffer &dest) { auto *buf_ptr = buf.data(); dest.append(buf_ptr, buf_ptr + buf.size()); } -template -inline void append_int(T n, fmt::memory_buffer &dest) +template +inline void append_int(T n, fmt::basic_memory_buffer &dest) { fmt::format_int i(n); dest.append(i.data(), i.data() + i.size()); } -inline void pad2(int n, fmt::memory_buffer &dest) +template +inline void pad2(int n, fmt::basic_memory_buffer &dest) { if (n > 99) { @@ -61,7 +65,8 @@ inline void pad2(int n, fmt::memory_buffer &dest) fmt::format_to(dest, "{:02}", n); } -inline void pad3(int n, fmt::memory_buffer &dest) +template +inline void pad3(int n, fmt::basic_memory_buffer &dest) { if (n > 99) { @@ -86,7 +91,8 @@ inline void pad3(int n, fmt::memory_buffer &dest) fmt::format_to(dest, "{:03}", n); } -inline void pad6(size_t n, fmt::memory_buffer &dest) +template +inline void pad6(size_t n, fmt::basic_memory_buffer &dest) { // todo: maybe replace this implementation with // pad3(n / 1000, dest); diff --git a/include/spdlog/details/pattern_formatter.h b/include/spdlog/details/pattern_formatter.h index 585e3661..c4109d85 100644 --- a/include/spdlog/details/pattern_formatter.h +++ b/include/spdlog/details/pattern_formatter.h @@ -120,7 +120,16 @@ class c_formatter SPDLOG_FINAL : public flag_formatter { void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { - fmt::format_to(dest, "{} {} {} ", days[tm_time.tm_wday], months[tm_time.tm_mon], tm_time.tm_mday); // + //fmt::format_to(dest, "{} {} {} ", days[tm_time.tm_wday], months[tm_time.tm_mon], tm_time.tm_mday); + // date + fmt_helper::append_str(days[tm_time.tm_wday], dest); + dest.push_back(' '); + fmt_helper::append_str(months[tm_time.tm_mon], dest); + dest.push_back(' '); + fmt_helper::append_int(tm_time.tm_mday, dest); + dest.push_back(' '); + // time + fmt_helper::pad2(tm_time.tm_hour, dest); dest.push_back(':'); fmt_helper::pad2(tm_time.tm_min, dest); @@ -366,7 +375,6 @@ class t_formatter SPDLOG_FINAL : public flag_formatter { void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { - fmt_helper::pad6(msg.thread_id, dest); } }; @@ -385,7 +393,6 @@ class i_formatter SPDLOG_FINAL : public flag_formatter { void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { - fmt_helper::pad6(msg.msg_id, dest); } }; @@ -457,39 +464,48 @@ class full_formatter SPDLOG_FINAL : public flag_formatter { #ifndef SPDLOG_NO_DATETIME - // each second cache the header + // cache the date/time part for the next second. auto duration = msg.time.time_since_epoch(); - auto seconds = std::chrono::duration_cast(duration).count(); - if (cached_header_.size() == 0 || cached_seconds_ts_ != seconds) + std::chrono::seconds seconds = std::chrono::duration_cast(duration); + + if (cache_timestamp_ != seconds || cached_datetime_.size() == 0) { - cached_header_.resize(0); - cached_header_.push_back('['); - fmt_helper::append_int(tm_time.tm_year + 1900, cached_header_); - cached_header_.push_back('-'); + cached_datetime_.resize(0); + cached_datetime_.push_back('['); + fmt_helper::append_int(tm_time.tm_year + 1900, cached_datetime_); + cached_datetime_.push_back('-'); - fmt_helper::pad2(tm_time.tm_mon + 1, cached_header_); - cached_header_.push_back('-'); + fmt_helper::pad2(tm_time.tm_mon + 1, cached_datetime_); + cached_datetime_.push_back('-'); - fmt_helper::pad2(tm_time.tm_mday, cached_header_); - cached_header_.push_back(' '); + fmt_helper::pad2(tm_time.tm_mday, cached_datetime_); + cached_datetime_.push_back(' '); - fmt_helper::pad2(tm_time.tm_hour, cached_header_); - cached_header_.push_back(':'); + fmt_helper::pad2(tm_time.tm_hour, cached_datetime_); + cached_datetime_.push_back(':'); - fmt_helper::pad2(tm_time.tm_min, cached_header_); - cached_header_.push_back(':'); + fmt_helper::pad2(tm_time.tm_min, cached_datetime_); + cached_datetime_.push_back(':'); - fmt_helper::pad2(tm_time.tm_sec, cached_header_); - cached_header_.push_back('.'); + fmt_helper::pad2(tm_time.tm_sec, cached_datetime_); + cached_datetime_.push_back('.'); - cached_seconds_ts_ = seconds; + cache_timestamp_ = seconds; } - fmt_helper::append_buf(cached_header_, dest); + fmt_helper::append_buf(cached_datetime_, dest); + // cache the millis part for the next milli. auto millis = std::chrono::duration_cast(duration).count() % 1000; - fmt_helper::pad3(static_cast(millis), dest); - dest.push_back(']'); - dest.push_back(' '); + if(millis != millis_cache_timestamp_ || cached_millis_.size() == 0) + { + cached_millis_.resize(0); + fmt_helper::pad3(millis, cached_millis_); + cached_millis_.push_back(']'); + cached_millis_.push_back(' '); + millis_cache_timestamp_ = millis; + } + + fmt_helper::append_buf(cached_millis_, dest); #else // no datetime needed (void)tm_time; #endif @@ -512,8 +528,10 @@ class full_formatter SPDLOG_FINAL : public flag_formatter } private: - std::chrono::seconds::rep cached_seconds_ts_{0}; - fmt::memory_buffer cached_header_; + std::chrono::seconds cache_timestamp_ {0}; + std::chrono::milliseconds::rep millis_cache_timestamp_ {0}; + fmt::basic_memory_buffer cached_datetime_; + fmt::basic_memory_buffer cached_millis_; }; } // namespace details