summaryrefslogtreecommitdiff
path: root/src/mongo/logv2
diff options
context:
space:
mode:
authorsergey.galtsev <sergey.galtsev@mongodb.com>2021-08-10 17:33:42 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-08-10 18:16:34 +0000
commita7dfbdd59bbc4649cbd83344cedbfc7c69356866 (patch)
tree3b8ef99ef4a95ca7c6cadd07b02526fcf5f6becf /src/mongo/logv2
parent384542592c718d696b5c36d3cc67021c0844bb09 (diff)
downloadmongo-a7dfbdd59bbc4649cbd83344cedbfc7c69356866.tar.gz
SERVER-56401 emit eol in log formatter
Diffstat (limited to 'src/mongo/logv2')
-rw-r--r--src/mongo/logv2/json_formatter.cpp1
-rw-r--r--src/mongo/logv2/log_capture_backend.h15
-rw-r--r--src/mongo/logv2/logv2_test.cpp26
-rw-r--r--src/mongo/logv2/plain_formatter.cpp1
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