summaryrefslogtreecommitdiff
path: root/src/mongo/logv2/log_detail.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/logv2/log_detail.cpp')
-rw-r--r--src/mongo/logv2/log_detail.cpp61
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());
}