custom pattern formatting is now functional

pull/2687/head
Bailey Chittle 3 years ago
parent ec8f97453f
commit e61ef16263

@ -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

@ -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_;
};

Loading…
Cancel
Save