log4cplus  2.0.0
loggingmacros.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 // Module: Log4CPLUS
3 // File: loggingmacros.h
4 // Created: 8/2003
5 // Author: Tad E. Smith
6 //
7 //
8 // Copyright 2003-2017 Tad E. Smith
9 //
10 // Licensed under the Apache License, Version 2.0 (the "License");
11 // you may not use this file except in compliance with the License.
12 // You may obtain a copy of the License at
13 //
14 // http://www.apache.org/licenses/LICENSE-2.0
15 //
16 // Unless required by applicable law or agreed to in writing, software
17 // distributed under the License is distributed on an "AS IS" BASIS,
18 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 // See the License for the specific language governing permissions and
20 // limitations under the License.
21 
25 #ifndef LOG4CPLUS_LOGGING_MACROS_HEADER_
26 #define LOG4CPLUS_LOGGING_MACROS_HEADER_
27 
28 #include <log4cplus/config.hxx>
29 
30 #if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
31 #pragma once
32 #endif
33 
34 #include <log4cplus/streams.h>
35 #include <log4cplus/logger.h>
37 #include <log4cplus/tracelogger.h>
38 #include <sstream>
39 #include <utility>
40 
41 
42 #if defined(_MSC_VER)
43 #define LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
44  __pragma (warning (push)) \
45  __pragma (warning (disable:4127))
46 
47 #define LOG4CPLUS_RESTORE_DOWHILE_WARNING() \
48  __pragma (warning (pop))
49 
50 #else
51 #define LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() /* empty */
52 #define LOG4CPLUS_RESTORE_DOWHILE_WARNING() /* empty */
53 
54 #endif
55 
56 #define LOG4CPLUS_DOWHILE_NOTHING() \
57  LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
58  do { } while (0) \
59  LOG4CPLUS_RESTORE_DOWHILE_WARNING()
60 
61 #if defined(LOG4CPLUS_DISABLE_FATAL) && !defined(LOG4CPLUS_DISABLE_ERROR)
62 #define LOG4CPLUS_DISABLE_ERROR
63 #endif
64 #if defined(LOG4CPLUS_DISABLE_ERROR) && !defined(LOG4CPLUS_DISABLE_WARN)
65 #define LOG4CPLUS_DISABLE_WARN
66 #endif
67 #if defined(LOG4CPLUS_DISABLE_WARN) && !defined(LOG4CPLUS_DISABLE_INFO)
68 #define LOG4CPLUS_DISABLE_INFO
69 #endif
70 #if defined(LOG4CPLUS_DISABLE_INFO) && !defined(LOG4CPLUS_DISABLE_DEBUG)
71 #define LOG4CPLUS_DISABLE_DEBUG
72 #endif
73 #if defined(LOG4CPLUS_DISABLE_DEBUG) && !defined(LOG4CPLUS_DISABLE_TRACE)
74 #define LOG4CPLUS_DISABLE_TRACE
75 #endif
76 
77 
78 namespace log4cplus
79 {
80 
81 namespace detail
82 {
83 
84 
85 inline
86 Logger
87 macros_get_logger (Logger const & logger)
88 {
89  return logger;
90 }
91 
92 
93 inline
94 Logger const &
96 {
97  return logger;
98 }
99 
100 
101 inline
102 Logger
104 {
105  return std::move (logger);
106 }
107 
108 inline
109 Logger
110 macros_get_logger (tstring const & logger)
111 {
112  return Logger::getInstance (logger);
113 }
114 
115 
116 inline
117 Logger
118 macros_get_logger (tchar const * logger)
119 {
120  return Logger::getInstance (logger);
121 }
122 
123 
125 
126 
130  log4cplus::LogLevel, log4cplus::tstring const &, char const *, int,
131  char const *);
133  log4cplus::LogLevel, log4cplus::tchar const *, char const *, int,
134  char const *);
135 
136 
137 
138 } // namespace detail
139 
140 } // namespace log4cplus
141 
142 
143 #undef LOG4CPLUS_MACRO_FUNCTION
144 #define LOG4CPLUS_MACRO_FUNCTION() nullptr
145 #if ! defined (LOG4CPLUS_DISABLE_FUNCTION_MACRO)
146 # if defined (LOG4CPLUS_HAVE_FUNCSIG_MACRO)
147 # undef LOG4CPLUS_MACRO_FUNCTION
148 # define LOG4CPLUS_MACRO_FUNCTION() __FUNCSIG__
149 # elif defined (LOG4CPLUS_HAVE_PRETTY_FUNCTION_MACRO)
150 # undef LOG4CPLUS_MACRO_FUNCTION
151 # define LOG4CPLUS_MACRO_FUNCTION() __PRETTY_FUNCTION__
152 # elif defined (LOG4CPLUS_HAVE_FUNCTION_MACRO)
153 # undef LOG4CPLUS_MACRO_FUNCTION
154 # define LOG4CPLUS_MACRO_FUNCTION() __FUNCTION__
155 # elif defined (LOG4CPLUS_HAVE_FUNC_SYMBOL)
156 # undef LOG4CPLUS_MACRO_FUNCTION
157 # define LOG4CPLUS_MACRO_FUNCTION() __func__
158 # endif
159 #endif
160 
161 
162 // Make TRACE and DEBUG log level unlikely and INFO, WARN, ERROR and
163 // FATAL log level likely.
164 #define LOG4CPLUS_MACRO_TRACE_LOG_LEVEL(pred) \
165  LOG4CPLUS_UNLIKELY (pred)
166 #define LOG4CPLUS_MACRO_DEBUG_LOG_LEVEL(pred) \
167  LOG4CPLUS_UNLIKELY (pred)
168 #define LOG4CPLUS_MACRO_INFO_LOG_LEVEL(pred) \
169  LOG4CPLUS_LIKELY (pred)
170 #define LOG4CPLUS_MACRO_WARN_LOG_LEVEL(pred) \
171  LOG4CPLUS_LIKELY (pred)
172 #define LOG4CPLUS_MACRO_ERROR_LOG_LEVEL(pred) \
173  LOG4CPLUS_LIKELY (pred)
174 #define LOG4CPLUS_MACRO_FATAL_LOG_LEVEL(pred) \
175  LOG4CPLUS_LIKELY (pred)
176 
177 
179 #define LOG4CPLUS_MACRO_LOGLEVEL_PRED(pred, logLevel) \
180  LOG4CPLUS_MACRO_ ## logLevel (pred)
181 
182 
183 // Either use temporary instances of ostringstream
184 // and snprintf_buf, or use thread-local instances.
185 #if defined (LOG4CPLUS_MACRO_DISABLE_TLS)
186 # define LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM(var) \
187  log4cplus::tostringstream var
188 
189 # define LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF(var) \
190  log4cplus::helpers::snprintf_buf var
191 
192 #else
193 # define LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM(var) \
194  log4cplus::tostringstream & var \
195  = log4cplus::detail::get_macro_body_oss ()
196 
197 # define LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF(var) \
198  log4cplus::helpers::snprintf_buf & var \
199  = log4cplus::detail::get_macro_body_snprintf_buf ()
200 
201 #endif
202 
203 
204 #define LOG4CPLUS_MACRO_BODY(logger, logEvent, logLevel) \
205  LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
206  do { \
207  log4cplus::Logger const & _l \
208  = log4cplus::detail::macros_get_logger (logger); \
209  if (LOG4CPLUS_MACRO_LOGLEVEL_PRED ( \
210  _l.isEnabledFor (log4cplus::logLevel), logLevel)) { \
211  LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM (_log4cplus_buf); \
212  _log4cplus_buf << logEvent; \
213  log4cplus::detail::macro_forced_log (_l, \
214  log4cplus::logLevel, _log4cplus_buf.str(), \
215  __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ()); \
216  } \
217  } while (0) \
218  LOG4CPLUS_RESTORE_DOWHILE_WARNING()
219 
220 
221 #define LOG4CPLUS_MACRO_STR_BODY(logger, logEvent, logLevel) \
222  LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
223  do { \
224  log4cplus::Logger const & _l \
225  = log4cplus::detail::macros_get_logger (logger); \
226  if (LOG4CPLUS_MACRO_LOGLEVEL_PRED ( \
227  _l.isEnabledFor (log4cplus::logLevel), logLevel)) { \
228  log4cplus::detail::macro_forced_log (_l, \
229  log4cplus::logLevel, logEvent, \
230  __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ()); \
231  } \
232  } while(0) \
233  LOG4CPLUS_RESTORE_DOWHILE_WARNING()
234 
235 #define LOG4CPLUS_MACRO_FMT_BODY(logger, logLevel, ...) \
236  LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
237  do { \
238  log4cplus::Logger const & _l \
239  = log4cplus::detail::macros_get_logger (logger); \
240  if (LOG4CPLUS_MACRO_LOGLEVEL_PRED ( \
241  _l.isEnabledFor (log4cplus::logLevel), logLevel)) { \
242  LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF (_snpbuf); \
243  log4cplus::tchar const * _logEvent \
244  = _snpbuf.print (__VA_ARGS__); \
245  log4cplus::detail::macro_forced_log (_l, \
246  log4cplus::logLevel, _logEvent, \
247  __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ()); \
248  } \
249  } while(0) \
250  LOG4CPLUS_RESTORE_DOWHILE_WARNING()
251 
258 #if !defined(LOG4CPLUS_DISABLE_TRACE)
259 #define LOG4CPLUS_TRACE_METHOD(logger, logEvent) \
260  log4cplus::TraceLogger _log4cplus_trace_logger(logger, logEvent, \
261  __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ());
262 #define LOG4CPLUS_TRACE(logger, logEvent) \
263  LOG4CPLUS_MACRO_BODY (logger, logEvent, TRACE_LOG_LEVEL)
264 #define LOG4CPLUS_TRACE_STR(logger, logEvent) \
265  LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, TRACE_LOG_LEVEL)
266 #define LOG4CPLUS_TRACE_FMT(logger, ...) \
267  LOG4CPLUS_MACRO_FMT_BODY (logger, TRACE_LOG_LEVEL, __VA_ARGS__)
268 
269 #else
270 #define LOG4CPLUS_TRACE_METHOD(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
271 #define LOG4CPLUS_TRACE(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
272 #define LOG4CPLUS_TRACE_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
273 #define LOG4CPLUS_TRACE_FMT(logger, logFmt, ...) LOG4CPLUS_DOWHILE_NOTHING()
274 
275 #endif
276 
282 #if !defined(LOG4CPLUS_DISABLE_DEBUG)
283 #define LOG4CPLUS_DEBUG(logger, logEvent) \
284  LOG4CPLUS_MACRO_BODY (logger, logEvent, DEBUG_LOG_LEVEL)
285 #define LOG4CPLUS_DEBUG_STR(logger, logEvent) \
286  LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, DEBUG_LOG_LEVEL)
287 #define LOG4CPLUS_DEBUG_FMT(logger, ...) \
288  LOG4CPLUS_MACRO_FMT_BODY (logger, DEBUG_LOG_LEVEL, __VA_ARGS__)
289 
290 #else
291 #define LOG4CPLUS_DEBUG(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
292 #define LOG4CPLUS_DEBUG_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
293 #define LOG4CPLUS_DEBUG_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
294 
295 #endif
296 
302 #if !defined(LOG4CPLUS_DISABLE_INFO)
303 #define LOG4CPLUS_INFO(logger, logEvent) \
304  LOG4CPLUS_MACRO_BODY (logger, logEvent, INFO_LOG_LEVEL)
305 #define LOG4CPLUS_INFO_STR(logger, logEvent) \
306  LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, INFO_LOG_LEVEL)
307 #define LOG4CPLUS_INFO_FMT(logger, ...) \
308  LOG4CPLUS_MACRO_FMT_BODY (logger, INFO_LOG_LEVEL, __VA_ARGS__)
309 
310 #else
311 #define LOG4CPLUS_INFO(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
312 #define LOG4CPLUS_INFO_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
313 #define LOG4CPLUS_INFO_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
314 
315 #endif
316 
322 #if !defined(LOG4CPLUS_DISABLE_WARN)
323 #define LOG4CPLUS_WARN(logger, logEvent) \
324  LOG4CPLUS_MACRO_BODY (logger, logEvent, WARN_LOG_LEVEL)
325 #define LOG4CPLUS_WARN_STR(logger, logEvent) \
326  LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, WARN_LOG_LEVEL)
327 #define LOG4CPLUS_WARN_FMT(logger, ...) \
328  LOG4CPLUS_MACRO_FMT_BODY (logger, WARN_LOG_LEVEL, __VA_ARGS__)
329 
330 #else
331 #define LOG4CPLUS_WARN(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
332 #define LOG4CPLUS_WARN_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
333 #define LOG4CPLUS_WARN_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
334 
335 #endif
336 
342 #if !defined(LOG4CPLUS_DISABLE_ERROR)
343 #define LOG4CPLUS_ERROR(logger, logEvent) \
344  LOG4CPLUS_MACRO_BODY (logger, logEvent, ERROR_LOG_LEVEL)
345 #define LOG4CPLUS_ERROR_STR(logger, logEvent) \
346  LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, ERROR_LOG_LEVEL)
347 #define LOG4CPLUS_ERROR_FMT(logger, ...) \
348  LOG4CPLUS_MACRO_FMT_BODY (logger, ERROR_LOG_LEVEL, __VA_ARGS__)
349 
350 #else
351 #define LOG4CPLUS_ERROR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
352 #define LOG4CPLUS_ERROR_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
353 #define LOG4CPLUS_ERROR_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
354 
355 #endif
356 
362 #if !defined(LOG4CPLUS_DISABLE_FATAL)
363 #define LOG4CPLUS_FATAL(logger, logEvent) \
364  LOG4CPLUS_MACRO_BODY (logger, logEvent, FATAL_LOG_LEVEL)
365 #define LOG4CPLUS_FATAL_STR(logger, logEvent) \
366  LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, FATAL_LOG_LEVEL)
367 #define LOG4CPLUS_FATAL_FMT(logger, ...) \
368  LOG4CPLUS_MACRO_FMT_BODY (logger, FATAL_LOG_LEVEL, __VA_ARGS__)
369 
370 #else
371 #define LOG4CPLUS_FATAL(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
372 #define LOG4CPLUS_FATAL_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
373 #define LOG4CPLUS_FATAL_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
374 
375 #endif
376 
378 #define LOG4CPLUS_ASSERT_STRINGIFY(X) #X
379 
383 #define LOG4CPLUS_ASSERT(logger, condition) \
384  LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
385  do { \
386  if (LOG4CPLUS_UNLIKELY(! (condition))) \
387  LOG4CPLUS_FATAL_STR ((logger), \
388  LOG4CPLUS_TEXT ("failed condition: ") \
389  LOG4CPLUS_TEXT (LOG4CPLUS_ASSERT_STRINGIFY (condition))); \
390  } while (0) \
391  LOG4CPLUS_RESTORE_DOWHILE_WARNING()
392 
393 
394 #endif /* LOG4CPLUS_LOGGING_MACROS_HEADER_ */
LOG4CPLUS_EXPORT log4cplus::helpers::snprintf_buf & get_macro_body_snprintf_buf()
Logger macros_get_logger(Logger const &logger)
Definition: loggingmacros.h:87
std::basic_ostringstream< tchar > tostringstream
Definition: streams.h:42
#define LOG4CPLUS_EXPORT
Definition: win32.h:141
This is the central class in the log4cplus package.
Definition: logger.h:69
LOG4CPLUS_EXPORT void clear_tostringstream(tostringstream &)
LOG4CPLUS_EXPORT void macro_forced_log(log4cplus::Logger const &, log4cplus::LogLevel, log4cplus::tstring const &, char const *, int, char const *)
char tchar
Definition: tchar.h:56
LOG4CPLUS_EXPORT log4cplus::tostringstream & get_macro_body_oss()
std::basic_string< tchar > tstring
Definition: tstring.h:39
This header defines the Logger class and the logging macros.
int LogLevel
Defines the minimum set of priorities recognized by the system, that is FATAL_LOG_LEVEL,...
Definition: loglevel.h:48
static Logger getInstance(const log4cplus::tstring &name)
Retrieve a logger with name name.