MongoDB C++ Driver  legacy-1.0.3
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
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)
44 const ::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 
51 namespace mongo {
52 
53 namespace logger {
54  typedef void (*ExtraLogContextFn)(BufBuilder& builder);
55  Status registerExtraLogContextFn(ExtraLogContextFn contextFn);
56 
57 } // namespace logger
58 
59 namespace {
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
std::string errnoWithPrefix(const char *prefix)
output the error # and error message with prefix.
void logContext(const char *msg=NULL)
Write the optional "msg".
MONGO_CLIENT_API Status(MONGO_CLIENT_FUNC *saslClientAuthenticate)(DBClientWithCommands *client
Attempts to authenticate "client" using the SASL protocol.