summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2020-09-11 11:33:33 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-09-11 15:53:33 +0000
commit642adc7547023ec17f9c912e631790fa508c9818 (patch)
treee1f09c57d744e5c89f3a0c0f76d97cd63f475699
parenta5f72d4b37ed92fa72d3a31e0af4266c9ef8d014 (diff)
downloadmongo-642adc7547023ec17f9c912e631790fa508c9818.tar.gz
SERVER-50036 logd() fails with invalid format string
-rw-r--r--src/mongo/logv2/logv2_test.cpp12
-rw-r--r--src/mongo/logv2/plain_formatter.cpp9
2 files changed, 21 insertions, 0 deletions
diff --git a/src/mongo/logv2/logv2_test.cpp b/src/mongo/logv2/logv2_test.cpp
index f863c7db555..e6139d964be 100644
--- a/src/mongo/logv2/logv2_test.cpp
+++ b/src/mongo/logv2/logv2_test.cpp
@@ -1769,6 +1769,18 @@ TEST_F(UnstructuredLoggingTest, Args) {
});
}
+TEST_F(UnstructuredLoggingTest, ArgsLikeFormatSpecifier) {
+ // Ensure the plain formatter does not process the formatted string
+ startCapturingLogMessages();
+
+ std::string format_str = "format {} str {} fields";
+ logd(format_str, 1, "{ x : 1}"); // NOLINT
+ validate([&format_str](const BSONObj& obj) {
+ ASSERT_EQUALS(obj.getField(kMessageFieldName).String(),
+ fmt::format(format_str, 1, "{ x : 1}"));
+ });
+}
+
TEST_F(UnstructuredLoggingTest, ManyArgs) {
std::string format_str = "{}{}{}{}{}{}{}{}{}{}{}";
logd(format_str, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); // NOLINT
diff --git a/src/mongo/logv2/plain_formatter.cpp b/src/mongo/logv2/plain_formatter.cpp
index 0fad5d46b84..de83f01667e 100644
--- a/src/mongo/logv2/plain_formatter.cpp
+++ b/src/mongo/logv2/plain_formatter.cpp
@@ -152,6 +152,15 @@ void PlainFormatter::operator()(boost::log::record_view const& rec,
StringData message = extract<StringData>(attributes::message(), rec).get();
const auto& attrs = extract<TypeErasedAttributeStorage>(attributes::attributes(), rec).get();
+ // Log messages logged via logd are already formatted and have the id == 0
+ if (attrs.empty()) {
+ if (extract<int32_t>(attributes::id(), rec).get() == 0) {
+ buffer.append(message.rawData(), message.rawData() + message.size());
+
+ return;
+ }
+ }
+
TextValueExtractor extractor;
extractor.args.reserve(attrs.size());
attrs.apply(extractor);