log4cplus
2.0.0
|
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_ */