diff --git a/include/spdlog/pattern_formatter-inl.h b/include/spdlog/pattern_formatter-inl.h index 0bc02754..d04e28f4 100644 --- a/include/spdlog/pattern_formatter-inl.h +++ b/include/spdlog/pattern_formatter-inl.h @@ -934,7 +934,7 @@ class attr_formatter_start final : public flag_formatter { public: explicit attr_formatter_start(padding_info padinfo) - : flag_formatter(padinfo) + : flag_formatter(padinfo, details::attr_flags::start) {} void format(const details::log_msg &, const std::tm &, memory_buf_t &dest) override { @@ -945,7 +945,7 @@ class attr_formatter_stop final : public flag_formatter { public: explicit attr_formatter_stop(padding_info padinfo) - : flag_formatter(padinfo) + : flag_formatter(padinfo, details::attr_flags::stop) {} void format(const details::log_msg &, const std::tm &, memory_buf_t &dest) override { @@ -957,13 +957,11 @@ class attr_formatter_key final : public flag_formatter { public: explicit attr_formatter_key(padding_info padinfo) - : flag_formatter(padinfo) + : flag_formatter(padinfo, details::attr_flags::key) {} - void format(const details::log_msg &msg, const std::tm &, memory_buf_t &dest) override + void format(const details::log_msg &, const std::tm &, memory_buf_t &dest) override { - for (const details::attr& a : msg.attributes) { - fmt_helper::append_string_view(a.key, dest); - } + fmt_helper::append_string_view("", dest); } }; @@ -971,13 +969,11 @@ class attr_formatter_value final : public flag_formatter { public: explicit attr_formatter_value(padding_info padinfo) - : flag_formatter(padinfo) + : flag_formatter(padinfo, details::attr_flags::value) {} - void format(const details::log_msg &msg, const std::tm &, memory_buf_t &dest) override + void format(const details::log_msg &, const std::tm &, memory_buf_t &dest) override { - for (const details::attr& a : msg.attributes) { - fmt_helper::append_string_view(a.value, dest); - } + fmt_helper::append_string_view("", dest); } }; @@ -1128,16 +1124,33 @@ SPDLOG_INLINE void pattern_formatter::format(const details::log_msg &msg, memory } } - for (auto &f : formatters_) + auto it_end = formatters_.begin(); + for (auto it = formatters_.begin(); it != formatters_.end(); ++it) { - f->format(msg, cached_tm_, dest); - } - // TODO: make separate function, and add a custom format to attributes (for now just using logfmt) - for (const details::attr& a : msg.attributes) { - details::fmt_helper::append_string_view(a.key, dest); - details::fmt_helper::append_string_view("=\"", dest); - details::fmt_helper::append_string_view(a.value, dest); - details::fmt_helper::append_string_view("\" ", dest); + if ((*it)->flag_ == details::attr_flags::start) { + if (msg.attributes.size() == 0) { + while((*it)->flag_ != details::attr_flags::stop && it != formatters_.end()) ++it; + it_end = it; + } + for (const details::attr& a : msg.attributes) { + for (auto it2 = it; it2 != formatters_.end(); ++it2) { + if ((*it2)->flag_ == details::attr_flags::stop) { + it_end = it2; + break; + } else if ((*it2)->flag_ == details::attr_flags::key) { + // custom formatting function overload makes this even more messy with reinterpret casts, + // will just do manual key addition + details::fmt_helper::append_string_view(a.key, dest); + } else if ((*it2)->flag_ == details::attr_flags::value) { + details::fmt_helper::append_string_view(a.value, dest); + } else { + (*it2)->format(msg, cached_tm_, dest); + } + } + } + it = it_end; + } + (*it)->format(msg, cached_tm_, dest); } // write eol diff --git a/include/spdlog/pattern_formatter.h b/include/spdlog/pattern_formatter.h index acf1c536..abe238e7 100644 --- a/include/spdlog/pattern_formatter.h +++ b/include/spdlog/pattern_formatter.h @@ -47,16 +47,30 @@ struct padding_info bool enabled_ = false; }; +enum class attr_flags { + none, + start, + stop, + key, + value +}; + class SPDLOG_API flag_formatter { public: explicit flag_formatter(padding_info padinfo) : padinfo_(padinfo) {} + explicit flag_formatter(padding_info padinfo, attr_flags flag) + : padinfo_(padinfo) + , flag_{flag} + {} flag_formatter() = default; virtual ~flag_formatter() = default; virtual void format(const details::log_msg &msg, const std::tm &tm_time, memory_buf_t &dest) = 0; + attr_flags flag_ = attr_flags::none; + protected: padding_info padinfo_; };