diff options
author | Henrik Edin <henrik.edin@mongodb.com> | 2020-02-11 14:29:17 -0500 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-02-13 21:14:48 +0000 |
commit | 1de33fe9efad7ebc9a40c515131fc33b8e284c6a (patch) | |
tree | e42bf6f50a0c56d5292a31682d88e99346edd51e | |
parent | 9aa9fa4a2844f0fe7890e01d621960a0c64607f6 (diff) | |
download | mongo-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.cpp | 14 | ||||
-rw-r--r-- | src/mongo/db/server_options.h | 2 | ||||
-rw-r--r-- | src/mongo/db/server_options_base.idl | 2 | ||||
-rw-r--r-- | src/mongo/db/server_options_helpers.cpp | 8 | ||||
-rw-r--r-- | src/mongo/logv2/json_formatter.cpp | 27 | ||||
-rw-r--r-- | src/mongo/logv2/json_formatter.h | 7 | ||||
-rw-r--r-- | src/mongo/logv2/log_domain_global.cpp | 6 | ||||
-rw-r--r-- | src/mongo/logv2/log_domain_global.h | 1 | ||||
-rw-r--r-- | src/mongo/logv2/log_format.h | 1 | ||||
-rw-r--r-- | src/mongo/logv2/plain_formatter.h | 1 | ||||
-rw-r--r-- | src/mongo/logv2/text_formatter.cpp | 12 | ||||
-rw-r--r-- | src/mongo/logv2/text_formatter.h | 8 | ||||
-rw-r--r-- | src/mongo/util/time_support.cpp | 12 | ||||
-rw-r--r-- | src/mongo/util/time_support.h | 7 |
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. |