From 642adc7547023ec17f9c912e631790fa508c9818 Mon Sep 17 00:00:00 2001 From: Mark Benvenuto Date: Fri, 11 Sep 2020 11:33:33 -0400 Subject: SERVER-50036 logd() fails with invalid format string --- src/mongo/logv2/logv2_test.cpp | 12 ++++++++++++ src/mongo/logv2/plain_formatter.cpp | 9 +++++++++ 2 files changed, 21 insertions(+) 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(attributes::message(), rec).get(); const auto& attrs = extract(attributes::attributes(), rec).get(); + // Log messages logged via logd are already formatted and have the id == 0 + if (attrs.empty()) { + if (extract(attributes::id(), rec).get() == 0) { + buffer.append(message.rawData(), message.rawData() + message.size()); + + return; + } + } + TextValueExtractor extractor; extractor.args.reserve(attrs.size()); attrs.apply(extractor); -- cgit v1.2.1