summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrik Edin <henrik.edin@mongodb.com>2020-02-11 14:29:17 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-02-13 21:14:48 +0000
commit1de33fe9efad7ebc9a40c515131fc33b8e284c6a (patch)
treee42bf6f50a0c56d5292a31682d88e99346edd51e
parent9aa9fa4a2844f0fe7890e01d621960a0c64607f6 (diff)
downloadmongo-1de33fe9efad7ebc9a40c515131fc33b8e284c6a.tar.gz
SERVER-42722 Implement --timeStampFormat in logv2.
Removed option for ctime as it is not allowed in Extended JSON.
-rw-r--r--src/mongo/db/initialize_server_global_state.cpp14
-rw-r--r--src/mongo/db/server_options.h2
-rw-r--r--src/mongo/db/server_options_base.idl2
-rw-r--r--src/mongo/db/server_options_helpers.cpp8
-rw-r--r--src/mongo/logv2/json_formatter.cpp27
-rw-r--r--src/mongo/logv2/json_formatter.h7
-rw-r--r--src/mongo/logv2/log_domain_global.cpp6
-rw-r--r--src/mongo/logv2/log_domain_global.h1
-rw-r--r--src/mongo/logv2/log_format.h1
-rw-r--r--src/mongo/logv2/plain_formatter.h1
-rw-r--r--src/mongo/logv2/text_formatter.cpp12
-rw-r--r--src/mongo/logv2/text_formatter.h8
-rw-r--r--src/mongo/util/time_support.cpp12
-rw-r--r--src/mongo/util/time_support.h7
14 files changed, 78 insertions, 30 deletions
diff --git a/src/mongo/db/initialize_server_global_state.cpp b/src/mongo/db/initialize_server_global_state.cpp
index db4f894e815..b7f7a3f854c 100644
--- a/src/mongo/db/initialize_server_global_state.cpp
+++ b/src/mongo/db/initialize_server_global_state.cpp
@@ -28,6 +28,7 @@
*/
#define MONGO_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kControl
+#define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kControl
#include "mongo/platform/basic.h"
@@ -226,6 +227,7 @@ MONGO_INITIALIZER_GENERAL(ServerLogRedirection,
logv2::LogDomainGlobal::ConfigurationOptions lv2Config;
MessageEventDetailsEncoder::setMaxLogSizeKBSource(gMaxLogAttributeSizeKB);
lv2Config.maxAttributeSizeKB = &gMaxLogAttributeSizeKB;
+ bool writeServerRestartedAfterLogConfig = false;
if (serverGlobalParams.logWithSyslog) {
#ifdef _WIN32
@@ -324,11 +326,7 @@ MONGO_INITIALIZER_GENERAL(ServerLogRedirection,
: logv2::LogDomainGlobal::ConfigurationOptions::OpenMode::kTruncate;
if (serverGlobalParams.logAppend && exists) {
- LOGV2(20698, "***** SERVER RESTARTED *****");
- // FIXME rewrite for logv2
- // Status status = logger::RotatableFileWriter::Use(writer.getValue()).status();
- // if (!status.isOK())
- // return status;
+ writeServerRestartedAfterLogConfig = true;
}
} else {
@@ -377,7 +375,11 @@ MONGO_INITIALIZER_GENERAL(ServerLogRedirection,
if (logV2Enabled()) {
lv2Config.format = serverGlobalParams.logFormat;
- return lv2Manager.getGlobalDomainInternal().configure(lv2Config);
+ lv2Config.timestampFormat = serverGlobalParams.logTimestampFormat;
+ Status result = lv2Manager.getGlobalDomainInternal().configure(lv2Config);
+ if (result.isOK() && writeServerRestartedAfterLogConfig)
+ LOGV2(20698, "***** SERVER RESTARTED *****");
+ return result;
}
return Status::OK();
diff --git a/src/mongo/db/server_options.h b/src/mongo/db/server_options.h
index 076f8decb87..12913018092 100644
--- a/src/mongo/db/server_options.h
+++ b/src/mongo/db/server_options.h
@@ -99,6 +99,8 @@ struct ServerGlobalParams {
std::string logpath; // Path to log file, if logging to a file; otherwise, empty.
logv2::LogFormat logFormat = logv2::LogFormat::kDefault; // Log format to output to
+ logv2::LogTimestampFormat logTimestampFormat = logv2::LogTimestampFormat::kISO8601Local;
+
bool logAppend = false; // True if logging to a file in append mode.
bool logRenameOnRotate = true; // True if logging should rename log files on rotate
bool logWithSyslog = false; // True if logging to syslog; must not be set if logpath is set.
diff --git a/src/mongo/db/server_options_base.idl b/src/mongo/db/server_options_base.idl
index aa150ec5d08..fcf7a88047f 100644
--- a/src/mongo/db/server_options_base.idl
+++ b/src/mongo/db/server_options_base.idl
@@ -140,7 +140,7 @@ configs:
short_name: logRotate
arg_vartype: String
'systemLog.timeStampFormat':
- description: Desired format for timestamps in log messages. One of ctime, iso8601-utc or iso8601-local
+ description: Desired format for timestamps in log messages. One of iso8601-utc or iso8601-local
short_name: timeStampFormat
arg_vartype: String
diff --git a/src/mongo/db/server_options_helpers.cpp b/src/mongo/db/server_options_helpers.cpp
index 5fc7039d866..116f46a2413 100644
--- a/src/mongo/db/server_options_helpers.cpp
+++ b/src/mongo/db/server_options_helpers.cpp
@@ -312,15 +312,15 @@ Status storeBaseOptions(const moe::Environment& params) {
if (params.count("systemLog.timeStampFormat")) {
using logger::MessageEventDetailsEncoder;
std::string formatterName = params["systemLog.timeStampFormat"].as<string>();
- if (formatterName == "ctime") {
- MessageEventDetailsEncoder::setDateFormatter(outputDateAsCtime);
- } else if (formatterName == "iso8601-utc") {
+ if (formatterName == "iso8601-utc") {
MessageEventDetailsEncoder::setDateFormatter(outputDateAsISOStringUTC);
+ serverGlobalParams.logTimestampFormat = logv2::LogTimestampFormat::kISO8601UTC;
} else if (formatterName == "iso8601-local") {
MessageEventDetailsEncoder::setDateFormatter(outputDateAsISOStringLocal);
+ serverGlobalParams.logTimestampFormat = logv2::LogTimestampFormat::kISO8601Local;
} else {
StringBuilder sb;
- sb << "Value of logTimestampFormat must be one of ctime, iso8601-utc "
+ sb << "Value of logTimestampFormat must be one of iso8601-utc "
<< "or iso8601-local; not \"" << formatterName << "\".";
return Status(ErrorCodes::BadValue, sb.str());
}
diff --git a/src/mongo/logv2/json_formatter.cpp b/src/mongo/logv2/json_formatter.cpp
index 2f579f66809..528f30ec807 100644
--- a/src/mongo/logv2/json_formatter.cpp
+++ b/src/mongo/logv2/json_formatter.cpp
@@ -213,15 +213,24 @@ void JSONFormatter::operator()(boost::log::record_view const& rec,
// Put all fields up until the message value
fmt::format_to(buffer,
R"({{)"
- R"("{}":{{"$date":"{}"}},)" // timestamp
- R"("{}":"{}"{: <{}})" // severity with padding for the comma
- R"("{}":"{}"{: <{}})" // component with padding for the comma
- R"("{}":{},)" // id
- R"("{}":"{}",)" // context
- R"("{}":"{}")", // message
- // timestamp
- constants::kTimestampFieldName,
- dateToISOStringUTC(extract<Date_t>(attributes::timeStamp(), rec).get()),
+ R"("{}":{{"$date":")",
+ constants::kTimestampFieldName);
+ Date_t date = extract<Date_t>(attributes::timeStamp(), rec).get();
+ switch (_timestampFormat) {
+ case LogTimestampFormat::kISO8601UTC:
+ outputDateAsISOStringUTC(buffer, date);
+ break;
+ case LogTimestampFormat::kISO8601Local:
+ outputDateAsISOStringLocal(buffer, date);
+ break;
+ };
+ fmt::format_to(buffer,
+ R"("}},)" // close timestamp
+ R"("{}":"{}"{: <{}})" // severity with padding for the comma
+ R"("{}":"{}"{: <{}})" // component with padding for the comma
+ R"("{}":{},)" // id
+ R"("{}":"{}",)" // context
+ R"("{}":"{}")", // message
// severity, left align the comma and add padding to create fixed column width
constants::kSeverityFieldName,
severity,
diff --git a/src/mongo/logv2/json_formatter.h b/src/mongo/logv2/json_formatter.h
index fb33dcde399..cd511516eb1 100644
--- a/src/mongo/logv2/json_formatter.h
+++ b/src/mongo/logv2/json_formatter.h
@@ -33,18 +33,21 @@
#include <boost/log/utility/formatting_ostream_fwd.hpp>
#include "mongo/logv2/constants.h"
+#include "mongo/logv2/log_format.h"
namespace mongo::logv2 {
class JSONFormatter {
public:
- JSONFormatter(const AtomicWord<int32_t>* maxAttributeSizeKB = nullptr)
- : _maxAttributeSizeKB(maxAttributeSizeKB) {}
+ JSONFormatter(const AtomicWord<int32_t>* maxAttributeSizeKB = nullptr,
+ LogTimestampFormat timestampFormat = LogTimestampFormat::kISO8601UTC)
+ : _maxAttributeSizeKB(maxAttributeSizeKB), _timestampFormat(timestampFormat) {}
void operator()(boost::log::record_view const& rec, boost::log::formatting_ostream& strm) const;
private:
const AtomicWord<int32_t>* _maxAttributeSizeKB;
+ const LogTimestampFormat _timestampFormat;
};
} // namespace mongo::logv2
diff --git a/src/mongo/logv2/log_domain_global.cpp b/src/mongo/logv2/log_domain_global.cpp
index 50b378f4c0e..2788cd8aca4 100644
--- a/src/mongo/logv2/log_domain_global.cpp
+++ b/src/mongo/logv2/log_domain_global.cpp
@@ -176,10 +176,12 @@ Status LogDomainGlobal::Impl::configure(LogDomainGlobal::ConfigurationOptions co
switch (options.format) {
case LogFormat::kDefault:
case LogFormat::kText:
- setFormatters([&] { return TextFormatter(options.maxAttributeSizeKB); });
+ setFormatters(
+ [&] { return TextFormatter(options.maxAttributeSizeKB, options.timestampFormat); });
break;
case LogFormat::kJson:
- setFormatters([&] { return JSONFormatter(options.maxAttributeSizeKB); });
+ setFormatters(
+ [&] { return JSONFormatter(options.maxAttributeSizeKB, options.timestampFormat); });
break;
}
diff --git a/src/mongo/logv2/log_domain_global.h b/src/mongo/logv2/log_domain_global.h
index a956806b621..d3acb55f30f 100644
--- a/src/mongo/logv2/log_domain_global.h
+++ b/src/mongo/logv2/log_domain_global.h
@@ -46,6 +46,7 @@ public:
std::string filePath;
RotationMode fileRotationMode{RotationMode::kRename};
OpenMode fileOpenMode{OpenMode::kTruncate};
+ LogTimestampFormat timestampFormat{LogTimestampFormat::kISO8601UTC};
bool syslogEnabled{false};
int syslogFacility{-1}; // invalid facility by default, must be set
LogFormat format{LogFormat::kDefault};
diff --git a/src/mongo/logv2/log_format.h b/src/mongo/logv2/log_format.h
index cfd575af6ef..12e42fab859 100644
--- a/src/mongo/logv2/log_format.h
+++ b/src/mongo/logv2/log_format.h
@@ -32,5 +32,6 @@
namespace mongo {
namespace logv2 {
enum class LogFormat { kDefault, kText, kJson };
+enum class LogTimestampFormat { kISO8601UTC, kISO8601Local };
} // namespace logv2
} // namespace mongo
diff --git a/src/mongo/logv2/plain_formatter.h b/src/mongo/logv2/plain_formatter.h
index e61cd2a9af2..6860c2dda10 100644
--- a/src/mongo/logv2/plain_formatter.h
+++ b/src/mongo/logv2/plain_formatter.h
@@ -33,6 +33,7 @@
#include <boost/log/utility/formatting_ostream_fwd.hpp>
#include "mongo/logv2/constants.h"
+#include "mongo/logv2/log_format.h"
namespace mongo::logv2 {
diff --git a/src/mongo/logv2/text_formatter.cpp b/src/mongo/logv2/text_formatter.cpp
index da8bff39f6b..8314160d436 100644
--- a/src/mongo/logv2/text_formatter.cpp
+++ b/src/mongo/logv2/text_formatter.cpp
@@ -46,10 +46,18 @@ void TextFormatter::operator()(boost::log::record_view const& rec,
boost::log::formatting_ostream& strm) const {
using namespace boost::log;
+ Date_t timeStamp = extract<Date_t>(attributes::timeStamp(), rec).get();
fmt::memory_buffer buffer;
+ switch (_timestampFormat) {
+ case LogTimestampFormat::kISO8601UTC:
+ outputDateAsISOStringUTC(buffer, timeStamp);
+ break;
+ case LogTimestampFormat::kISO8601Local:
+ outputDateAsISOStringLocal(buffer, timeStamp);
+ break;
+ };
fmt::format_to(buffer,
- "{} {:<2} {:<8} [{}] ",
- extract<Date_t>(attributes::timeStamp(), rec).get().toString(),
+ " {:<2} {:<8} [{}] ",
extract<LogSeverity>(attributes::severity(), rec).get().toStringDataCompact(),
extract<LogComponent>(attributes::component(), rec).get().getNameForLog(),
extract<StringData>(attributes::threadName(), rec).get());
diff --git a/src/mongo/logv2/text_formatter.h b/src/mongo/logv2/text_formatter.h
index 6276b413e96..fbf49be999f 100644
--- a/src/mongo/logv2/text_formatter.h
+++ b/src/mongo/logv2/text_formatter.h
@@ -35,10 +35,14 @@ namespace mongo::logv2 {
class TextFormatter : protected PlainFormatter {
public:
- TextFormatter(const AtomicWord<int32_t>* maxAttributeSizeKB = nullptr)
- : PlainFormatter(maxAttributeSizeKB) {}
+ TextFormatter(const AtomicWord<int32_t>* maxAttributeSizeKB = nullptr,
+ LogTimestampFormat timestampFormat = LogTimestampFormat::kISO8601UTC)
+ : PlainFormatter(maxAttributeSizeKB), _timestampFormat(timestampFormat) {}
void operator()(boost::log::record_view const& rec, boost::log::formatting_ostream& strm) const;
+
+private:
+ const LogTimestampFormat _timestampFormat;
};
} // namespace mongo::logv2
diff --git a/src/mongo/util/time_support.cpp b/src/mongo/util/time_support.cpp
index a33130fe383..2e1c98b88ef 100644
--- a/src/mongo/util/time_support.cpp
+++ b/src/mongo/util/time_support.cpp
@@ -283,12 +283,24 @@ void outputDateAsISOStringUTC(std::ostream& os, Date_t date) {
os << StringData(buf.data, buf.size);
}
+void outputDateAsISOStringUTC(fmt::memory_buffer& buffer, Date_t date) {
+ DateStringBuffer buf;
+ _dateToISOString(date, false, &buf);
+ buffer.append(buf.data, buf.data + buf.size);
+}
+
void outputDateAsISOStringLocal(std::ostream& os, Date_t date) {
DateStringBuffer buf;
_dateToISOString(date, true, &buf);
os << StringData(buf.data, buf.size);
}
+void outputDateAsISOStringLocal(fmt::memory_buffer& buffer, Date_t date) {
+ DateStringBuffer buf;
+ _dateToISOString(date, true, &buf);
+ buffer.append(buf.data, buf.data + buf.size);
+}
+
void outputDateAsCtime(std::ostream& os, Date_t date) {
DateStringBuffer buf;
_dateToCtimeString(date, &buf);
diff --git a/src/mongo/util/time_support.h b/src/mongo/util/time_support.h
index 9511a735f5c..3072e62302a 100644
--- a/src/mongo/util/time_support.h
+++ b/src/mongo/util/time_support.h
@@ -30,6 +30,7 @@
#pragma once
#include <ctime>
+#include <fmt/format.h>
#include <iosfwd>
#include <limits>
#include <string>
@@ -305,14 +306,16 @@ std::string dateToCtimeString(Date_t date);
StatusWith<Date_t> dateFromISOString(StringData dateString);
/**
- * Like dateToISOStringUTC, except outputs to a std::ostream.
+ * Like dateToISOStringUTC, except outputs to a std::ostream or fmt::memory_buffer.
*/
void outputDateAsISOStringUTC(std::ostream& os, Date_t date);
+void outputDateAsISOStringUTC(fmt::memory_buffer& buffer, Date_t date);
/**
- * Like dateToISOStringLocal, except outputs to a std::ostream.
+ * Like dateToISOStringLocal, except outputs to a std::ostream or fmt::memory_buffer.
*/
void outputDateAsISOStringLocal(std::ostream& os, Date_t date);
+void outputDateAsISOStringLocal(fmt::memory_buffer& buffer, Date_t date);
/**
* Like dateToCtimeString, except outputs to a std::ostream.