|
|
|
@ -738,6 +738,48 @@ private:
|
|
|
|
|
log_clock::time_point last_message_time_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Class for formatting Mapped Diagnostic Context (MDC) in log messages.
|
|
|
|
|
// Example: [logger-name] [info] [mdc_key_1:mdc_value_1 mdc_key_2:mdc_value_2] some message
|
|
|
|
|
template <typename ScopedPadder>
|
|
|
|
|
class mdc_formatter : public flag_formatter {
|
|
|
|
|
public:
|
|
|
|
|
explicit mdc_formatter(padding_info padinfo)
|
|
|
|
|
: flag_formatter(padinfo) {}
|
|
|
|
|
|
|
|
|
|
void format(const details::log_msg &, const std::tm &, memory_buf_t &dest) override {
|
|
|
|
|
auto &mdc_map = mdc::get_context();
|
|
|
|
|
if (mdc_map.empty()) {
|
|
|
|
|
ScopedPadder p(0, padinfo_, dest);
|
|
|
|
|
return;
|
|
|
|
|
} else {
|
|
|
|
|
format_mdc(mdc_map, dest);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void format_mdc(const mdc::mdc_map_t &mdc_map, memory_buf_t &dest){
|
|
|
|
|
auto last_element = --mdc_map.end();
|
|
|
|
|
for (auto it = mdc_map.begin(); it != mdc_map.end(); ++it) {
|
|
|
|
|
auto &pair = *it;
|
|
|
|
|
const auto &key = pair.first;
|
|
|
|
|
const auto &value = pair.second;
|
|
|
|
|
size_t content_size = key.size() + value.size() + 1; // 1 for ':'
|
|
|
|
|
|
|
|
|
|
if (it != last_element) {
|
|
|
|
|
content_size++; // 1 for ' '
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ScopedPadder p(content_size, padinfo_, dest);
|
|
|
|
|
fmt_helper::append_string_view(key, dest);
|
|
|
|
|
fmt_helper::append_string_view(":", dest);
|
|
|
|
|
fmt_helper::append_string_view(value, dest);
|
|
|
|
|
if (it != last_element) {
|
|
|
|
|
fmt_helper::append_string_view(" ", dest);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Full info formatter
|
|
|
|
|
// pattern: [%Y-%m-%d %H:%M:%S.%e] [%n] [%l] [%s:%#] %v
|
|
|
|
|
class full_formatter final : public flag_formatter {
|
|
|
|
@ -811,52 +853,23 @@ public:
|
|
|
|
|
dest.push_back(']');
|
|
|
|
|
dest.push_back(' ');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// add mdc if present
|
|
|
|
|
auto &mdc_map = mdc::get_context();
|
|
|
|
|
if (!mdc_map.empty()) {
|
|
|
|
|
dest.push_back('[');
|
|
|
|
|
mdc_formatter_.format_mdc(mdc_map, dest);
|
|
|
|
|
dest.push_back(']');
|
|
|
|
|
dest.push_back(' ');
|
|
|
|
|
}
|
|
|
|
|
fmt_helper::append_string_view(msg.payload, dest);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
std::chrono::seconds cache_timestamp_{0};
|
|
|
|
|
memory_buf_t cached_datetime_;
|
|
|
|
|
mdc_formatter<null_scoped_padder> mdc_formatter_{padding_info{}};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Class for formatting Mapped Diagnostic Context (MDC) in log messages.
|
|
|
|
|
// Example: [logger-name] [info] [mdc_key_1:mdc_value_1 mdc_key_2:mdc_value_2] some message
|
|
|
|
|
template <typename ScopedPadder>
|
|
|
|
|
class mdc_formatter : public flag_formatter {
|
|
|
|
|
public:
|
|
|
|
|
explicit mdc_formatter(padding_info padinfo)
|
|
|
|
|
: flag_formatter(padinfo) {}
|
|
|
|
|
|
|
|
|
|
void format(const details::log_msg &, const std::tm &, memory_buf_t &dest) override {
|
|
|
|
|
auto mdc_map = mdc::get_context();
|
|
|
|
|
if (mdc_map.empty()) {
|
|
|
|
|
ScopedPadder p(0, padinfo_, dest);
|
|
|
|
|
return;
|
|
|
|
|
} else {
|
|
|
|
|
auto last_element = --mdc_map.end();
|
|
|
|
|
for (auto it = mdc_map.begin(); it != mdc_map.end(); ++it) {
|
|
|
|
|
auto &pair = *it;
|
|
|
|
|
const auto &key = pair.first;
|
|
|
|
|
const auto &value = pair.second;
|
|
|
|
|
size_t content_size = key.size() + value.size() + 1; // 1 for ':'
|
|
|
|
|
|
|
|
|
|
if (it != last_element) {
|
|
|
|
|
content_size++; // 1 for ' '
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ScopedPadder p(content_size, padinfo_, dest);
|
|
|
|
|
fmt_helper::append_string_view(key, dest);
|
|
|
|
|
fmt_helper::append_string_view(":", dest);
|
|
|
|
|
fmt_helper::append_string_view(value, dest);
|
|
|
|
|
if (it != last_element) {
|
|
|
|
|
fmt_helper::append_string_view(" ", dest);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace details
|
|
|
|
|
|
|
|
|
|
pattern_formatter::pattern_formatter(std::string pattern,
|
|
|
|
|