log4cplus  2.0.0
loggingmacros.h
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 // Module:  Log4CPLUS
00003 // File:    loggingmacros.h
00004 // Created: 8/2003
00005 // Author:  Tad E. Smith
00006 //
00007 //
00008 // Copyright 2003-2015 Tad E. Smith
00009 //
00010 // Licensed under the Apache License, Version 2.0 (the "License");
00011 // you may not use this file except in compliance with the License.
00012 // You may obtain a copy of the License at
00013 //
00014 //     http://www.apache.org/licenses/LICENSE-2.0
00015 //
00016 // Unless required by applicable law or agreed to in writing, software
00017 // distributed under the License is distributed on an "AS IS" BASIS,
00018 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00019 // See the License for the specific language governing permissions and
00020 // limitations under the License.
00021 
00025 #ifndef LOG4CPLUS_LOGGING_MACROS_HEADER_
00026 #define LOG4CPLUS_LOGGING_MACROS_HEADER_
00027 
00028 #include <log4cplus/config.hxx>
00029 
00030 #if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
00031 #pragma once
00032 #endif
00033 
00034 #include <log4cplus/streams.h>
00035 #include <log4cplus/logger.h>
00036 #include <log4cplus/helpers/snprintf.h>
00037 #include <log4cplus/tracelogger.h>
00038 #include <sstream>
00039 #include <utility>
00040 
00041 
00042 #if defined(_MSC_VER)
00043 #define LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()  \
00044     __pragma (warning (push))                 \
00045     __pragma (warning (disable:4127))
00046 
00047 #define LOG4CPLUS_RESTORE_DOWHILE_WARNING()   \
00048     __pragma (warning (pop))
00049 
00050 #else
00051 #define LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() /* empty */
00052 #define LOG4CPLUS_RESTORE_DOWHILE_WARNING() /* empty */
00053 
00054 #endif
00055 
00056 #define LOG4CPLUS_DOWHILE_NOTHING()                 \
00057     LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()            \
00058     do { } while (0)                                \
00059     LOG4CPLUS_RESTORE_DOWHILE_WARNING()
00060 
00061 #if defined(LOG4CPLUS_DISABLE_FATAL) && !defined(LOG4CPLUS_DISABLE_ERROR)
00062 #define LOG4CPLUS_DISABLE_ERROR
00063 #endif
00064 #if defined(LOG4CPLUS_DISABLE_ERROR) && !defined(LOG4CPLUS_DISABLE_WARN)
00065 #define LOG4CPLUS_DISABLE_WARN
00066 #endif
00067 #if defined(LOG4CPLUS_DISABLE_WARN) && !defined(LOG4CPLUS_DISABLE_INFO)
00068 #define LOG4CPLUS_DISABLE_INFO
00069 #endif
00070 #if defined(LOG4CPLUS_DISABLE_INFO) && !defined(LOG4CPLUS_DISABLE_DEBUG)
00071 #define LOG4CPLUS_DISABLE_DEBUG
00072 #endif
00073 #if defined(LOG4CPLUS_DISABLE_DEBUG) && !defined(LOG4CPLUS_DISABLE_TRACE)
00074 #define LOG4CPLUS_DISABLE_TRACE
00075 #endif
00076 
00077 
00078 namespace log4cplus
00079 {
00080 
00081 namespace detail
00082 {
00083 
00084 
00085 inline
00086 Logger
00087 macros_get_logger (Logger const & logger)
00088 {
00089     return logger;
00090 }
00091 
00092 
00093 inline
00094 Logger const &
00095 macros_get_logger (Logger & logger)
00096 {
00097     return logger;
00098 }
00099 
00100 
00101 inline
00102 Logger
00103 macros_get_logger (Logger && logger)
00104 {
00105     return std::move (logger);
00106 }
00107 
00108 inline
00109 Logger
00110 macros_get_logger (tstring const & logger)
00111 {
00112     return Logger::getInstance (logger);
00113 }
00114 
00115 
00116 inline
00117 Logger
00118 macros_get_logger (tchar const * logger)
00119 {
00120     return Logger::getInstance (logger);
00121 }
00122 
00123 
00124 LOG4CPLUS_EXPORT void clear_tostringstream (tostringstream &);
00125 
00126 
00127 LOG4CPLUS_EXPORT log4cplus::tostringstream & get_macro_body_oss ();
00128 LOG4CPLUS_EXPORT log4cplus::helpers::snprintf_buf & get_macro_body_snprintf_buf ();
00129 LOG4CPLUS_EXPORT void macro_forced_log (log4cplus::Logger const &,
00130     log4cplus::LogLevel, log4cplus::tstring const &, char const *, int,
00131     char const *);
00132 LOG4CPLUS_EXPORT void macro_forced_log (log4cplus::Logger const &,
00133     log4cplus::LogLevel, log4cplus::tchar const *, char const *, int,
00134     char const *);
00135 
00136 
00137 
00138 } // namespace detail
00139 
00140 } // namespace log4cplus
00141 
00142 
00143 #undef LOG4CPLUS_MACRO_FUNCTION
00144 #define LOG4CPLUS_MACRO_FUNCTION() 0
00145 #if ! defined (LOG4CPLUS_DISABLE_FUNCTION_MACRO)
00146 #  if defined (LOG4CPLUS_HAVE_FUNCSIG_MACRO)
00147 #    undef LOG4CPLUS_MACRO_FUNCTION
00148 #    define LOG4CPLUS_MACRO_FUNCTION() __FUNCSIG__
00149 #  elif defined (LOG4CPLUS_HAVE_PRETTY_FUNCTION_MACRO)
00150 #    undef LOG4CPLUS_MACRO_FUNCTION
00151 #    define LOG4CPLUS_MACRO_FUNCTION() __PRETTY_FUNCTION__
00152 #  elif defined (LOG4CPLUS_HAVE_FUNCTION_MACRO)
00153 #    undef LOG4CPLUS_MACRO_FUNCTION
00154 #    define LOG4CPLUS_MACRO_FUNCTION() __FUNCTION__
00155 #  elif defined (LOG4CPLUS_HAVE_FUNC_SYMBOL)
00156 #    undef LOG4CPLUS_MACRO_FUNCTION
00157 #    define LOG4CPLUS_MACRO_FUNCTION() __func__
00158 #  endif
00159 #endif
00160 
00161 
00162 // Make TRACE and DEBUG log level unlikely and INFO, WARN, ERROR and
00163 // FATAL log level likely.
00164 #define LOG4CPLUS_MACRO_TRACE_LOG_LEVEL(pred) \
00165     LOG4CPLUS_UNLIKELY (pred)
00166 #define LOG4CPLUS_MACRO_DEBUG_LOG_LEVEL(pred) \
00167     LOG4CPLUS_UNLIKELY (pred)
00168 #define LOG4CPLUS_MACRO_INFO_LOG_LEVEL(pred) \
00169     LOG4CPLUS_LIKELY (pred)
00170 #define LOG4CPLUS_MACRO_WARN_LOG_LEVEL(pred) \
00171     LOG4CPLUS_LIKELY (pred)
00172 #define LOG4CPLUS_MACRO_ERROR_LOG_LEVEL(pred) \
00173     LOG4CPLUS_LIKELY (pred)
00174 #define LOG4CPLUS_MACRO_FATAL_LOG_LEVEL(pred) \
00175     LOG4CPLUS_LIKELY (pred)
00176 
00177 
00179 #define LOG4CPLUS_MACRO_LOGLEVEL_PRED(pred, logLevel)    \
00180     LOG4CPLUS_MACRO_ ## logLevel (pred)
00181 
00182 
00183 // Either use temporary instances of ostringstream
00184 // and snprintf_buf, or use thread-local instances.
00185 #if defined (LOG4CPLUS_MACRO_DISABLE_TLS)
00186 #  define LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM(var)    \
00187     log4cplus::tostringstream var
00188 
00189 #  define LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF(var)     \
00190     log4cplus::helpers::snprintf_buf var
00191 
00192 #else
00193 #  define LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM(var)    \
00194     log4cplus::tostringstream & var                         \
00195         = log4cplus::detail::get_macro_body_oss ()
00196 
00197 #  define LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF(var)     \
00198     log4cplus::helpers::snprintf_buf & var                  \
00199         = log4cplus::detail::get_macro_body_snprintf_buf ()
00200 
00201 #endif
00202 
00203 
00204 #define LOG4CPLUS_MACRO_BODY(logger, logEvent, logLevel)                \
00205     LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()                                \
00206     do {                                                                \
00207         log4cplus::Logger const & _l                                    \
00208             = log4cplus::detail::macros_get_logger (logger);            \
00209         if (LOG4CPLUS_MACRO_LOGLEVEL_PRED (                             \
00210                 _l.isEnabledFor (log4cplus::logLevel), logLevel)) {     \
00211             LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM (_log4cplus_buf); \
00212             _log4cplus_buf << logEvent;                                 \
00213             log4cplus::detail::macro_forced_log (_l,                    \
00214                 log4cplus::logLevel, _log4cplus_buf.str(),              \
00215                 __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ());       \
00216         }                                                               \
00217     } while (0)                                                         \
00218     LOG4CPLUS_RESTORE_DOWHILE_WARNING()
00219 
00220 
00221 #define LOG4CPLUS_MACRO_STR_BODY(logger, logEvent, logLevel)            \
00222     LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()                                \
00223     do {                                                                \
00224         log4cplus::Logger const & _l                                    \
00225             = log4cplus::detail::macros_get_logger (logger);            \
00226         if (LOG4CPLUS_MACRO_LOGLEVEL_PRED (                             \
00227                 _l.isEnabledFor (log4cplus::logLevel), logLevel)) {     \
00228             log4cplus::detail::macro_forced_log (_l,                    \
00229                 log4cplus::logLevel, logEvent,                          \
00230                 __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ());       \
00231         }                                                               \
00232     } while(0)                                                          \
00233     LOG4CPLUS_RESTORE_DOWHILE_WARNING()
00234 
00235 #define LOG4CPLUS_MACRO_FMT_BODY(logger, logLevel, ...)                 \
00236     LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()                                \
00237     do {                                                                \
00238         log4cplus::Logger const & _l                                    \
00239             = log4cplus::detail::macros_get_logger (logger);            \
00240         if (LOG4CPLUS_MACRO_LOGLEVEL_PRED (                             \
00241                 _l.isEnabledFor (log4cplus::logLevel), logLevel)) {     \
00242             LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF (_snpbuf);         \
00243             log4cplus::tchar const * _logEvent                          \
00244                 = _snpbuf.print (__VA_ARGS__);                          \
00245             log4cplus::detail::macro_forced_log (_l,                    \
00246                 log4cplus::logLevel, _logEvent,                         \
00247                 __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ());       \
00248         }                                                               \
00249     } while(0)                                                          \
00250     LOG4CPLUS_RESTORE_DOWHILE_WARNING()
00251 
00258 #if !defined(LOG4CPLUS_DISABLE_TRACE)
00259 #define LOG4CPLUS_TRACE_METHOD(logger, logEvent)                        \
00260     log4cplus::TraceLogger _log4cplus_trace_logger(logger, logEvent,    \
00261         __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ());
00262 #define LOG4CPLUS_TRACE(logger, logEvent)                               \
00263     LOG4CPLUS_MACRO_BODY (logger, logEvent, TRACE_LOG_LEVEL)
00264 #define LOG4CPLUS_TRACE_STR(logger, logEvent)                           \
00265     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, TRACE_LOG_LEVEL)
00266 #define LOG4CPLUS_TRACE_FMT(logger, ...)                                \
00267     LOG4CPLUS_MACRO_FMT_BODY (logger, TRACE_LOG_LEVEL, __VA_ARGS__)
00268 
00269 #else
00270 #define LOG4CPLUS_TRACE_METHOD(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00271 #define LOG4CPLUS_TRACE(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00272 #define LOG4CPLUS_TRACE_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00273 #define LOG4CPLUS_TRACE_FMT(logger, logFmt, ...) LOG4CPLUS_DOWHILE_NOTHING()
00274 
00275 #endif
00276 
00282 #if !defined(LOG4CPLUS_DISABLE_DEBUG)
00283 #define LOG4CPLUS_DEBUG(logger, logEvent)                               \
00284     LOG4CPLUS_MACRO_BODY (logger, logEvent, DEBUG_LOG_LEVEL)
00285 #define LOG4CPLUS_DEBUG_STR(logger, logEvent)                           \
00286     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, DEBUG_LOG_LEVEL)
00287 #define LOG4CPLUS_DEBUG_FMT(logger, ...)                                \
00288     LOG4CPLUS_MACRO_FMT_BODY (logger, DEBUG_LOG_LEVEL, __VA_ARGS__)
00289 
00290 #else
00291 #define LOG4CPLUS_DEBUG(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00292 #define LOG4CPLUS_DEBUG_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00293 #define LOG4CPLUS_DEBUG_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
00294 
00295 #endif
00296 
00302 #if !defined(LOG4CPLUS_DISABLE_INFO)
00303 #define LOG4CPLUS_INFO(logger, logEvent)                                \
00304     LOG4CPLUS_MACRO_BODY (logger, logEvent, INFO_LOG_LEVEL)
00305 #define LOG4CPLUS_INFO_STR(logger, logEvent)                            \
00306     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, INFO_LOG_LEVEL)
00307 #define LOG4CPLUS_INFO_FMT(logger, ...)                                 \
00308     LOG4CPLUS_MACRO_FMT_BODY (logger, INFO_LOG_LEVEL, __VA_ARGS__)
00309 
00310 #else
00311 #define LOG4CPLUS_INFO(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00312 #define LOG4CPLUS_INFO_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00313 #define LOG4CPLUS_INFO_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
00314 
00315 #endif
00316 
00322 #if !defined(LOG4CPLUS_DISABLE_WARN)
00323 #define LOG4CPLUS_WARN(logger, logEvent)                                \
00324     LOG4CPLUS_MACRO_BODY (logger, logEvent, WARN_LOG_LEVEL)
00325 #define LOG4CPLUS_WARN_STR(logger, logEvent)                            \
00326     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, WARN_LOG_LEVEL)
00327 #define LOG4CPLUS_WARN_FMT(logger, ...)                                 \
00328     LOG4CPLUS_MACRO_FMT_BODY (logger, WARN_LOG_LEVEL, __VA_ARGS__)
00329 
00330 #else
00331 #define LOG4CPLUS_WARN(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00332 #define LOG4CPLUS_WARN_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00333 #define LOG4CPLUS_WARN_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
00334 
00335 #endif
00336 
00342 #if !defined(LOG4CPLUS_DISABLE_ERROR)
00343 #define LOG4CPLUS_ERROR(logger, logEvent)                               \
00344     LOG4CPLUS_MACRO_BODY (logger, logEvent, ERROR_LOG_LEVEL)
00345 #define LOG4CPLUS_ERROR_STR(logger, logEvent)                           \
00346     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, ERROR_LOG_LEVEL)
00347 #define LOG4CPLUS_ERROR_FMT(logger, ...)                                \
00348     LOG4CPLUS_MACRO_FMT_BODY (logger, ERROR_LOG_LEVEL, __VA_ARGS__)
00349 
00350 #else
00351 #define LOG4CPLUS_ERROR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00352 #define LOG4CPLUS_ERROR_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00353 #define LOG4CPLUS_ERROR_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
00354 
00355 #endif
00356 
00362 #if !defined(LOG4CPLUS_DISABLE_FATAL)
00363 #define LOG4CPLUS_FATAL(logger, logEvent)                               \
00364     LOG4CPLUS_MACRO_BODY (logger, logEvent, FATAL_LOG_LEVEL)
00365 #define LOG4CPLUS_FATAL_STR(logger, logEvent)                           \
00366     LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, FATAL_LOG_LEVEL)
00367 #define LOG4CPLUS_FATAL_FMT(logger, ...)                                \
00368     LOG4CPLUS_MACRO_FMT_BODY (logger, FATAL_LOG_LEVEL, __VA_ARGS__)
00369 
00370 #else
00371 #define LOG4CPLUS_FATAL(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00372 #define LOG4CPLUS_FATAL_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
00373 #define LOG4CPLUS_FATAL_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
00374 
00375 #endif
00376 
00378 #define LOG4CPLUS_ASSERT_STRINGIFY(X) #X
00379 
00383 #define LOG4CPLUS_ASSERT(logger, condition)                             \
00384     LOG4CPLUS_SUPPRESS_DOWHILE_WARNING()                                \
00385     do {                                                                \
00386         if (LOG4CPLUS_UNLIKELY(! (condition)))                          \
00387             LOG4CPLUS_FATAL_STR ((logger),                              \
00388                 LOG4CPLUS_TEXT ("failed condition: ")                   \
00389                 LOG4CPLUS_TEXT (LOG4CPLUS_ASSERT_STRINGIFY (condition))); \
00390     } while (0)                                                         \
00391     LOG4CPLUS_RESTORE_DOWHILE_WARNING()
00392 
00393 
00394 #endif /* LOG4CPLUS_LOGGING_MACROS_HEADER_ */