diff options
Diffstat (limited to 'src/mongo/logger/logstream_builder.h')
-rw-r--r-- | src/mongo/logger/logstream_builder.h | 291 |
1 files changed, 175 insertions, 116 deletions
diff --git a/src/mongo/logger/logstream_builder.h b/src/mongo/logger/logstream_builder.h index 5bc4ebea990..0a5f943ab78 100644 --- a/src/mongo/logger/logstream_builder.h +++ b/src/mongo/logger/logstream_builder.h @@ -41,125 +41,184 @@ namespace mongo { namespace logger { - class Tee; +class Tee; + +/** + * Stream-ish object used to build and append log messages. + */ +class MONGO_CLIENT_API LogstreamBuilder { +public: + static LogSeverity severityCast(int ll) { + return LogSeverity::cast(ll); + } + static LogSeverity severityCast(LogSeverity ls) { + return ls; + } + static LabeledLevel severityCast(const LabeledLevel& labeled) { + return labeled; + } + + /** + * Construct a LogstreamBuilder that writes to "domain" on destruction. + * + * "contextName" is a short name of the thread or other context. + * "severity" is the logging severity of the message. + */ + LogstreamBuilder(MessageLogDomain* domain, + const std::string& contextName, + LogSeverity severity); + + /** + * Construct a LogstreamBuilder that writes to "domain" on destruction. + * + * "contextName" is a short name of the thread or other context. + * "severity" is the logging severity of the message. + * "component" is the primary log component of the message. + */ + LogstreamBuilder(MessageLogDomain* domain, + const std::string& contextName, + LogSeverity severity, + LogComponent component); + + /** + * Deprecated. + */ + LogstreamBuilder(MessageLogDomain* domain, + const std::string& contextName, + LabeledLevel labeledLevel); + + /** + * Copies a LogstreamBuilder. LogstreamBuilder instances are copyable only until the first + * call to stream() or operator<<. + * + * TODO(schwerin): After C++11 transition, replace with a move-constructor, and make + * LogstreamBuilder movable. + */ + LogstreamBuilder(const LogstreamBuilder& other); + + /** + * Destroys a LogstreamBuilder(). If anything was written to it via stream() or operator<<, + * constructs a MessageLogDomain::Event and appends it to the associated domain. + */ + ~LogstreamBuilder(); + /** - * Stream-ish object used to build and append log messages. + * Sets an optional prefix for the message. */ - class MONGO_CLIENT_API LogstreamBuilder { - public: - static LogSeverity severityCast(int ll) { return LogSeverity::cast(ll); } - static LogSeverity severityCast(LogSeverity ls) { return ls; } - static LabeledLevel severityCast(const LabeledLevel &labeled) { return labeled; } - - /** - * Construct a LogstreamBuilder that writes to "domain" on destruction. - * - * "contextName" is a short name of the thread or other context. - * "severity" is the logging severity of the message. - */ - LogstreamBuilder(MessageLogDomain* domain, - const std::string& contextName, - LogSeverity severity); - - /** - * Construct a LogstreamBuilder that writes to "domain" on destruction. - * - * "contextName" is a short name of the thread or other context. - * "severity" is the logging severity of the message. - * "component" is the primary log component of the message. - */ - LogstreamBuilder(MessageLogDomain* domain, - const std::string& contextName, - LogSeverity severity, - LogComponent component); - - /** - * Deprecated. - */ - LogstreamBuilder(MessageLogDomain* domain, - const std::string& contextName, - LabeledLevel labeledLevel); - - /** - * Copies a LogstreamBuilder. LogstreamBuilder instances are copyable only until the first - * call to stream() or operator<<. - * - * TODO(schwerin): After C++11 transition, replace with a move-constructor, and make - * LogstreamBuilder movable. - */ - LogstreamBuilder(const LogstreamBuilder& other); - - /** - * Destroys a LogstreamBuilder(). If anything was written to it via stream() or operator<<, - * constructs a MessageLogDomain::Event and appends it to the associated domain. - */ - ~LogstreamBuilder(); - - - /** - * Sets an optional prefix for the message. - */ - LogstreamBuilder& setBaseMessage(const std::string& baseMessage) { - _baseMessage = baseMessage; - return *this; - } - - std::ostream& stream() { makeStream(); return *_os; } - - LogstreamBuilder& operator<<(const char *x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(const std::string& x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(const StringData& x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(char *x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(char x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(int x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(ExitCode x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(long x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(unsigned long x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(unsigned x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(unsigned short x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(double x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(void *x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(const void *x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(long long x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(unsigned long long x) { stream() << x; return *this; } - LogstreamBuilder& operator<<(bool x) { stream() << x; return *this; } - - template <typename T> - LogstreamBuilder& operator<<(const T& x) { - stream() << x.toString(); - return *this; - } - - LogstreamBuilder& operator<< (std::ostream& ( *manip )(std::ostream&)) { - stream() << manip; - return *this; - } - LogstreamBuilder& operator<< (std::ios_base& (*manip)(std::ios_base&)) { - stream() << manip; - return *this; - } - - /** - * In addition to appending the message to _domain, write it to the given tee. May only - * be called once per instance of LogstreamBuilder. - */ - void operator<<(Tee* tee); - - private: - LogstreamBuilder& operator=(const LogstreamBuilder& other); - - void makeStream(); - - MessageLogDomain* _domain; - std::string _contextName; - LogSeverity _severity; - LogComponent _component; - std::string _baseMessage; - std::ostringstream* _os; - Tee* _tee; - - }; + LogstreamBuilder& setBaseMessage(const std::string& baseMessage) { + _baseMessage = baseMessage; + return *this; + } + + std::ostream& stream() { + makeStream(); + return *_os; + } + + LogstreamBuilder& operator<<(const char* x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(const std::string& x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(const StringData& x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(char* x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(char x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(int x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(ExitCode x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(long x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(unsigned long x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(unsigned x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(unsigned short x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(double x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(void* x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(const void* x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(long long x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(unsigned long long x) { + stream() << x; + return *this; + } + LogstreamBuilder& operator<<(bool x) { + stream() << x; + return *this; + } + + template <typename T> + LogstreamBuilder& operator<<(const T& x) { + stream() << x.toString(); + return *this; + } + + LogstreamBuilder& operator<<(std::ostream& (*manip)(std::ostream&)) { + stream() << manip; + return *this; + } + LogstreamBuilder& operator<<(std::ios_base& (*manip)(std::ios_base&)) { + stream() << manip; + return *this; + } + + /** + * In addition to appending the message to _domain, write it to the given tee. May only + * be called once per instance of LogstreamBuilder. + */ + void operator<<(Tee* tee); + +private: + LogstreamBuilder& operator=(const LogstreamBuilder& other); + + void makeStream(); + + MessageLogDomain* _domain; + std::string _contextName; + LogSeverity _severity; + LogComponent _component; + std::string _baseMessage; + std::ostringstream* _os; + Tee* _tee; +}; } // namespace logger |