diff options
author | sergey.galtsev <sergey.galtsev@mongodb.com> | 2021-08-10 17:33:42 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-08-10 18:16:34 +0000 |
commit | a7dfbdd59bbc4649cbd83344cedbfc7c69356866 (patch) | |
tree | 3b8ef99ef4a95ca7c6cadd07b02526fcf5f6becf /src/mongo/logv2 | |
parent | 384542592c718d696b5c36d3cc67021c0844bb09 (diff) | |
download | mongo-a7dfbdd59bbc4649cbd83344cedbfc7c69356866.tar.gz |
SERVER-56401 emit eol in log formatter
Diffstat (limited to 'src/mongo/logv2')
-rw-r--r-- | src/mongo/logv2/json_formatter.cpp | 1 | ||||
-rw-r--r-- | src/mongo/logv2/log_capture_backend.h | 15 | ||||
-rw-r--r-- | src/mongo/logv2/logv2_test.cpp | 26 | ||||
-rw-r--r-- | src/mongo/logv2/plain_formatter.cpp | 1 |
4 files changed, 29 insertions, 14 deletions
diff --git a/src/mongo/logv2/json_formatter.cpp b/src/mongo/logv2/json_formatter.cpp index 2dc65831014..d6542823735 100644 --- a/src/mongo/logv2/json_formatter.cpp +++ b/src/mongo/logv2/json_formatter.cpp @@ -349,6 +349,7 @@ void JSONFormatter::operator()(boost::log::record_view const& rec, // Write final JSON object to output stream strm.write(buffer.data(), buffer.size()); + strm.put(boost::log::formatting_ostream::char_type('\n')); } } // namespace mongo::logv2 diff --git a/src/mongo/logv2/log_capture_backend.h b/src/mongo/logv2/log_capture_backend.h index 640a3623321..701ec62a9d4 100644 --- a/src/mongo/logv2/log_capture_backend.h +++ b/src/mongo/logv2/log_capture_backend.h @@ -42,19 +42,26 @@ class LogCaptureBackend : public boost::log::sinks:: basic_formatted_sink_backend<char, boost::log::sinks::synchronized_feeding> { public: - LogCaptureBackend(std::vector<std::string>& lines) : _logLines(lines) {} + LogCaptureBackend(std::vector<std::string>& lines, bool stripEol) + : _stripEol(stripEol), _logLines(lines) {} static boost::shared_ptr<boost::log::sinks::synchronous_sink<LogCaptureBackend>> create( - std::vector<std::string>& lines) { + std::vector<std::string>& lines, bool stripEol) { return boost::make_shared<boost::log::sinks::synchronous_sink<LogCaptureBackend>>( - boost::make_shared<LogCaptureBackend>(lines)); + boost::make_shared<LogCaptureBackend>(lines, stripEol)); } void consume(boost::log::record_view const& rec, string_type const& formatted_string) { - _logLines.push_back(formatted_string); + if (_stripEol && !formatted_string.empty() && + formatted_string[formatted_string.size() - 1] == '\n') { + _logLines.push_back(formatted_string.substr(0, formatted_string.size() - 1)); + } else { + _logLines.push_back(formatted_string); + } } private: + bool _stripEol; std::vector<std::string>& _logLines; }; } // namespace mongo::logv2 diff --git a/src/mongo/logv2/logv2_test.cpp b/src/mongo/logv2/logv2_test.cpp index ac1ab0d25ea..3f5e06efc57 100644 --- a/src/mongo/logv2/logv2_test.cpp +++ b/src/mongo/logv2/logv2_test.cpp @@ -189,7 +189,7 @@ void applyDefaultFilterToSink(SinkPtr&& sink) { class LogDuringInitShutdownTester { public: LogDuringInitShutdownTester() { - auto sink = LogCaptureBackend::create(lines); + auto sink = LogCaptureBackend::create(lines, true); applyDefaultFilterToSink(sink); // We have to leave this sink installed as it is not allowed to install sinks during // shutdown. Add a filter so it is only used during this test. @@ -217,9 +217,10 @@ class LogV2Test : public unittest::Test { public: class LineCapture { public: - LineCapture() + LineCapture() = delete; + LineCapture(bool stripEol) : _lines{std::make_unique<std::vector<std::string>>()}, - _sink{LogCaptureBackend::create(*_lines)} {} + _sink{LogCaptureBackend::create(*_lines, stripEol)} {} auto& lines() { return *_lines; } @@ -280,8 +281,8 @@ public: } template <typename Fmt> - LineCapture makeLineCapture(Fmt&& formatter) { - LineCapture ret; + LineCapture makeLineCapture(Fmt&& formatter, bool stripEol = true) { + LineCapture ret(stripEol); auto& s = ret.sink(); applyDefaultFilterToSink(s); s->set_formatter(std::forward<Fmt>(formatter)); @@ -1518,13 +1519,18 @@ TEST_F(LogV2Test, Ramlog) { sink->set_formatter(PlainFormatter()); attachSink(sink); - auto lines = makeLineCapture(PlainFormatter()); + auto lines = makeLineCapture(PlainFormatter(), false); auto verifyRamLog = [&] { RamLog::LineIterator iter(ramlog); - for (const auto& s : lines.lines()) - if (s != iter.next()) + for (const auto& s : lines.lines()) { + const auto next = iter.next(); + if (s != next) { + std::cout << "\n\n\n********************** s='" << s << "', next='" << next + << "'\n"; return false; + } + } return true; }; @@ -1641,7 +1647,7 @@ TEST_F(LogV2Test, MultipleDomains) { }; LogDomain other_domain(std::make_unique<OtherDomain>()); std::vector<std::string> other_lines; - auto other_sink = LogCaptureBackend::create(other_lines); + auto other_sink = LogCaptureBackend::create(other_lines, true); other_sink->set_filter(ComponentSettingsFilter(other_domain, mgr().getGlobalSettings())); other_sink->set_formatter(PlainFormatter()); attachSink(other_sink); @@ -1708,7 +1714,7 @@ TEST_F(LogV2Test, FileLogging) { TEST_F(LogV2Test, UserAssert) { std::vector<std::string> lines; auto sink = wrapInSynchronousSink(wrapInCompositeBackend( - boost::make_shared<LogCaptureBackend>(lines), boost::make_shared<UserAssertSink>())); + boost::make_shared<LogCaptureBackend>(lines, true), boost::make_shared<UserAssertSink>())); applyDefaultFilterToSink(sink); sink->set_formatter(PlainFormatter()); attachSink(sink); diff --git a/src/mongo/logv2/plain_formatter.cpp b/src/mongo/logv2/plain_formatter.cpp index 7f38e74693b..ba8e24ba22d 100644 --- a/src/mongo/logv2/plain_formatter.cpp +++ b/src/mongo/logv2/plain_formatter.cpp @@ -171,6 +171,7 @@ void PlainFormatter::operator()(boost::log::record_view const& rec, fmt::memory_buffer buffer; operator()(rec, buffer); strm.write(buffer.data(), buffer.size()); + strm.put(boost::log::formatting_ostream::char_type('\n')); } } // namespace mongo::logv2 |