MongoDB C++ Driver legacy-1.0.0
Loading...
Searching...
No Matches
log.h
1// @file log.h
2
3/* Copyright 2009 10gen Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18// #pragma once is not used in this header.
19// This header attempts to enforce the rule that no logging should be done in
20// an inline function defined in a header.
21// To enforce this "no logging in header" rule, we use #include guards with a validating #else
22// clause.
23// Also, this header relies on a preprocessor macro to determine the default component for the
24// unconditional logging functions severe(), error(), warning() and log(). Disallowing multiple
25// inclusion of log.h will ensure that the default component will be set correctly.
26
27#if defined(MONGO_UTIL_LOG_H_)
28#error "mongo/util/log.h cannot be included multiple times. " \
29 "This may occur when log.h is included in a header. " \
30 "Please check your #include's."
31#else // MONGO_UTIL_LOG_H_
32#define MONGO_UTIL_LOG_H_
33
34#include "mongo/base/status.h"
35#include "mongo/bson/util/builder.h"
36#include "mongo/logger/log_component.h"
37#include "mongo/logger/logger.h"
38#include "mongo/logger/logstream_builder.h"
39#include "mongo/logger/tee.h"
40
41// Provide log component in global scope so that MONGO_LOG will always have a valid component.
42// Global log component will be kDefault unless overridden by MONGO_LOG_DEFAULT_COMPONENT.
43#if defined(MONGO_LOG_DEFAULT_COMPONENT)
44const ::mongo::logger::LogComponent MongoLogDefaultComponent_component =
45 MONGO_LOG_DEFAULT_COMPONENT;
46#else
47#error "mongo/util/log.h requires MONGO_LOG_DEFAULT_COMPONENT to be defined. " \
48 "Please see http://www.mongodb.org/about/contributors/reference/server-logging-rules/ "
49#endif // MONGO_LOG_DEFAULT_COMPONENT
50
51namespace mongo {
52
53namespace logger {
54 typedef void (*ExtraLogContextFn)(BufBuilder& builder);
55 Status registerExtraLogContextFn(ExtraLogContextFn contextFn);
56
57} // namespace logger
58
59namespace {
60
61 using logger::LogstreamBuilder;
62 using logger::LabeledLevel;
63 using logger::Tee;
64
68 inline LogstreamBuilder severe() {
69 return LogstreamBuilder(logger::globalLogDomain(),
70 std::string(),
71 logger::LogSeverity::Severe(),
72 ::MongoLogDefaultComponent_component);
73 }
74
75 inline LogstreamBuilder severe(logger::LogComponent component) {
76 return LogstreamBuilder(logger::globalLogDomain(),
77 std::string(),
78 logger::LogSeverity::Severe(),
79 component);
80 }
81
85 inline LogstreamBuilder error() {
86 return LogstreamBuilder(logger::globalLogDomain(),
87 std::string(),
88 logger::LogSeverity::Error(),
89 ::MongoLogDefaultComponent_component);
90 }
91
92 inline LogstreamBuilder error(logger::LogComponent component) {
93 return LogstreamBuilder(logger::globalLogDomain(),
94 std::string(),
95 logger::LogSeverity::Error(),
96 component);
97 }
98
102 inline LogstreamBuilder warning() {
103 return LogstreamBuilder(logger::globalLogDomain(),
104 std::string(),
105 logger::LogSeverity::Warning(),
106 ::MongoLogDefaultComponent_component);
107 }
108
109 inline LogstreamBuilder warning(logger::LogComponent component) {
110 return LogstreamBuilder(logger::globalLogDomain(),
111 std::string(),
112 logger::LogSeverity::Warning(),
113 component);
114 }
115
119 inline LogstreamBuilder log() {
120 return LogstreamBuilder(logger::globalLogDomain(),
121 std::string(),
122 logger::LogSeverity::Log(),
123 ::MongoLogDefaultComponent_component);
124 }
125
126 inline LogstreamBuilder log(logger::LogComponent component) {
127 return LogstreamBuilder(logger::globalLogDomain(),
128 std::string(),
129 logger::LogSeverity::Log(),
130 component);
131 }
132
133 inline LogstreamBuilder log(logger::LogComponent::Value componentValue) {
134 return LogstreamBuilder(logger::globalLogDomain(),
135 std::string(),
136 logger::LogSeverity::Log(),
137 componentValue);
138 }
139
143 inline bool shouldLog(logger::LogSeverity severity) {
144 return logger::globalLogDomain()->shouldLog(::MongoLogDefaultComponent_component, severity);
145 }
146
147} // namespace
148
149// MONGO_LOG uses log component from MongoLogDefaultComponent from current or global namespace.
150#define MONGO_LOG(DLEVEL) \
151 if (!(::mongo::logger::globalLogDomain())->shouldLog(MongoLogDefaultComponent_component, ::mongo::LogstreamBuilder::severityCast(DLEVEL))) {} \
152 else ::mongo::logger::LogstreamBuilder(::mongo::logger::globalLogDomain(), std::string(), ::mongo::LogstreamBuilder::severityCast(DLEVEL), MongoLogDefaultComponent_component)
153
154#define LOG MONGO_LOG
155
156#define MONGO_LOG_COMPONENT(DLEVEL, COMPONENT1) \
157 if (!(::mongo::logger::globalLogDomain())->shouldLog((COMPONENT1), ::mongo::LogstreamBuilder::severityCast(DLEVEL))) {} \
158 else ::mongo::logger::LogstreamBuilder(::mongo::logger::globalLogDomain(), std::string(), ::mongo::LogstreamBuilder::severityCast(DLEVEL), (COMPONENT1))
159
160#define MONGO_LOG_COMPONENT2(DLEVEL, COMPONENT1, COMPONENT2) \
161 if (!(::mongo::logger::globalLogDomain())->shouldLog((COMPONENT1), (COMPONENT2), ::mongo::LogstreamBuilder::severityCast(DLEVEL))) {} \
162 else ::mongo::logger::LogstreamBuilder(::mongo::logger::globalLogDomain(), std::string(), ::mongo::LogstreamBuilder::severityCast(DLEVEL), (COMPONENT1))
163
164#define MONGO_LOG_COMPONENT3(DLEVEL, COMPONENT1, COMPONENT2, COMPONENT3) \
165 if (!(::mongo::logger::globalLogDomain())->shouldLog((COMPONENT1), (COMPONENT2), (COMPONENT3), ::mongo::LogstreamBuilder::severityCast(DLEVEL))) {} \
166 else ::mongo::logger::LogstreamBuilder(::mongo::logger::globalLogDomain(), std::string(), ::mongo::LogstreamBuilder::severityCast(DLEVEL), (COMPONENT1))
167
168
172 std::string errnoWithPrefix( const char * prefix );
173
174 std::string errnoWithDescription(int errorcode = -1);
175
179 void logContext(const char *msg = NULL);
180
181} // namespace mongo
182
183#endif // MONGO_UTIL_LOG_H_
the main MongoDB namespace
Definition bulk_operation_builder.h:24
MONGO_CLIENT_API Status(MONGO_CLIENT_FUNC *saslClientAuthenticate)(DBClientWithCommands *client
Attempts to authenticate "client" using the SASL protocol.
void logContext(const char *msg=NULL)
Write the optional "msg".
std::string errnoWithPrefix(const char *prefix)
output the error # and error message with prefix.