diff options
Diffstat (limited to 'src/mongo/logv2/log_detail.cpp')
-rw-r--r-- | src/mongo/logv2/log_detail.cpp | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/src/mongo/logv2/log_detail.cpp b/src/mongo/logv2/log_detail.cpp index d90d44ddf9e..95ea258a5a3 100644 --- a/src/mongo/logv2/log_detail.cpp +++ b/src/mongo/logv2/log_detail.cpp @@ -44,61 +44,64 @@ namespace mongo::logv2::detail { struct UnstructuredValueExtractor { - void operator()(StringData name, CustomAttributeValue const& val) { + void operator()(const char* name, CustomAttributeValue const& val) { // Prefer string serialization over BSON if available. if (val.stringSerialize) { fmt::memory_buffer buffer; val.stringSerialize(buffer); - _storage.push_back(fmt::to_string(buffer)); - operator()(name, _storage.back()); + _addString(name, fmt::to_string(buffer)); } else if (val.toString) { - _storage.push_back(val.toString()); - operator()(name, _storage.back()); + _addString(name, val.toString()); } else if (val.BSONAppend) { BSONObjBuilder builder; val.BSONAppend(builder, name); BSONElement element = builder.done().getField(name); - _storage.push_back(element.toString(false)); - operator()(name, _storage.back()); + _addString(name, element.toString(false)); } else if (val.BSONSerialize) { BSONObjBuilder builder; val.BSONSerialize(builder); - operator()(name, builder.done()); + (*this)(name, builder.done()); } else if (val.toBSONArray) { - operator()(name, val.toBSONArray()); + (*this)(name, val.toBSONArray()); } } - void operator()(StringData name, const BSONObj& val) { + void operator()(const char* name, const BSONObj& val) { StringBuilder ss; val.toString(ss, false); - _storage.push_back(ss.str()); - operator()(name, _storage.back()); + _addString(name, ss.str()); } - void operator()(StringData name, const BSONArray& val) { + void operator()(const char* name, const BSONArray& val) { StringBuilder ss; val.toString(ss, true); - _storage.push_back(ss.str()); - operator()(name, _storage.back()); + _addString(name, ss.str()); } template <typename Period> - void operator()(StringData name, const Duration<Period>& val) { - _storage.push_back(val.toString()); - operator()(name, _storage.back()); + void operator()(const char* name, const Duration<Period>& val) { + _addString(name, val.toString()); } template <typename T> - void operator()(StringData name, const T& val) { - args.push_back(fmt::internal::make_arg<fmt::format_context>(val)); + void operator()(const char* name, const T& val) { + _args.push_back(fmt::arg(name, std::cref(val))); } - boost::container::small_vector<fmt::basic_format_arg<fmt::format_context>, - constants::kNumStaticAttrs> - args; + void reserve(size_t n) { + _args.reserve(n, n); + } + + const auto& args() const { + return _args; + } private: + void _addString(const char* name, std::string&& val) { + (*this)(name, _storage.emplace_back(std::move(val))); + } + + fmt::dynamic_format_arg_store<fmt::format_context> _args; std::deque<std::string> _storage; }; @@ -116,10 +119,7 @@ static void checkUniqueAttrs(int32_t id, const TypeErasedAttributeStorage& attrs StringData sep; std::string msg; for (auto&& a : attrs) { - msg.append(sep.rawData(), sep.size()) - .append("\"") - .append(a.name.rawData(), a.name.size()) - .append("\""); + msg.append(format(FMT_STRING(R"({}"{}")"), sep, a.name)); sep = ","_sd; } uasserted(4793301, format(FMT_STRING("LOGV2 (id={}) attribute collision: [{}]"), id, msg)); @@ -169,11 +169,10 @@ void doUnstructuredLogImpl(LogSeverity const& severity, // NOLINT TypeErasedAttributeStorage const& attrs) { UnstructuredValueExtractor extractor; - extractor.args.reserve(attrs.size()); + extractor.reserve(attrs.size()); attrs.apply(extractor); - auto formatted = fmt::vformat( - to_string_view(message), - fmt::basic_format_args<fmt::format_context>(extractor.args.data(), extractor.args.size())); + auto formatted = + fmt::vformat(std::string_view{message.rawData(), message.size()}, extractor.args()); doLogImpl(0, severity, options, formatted, TypeErasedAttributeStorage()); } |