loggingmacros.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. // -*- C++ -*-
  2. // Module: Log4CPLUS
  3. // File: loggingmacros.h
  4. // Created: 8/2003
  5. // Author: Tad E. Smith
  6. //
  7. //
  8. // Copyright 2003-2015 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. /** @file
  22. * This header defines the logging macros. */
  23. #ifndef LOG4CPLUS_LOGGING_MACROS_HEADER_
  24. #define LOG4CPLUS_LOGGING_MACROS_HEADER_
  25. #include <log4cplus/config.hxx>
  26. #if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
  27. #pragma once
  28. #endif
  29. #include <log4cplus/streams.h>
  30. #include <log4cplus/logger.h>
  31. #include <log4cplus/helpers/snprintf.h>
  32. #include <log4cplus/tracelogger.h>
  33. #include <sstream>
  34. #include <utility>
  35. #if defined(_MSC_VER)
  36. #define LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
  37. __pragma (warning (push)) \
  38. __pragma (warning (disable:4127))
  39. #define LOG4CPLUS_RESTORE_DOWHILE_WARNING() \
  40. __pragma (warning (pop))
  41. #else
  42. #define LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() /* empty */
  43. #define LOG4CPLUS_RESTORE_DOWHILE_WARNING() /* empty */
  44. #endif
  45. #define LOG4CPLUS_DOWHILE_NOTHING() \
  46. LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
  47. do { } while (0) \
  48. LOG4CPLUS_RESTORE_DOWHILE_WARNING()
  49. #if defined(LOG4CPLUS_DISABLE_FATAL) && !defined(LOG4CPLUS_DISABLE_ERROR)
  50. #define LOG4CPLUS_DISABLE_ERROR
  51. #endif
  52. #if defined(LOG4CPLUS_DISABLE_ERROR) && !defined(LOG4CPLUS_DISABLE_WARN)
  53. #define LOG4CPLUS_DISABLE_WARN
  54. #endif
  55. #if defined(LOG4CPLUS_DISABLE_WARN) && !defined(LOG4CPLUS_DISABLE_INFO)
  56. #define LOG4CPLUS_DISABLE_INFO
  57. #endif
  58. #if defined(LOG4CPLUS_DISABLE_INFO) && !defined(LOG4CPLUS_DISABLE_DEBUG)
  59. #define LOG4CPLUS_DISABLE_DEBUG
  60. #endif
  61. #if defined(LOG4CPLUS_DISABLE_DEBUG) && !defined(LOG4CPLUS_DISABLE_TRACE)
  62. #define LOG4CPLUS_DISABLE_TRACE
  63. #endif
  64. namespace log4cplus
  65. {
  66. namespace detail
  67. {
  68. inline
  69. Logger
  70. macros_get_logger (Logger const & logger)
  71. {
  72. return logger;
  73. }
  74. inline
  75. Logger const &
  76. macros_get_logger (Logger & logger)
  77. {
  78. return logger;
  79. }
  80. #if defined (LOG4CPLUS_HAVE_RVALUE_REFS)
  81. inline
  82. Logger
  83. macros_get_logger (Logger && logger)
  84. {
  85. return std::move (logger);
  86. }
  87. #endif
  88. inline
  89. Logger
  90. macros_get_logger (tstring const & logger)
  91. {
  92. return Logger::getInstance (logger);
  93. }
  94. inline
  95. Logger
  96. macros_get_logger (tchar const * logger)
  97. {
  98. return Logger::getInstance (logger);
  99. }
  100. LOG4CPLUS_EXPORT void clear_tostringstream (tostringstream &);
  101. LOG4CPLUS_EXPORT log4cplus::tostringstream & get_macro_body_oss ();
  102. LOG4CPLUS_EXPORT log4cplus::helpers::snprintf_buf & get_macro_body_snprintf_buf ();
  103. LOG4CPLUS_EXPORT void macro_forced_log (log4cplus::Logger const &,
  104. log4cplus::LogLevel, log4cplus::tstring const &, char const *, int,
  105. char const *);
  106. LOG4CPLUS_EXPORT void macro_forced_log (log4cplus::Logger const &,
  107. log4cplus::LogLevel, log4cplus::tchar const *, char const *, int,
  108. char const *);
  109. } // namespace detail
  110. } // namespace log4cplus
  111. #undef LOG4CPLUS_MACRO_FUNCTION
  112. #define LOG4CPLUS_MACRO_FUNCTION() 0
  113. #if ! defined (LOG4CPLUS_DISABLE_FUNCTION_MACRO)
  114. # if defined (LOG4CPLUS_HAVE_FUNCSIG_MACRO)
  115. # undef LOG4CPLUS_MACRO_FUNCTION
  116. # define LOG4CPLUS_MACRO_FUNCTION() __FUNCSIG__
  117. # elif defined (LOG4CPLUS_HAVE_PRETTY_FUNCTION_MACRO)
  118. # undef LOG4CPLUS_MACRO_FUNCTION
  119. # define LOG4CPLUS_MACRO_FUNCTION() __PRETTY_FUNCTION__
  120. # elif defined (LOG4CPLUS_HAVE_FUNCTION_MACRO)
  121. # undef LOG4CPLUS_MACRO_FUNCTION
  122. # define LOG4CPLUS_MACRO_FUNCTION() __FUNCTION__
  123. # elif defined (LOG4CPLUS_HAVE_FUNC_SYMBOL)
  124. # undef LOG4CPLUS_MACRO_FUNCTION
  125. # define LOG4CPLUS_MACRO_FUNCTION() __func__
  126. # endif
  127. #endif
  128. // Make TRACE and DEBUG log level unlikely and INFO, WARN, ERROR and
  129. // FATAL log level likely.
  130. #define LOG4CPLUS_MACRO_TRACE_LOG_LEVEL(pred) \
  131. LOG4CPLUS_UNLIKELY (pred)
  132. #define LOG4CPLUS_MACRO_DEBUG_LOG_LEVEL(pred) \
  133. LOG4CPLUS_UNLIKELY (pred)
  134. #define LOG4CPLUS_MACRO_INFO_LOG_LEVEL(pred) \
  135. LOG4CPLUS_LIKELY (pred)
  136. #define LOG4CPLUS_MACRO_WARN_LOG_LEVEL(pred) \
  137. LOG4CPLUS_LIKELY (pred)
  138. #define LOG4CPLUS_MACRO_ERROR_LOG_LEVEL(pred) \
  139. LOG4CPLUS_LIKELY (pred)
  140. #define LOG4CPLUS_MACRO_FATAL_LOG_LEVEL(pred) \
  141. LOG4CPLUS_LIKELY (pred)
  142. //! Dispatch to LOG4CPLUS_MACRO_LOGLEVEL_* depending on log level.
  143. #define LOG4CPLUS_MACRO_LOGLEVEL_PRED(pred, logLevel) \
  144. LOG4CPLUS_MACRO_ ## logLevel (pred)
  145. // Either use temporary instances of ostringstream
  146. // and snprintf_buf, or use thread-local instances.
  147. #if defined (LOG4CPLUS_MACRO_DISABLE_TLS)
  148. # define LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM(var) \
  149. log4cplus::tostringstream var
  150. # define LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF(var) \
  151. log4cplus::helpers::snprintf_buf var
  152. #else
  153. # define LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM(var) \
  154. log4cplus::tostringstream & var \
  155. = log4cplus::detail::get_macro_body_oss ()
  156. # define LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF(var) \
  157. log4cplus::helpers::snprintf_buf & var \
  158. = log4cplus::detail::get_macro_body_snprintf_buf ()
  159. #endif
  160. #define LOG4CPLUS_MACRO_BODY(logger, logEvent, logLevel) \
  161. LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
  162. do { \
  163. log4cplus::Logger const & _l \
  164. = log4cplus::detail::macros_get_logger (logger); \
  165. if (LOG4CPLUS_MACRO_LOGLEVEL_PRED ( \
  166. _l.isEnabledFor (log4cplus::logLevel), logLevel)) { \
  167. LOG4CPLUS_MACRO_INSTANTIATE_OSTRINGSTREAM (_log4cplus_buf); \
  168. _log4cplus_buf << logEvent; \
  169. log4cplus::detail::macro_forced_log (_l, \
  170. log4cplus::logLevel, _log4cplus_buf.str(), \
  171. __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ()); \
  172. } \
  173. } while (0) \
  174. LOG4CPLUS_RESTORE_DOWHILE_WARNING()
  175. #define LOG4CPLUS_MACRO_STR_BODY(logger, logEvent, logLevel) \
  176. LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
  177. do { \
  178. log4cplus::Logger const & _l \
  179. = log4cplus::detail::macros_get_logger (logger); \
  180. if (LOG4CPLUS_MACRO_LOGLEVEL_PRED ( \
  181. _l.isEnabledFor (log4cplus::logLevel), logLevel)) { \
  182. log4cplus::detail::macro_forced_log (_l, \
  183. log4cplus::logLevel, logEvent, \
  184. __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ()); \
  185. } \
  186. } while(0) \
  187. LOG4CPLUS_RESTORE_DOWHILE_WARNING()
  188. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  189. #define LOG4CPLUS_MACRO_FMT_BODY(logger, logLevel, ...) \
  190. LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
  191. do { \
  192. log4cplus::Logger const & _l \
  193. = log4cplus::detail::macros_get_logger (logger); \
  194. if (LOG4CPLUS_MACRO_LOGLEVEL_PRED ( \
  195. _l.isEnabledFor (log4cplus::logLevel), logLevel)) { \
  196. LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF (_snpbuf); \
  197. log4cplus::tchar const * _logEvent \
  198. = _snpbuf.print (__VA_ARGS__); \
  199. log4cplus::detail::macro_forced_log (_l, \
  200. log4cplus::logLevel, _logEvent, \
  201. __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ()); \
  202. } \
  203. } while(0) \
  204. LOG4CPLUS_RESTORE_DOWHILE_WARNING()
  205. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  206. #define LOG4CPLUS_MACRO_FMT_BODY(logger, logLevel, logArgs...) \
  207. LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
  208. do { \
  209. log4cplus::Logger const & _l \
  210. = log4cplus::detail::macros_get_logger (logger); \
  211. if (LOG4CPLUS_MACRO_LOGLEVEL_PRED ( \
  212. _l.isEnabledFor (log4cplus::logLevel), logLevel)) { \
  213. LOG4CPLUS_MACRO_INSTANTIATE_SNPRINTF_BUF (_snpbuf); \
  214. log4cplus::tchar const * _logEvent \
  215. = _snpbuf.print (logArgs); \
  216. log4cplus::detail::macro_forced_log (_l, \
  217. log4cplus::logLevel, _logEvent, \
  218. __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ()); \
  219. } \
  220. } while(0) \
  221. LOG4CPLUS_RESTORE_DOWHILE_WARNING()
  222. #endif
  223. /**
  224. * @def LOG4CPLUS_TRACE(logger, logEvent) This macro creates a
  225. * TraceLogger to log a TRACE_LOG_LEVEL message to <code>logger</code>
  226. * upon entry and exiting of a method.
  227. * <code>logEvent</code> will be streamed into an <code>ostream</code>.
  228. */
  229. #if !defined(LOG4CPLUS_DISABLE_TRACE)
  230. #define LOG4CPLUS_TRACE_METHOD(logger, logEvent) \
  231. log4cplus::TraceLogger _log4cplus_trace_logger(logger, logEvent, \
  232. __FILE__, __LINE__, LOG4CPLUS_MACRO_FUNCTION ());
  233. #define LOG4CPLUS_TRACE(logger, logEvent) \
  234. LOG4CPLUS_MACRO_BODY (logger, logEvent, TRACE_LOG_LEVEL)
  235. #define LOG4CPLUS_TRACE_STR(logger, logEvent) \
  236. LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, TRACE_LOG_LEVEL)
  237. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  238. #define LOG4CPLUS_TRACE_FMT(logger, ...) \
  239. LOG4CPLUS_MACRO_FMT_BODY (logger, TRACE_LOG_LEVEL, __VA_ARGS__)
  240. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  241. #define LOG4CPLUS_TRACE_FMT(logger, logArgs...) \
  242. LOG4CPLUS_MACRO_FMT_BODY(logger, TRACE_LOG_LEVEL, logArgs)
  243. #endif
  244. #else
  245. #define LOG4CPLUS_TRACE_METHOD(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  246. #define LOG4CPLUS_TRACE(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  247. #define LOG4CPLUS_TRACE_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  248. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  249. #define LOG4CPLUS_TRACE_FMT(logger, logFmt, ...) LOG4CPLUS_DOWHILE_NOTHING()
  250. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  251. #define LOG4CPLUS_TRACE_FMT(logger, logFmt, logArgs...) LOG4CPLUS_DOWHILE_NOTHING()
  252. #endif
  253. #endif
  254. /**
  255. * @def LOG4CPLUS_DEBUG(logger, logEvent) This macro is used to log a
  256. * DEBUG_LOG_LEVEL message to <code>logger</code>.
  257. * <code>logEvent</code> will be streamed into an <code>ostream</code>.
  258. */
  259. #if !defined(LOG4CPLUS_DISABLE_DEBUG)
  260. #define LOG4CPLUS_DEBUG(logger, logEvent) \
  261. LOG4CPLUS_MACRO_BODY (logger, logEvent, DEBUG_LOG_LEVEL)
  262. #define LOG4CPLUS_DEBUG_STR(logger, logEvent) \
  263. LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, DEBUG_LOG_LEVEL)
  264. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  265. #define LOG4CPLUS_DEBUG_FMT(logger, ...) \
  266. LOG4CPLUS_MACRO_FMT_BODY (logger, DEBUG_LOG_LEVEL, __VA_ARGS__)
  267. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  268. #define LOG4CPLUS_DEBUG_FMT(logger, logArgs...) \
  269. LOG4CPLUS_MACRO_FMT_BODY(logger, DEBUG_LOG_LEVEL, logArgs)
  270. #endif
  271. #else
  272. #define LOG4CPLUS_DEBUG(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  273. #define LOG4CPLUS_DEBUG_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  274. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  275. #define LOG4CPLUS_DEBUG_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
  276. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  277. #define LOG4CPLUS_DEBUG_FMT(logger, logArgs...) LOG4CPLUS_DOWHILE_NOTHING()
  278. #endif
  279. #endif
  280. /**
  281. * @def LOG4CPLUS_INFO(logger, logEvent) This macro is used to log a
  282. * INFO_LOG_LEVEL message to <code>logger</code>.
  283. * <code>logEvent</code> will be streamed into an <code>ostream</code>.
  284. */
  285. #if !defined(LOG4CPLUS_DISABLE_INFO)
  286. #define LOG4CPLUS_INFO(logger, logEvent) \
  287. LOG4CPLUS_MACRO_BODY (logger, logEvent, INFO_LOG_LEVEL)
  288. #define LOG4CPLUS_INFO_STR(logger, logEvent) \
  289. LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, INFO_LOG_LEVEL)
  290. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  291. #define LOG4CPLUS_INFO_FMT(logger, ...) \
  292. LOG4CPLUS_MACRO_FMT_BODY (logger, INFO_LOG_LEVEL, __VA_ARGS__)
  293. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  294. #define LOG4CPLUS_INFO_FMT(logger, logArgs...) \
  295. LOG4CPLUS_MACRO_FMT_BODY(logger, INFO_LOG_LEVEL, logArgs)
  296. #endif
  297. #else
  298. #define LOG4CPLUS_INFO(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  299. #define LOG4CPLUS_INFO_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  300. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  301. #define LOG4CPLUS_INFO_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
  302. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  303. #define LOG4CPLUS_INFO_FMT(logger, logArgs...) LOG4CPLUS_DOWHILE_NOTHING()
  304. #endif
  305. #endif
  306. /**
  307. * @def LOG4CPLUS_WARN(logger, logEvent) This macro is used to log a
  308. * WARN_LOG_LEVEL message to <code>logger</code>.
  309. * <code>logEvent</code> will be streamed into an <code>ostream</code>.
  310. */
  311. #if !defined(LOG4CPLUS_DISABLE_WARN)
  312. #define LOG4CPLUS_WARN(logger, logEvent) \
  313. LOG4CPLUS_MACRO_BODY (logger, logEvent, WARN_LOG_LEVEL)
  314. #define LOG4CPLUS_WARN_STR(logger, logEvent) \
  315. LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, WARN_LOG_LEVEL)
  316. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  317. #define LOG4CPLUS_WARN_FMT(logger, ...) \
  318. LOG4CPLUS_MACRO_FMT_BODY (logger, WARN_LOG_LEVEL, __VA_ARGS__)
  319. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  320. #define LOG4CPLUS_WARN_FMT(logger, logArgs...) \
  321. LOG4CPLUS_MACRO_FMT_BODY(logger, WARN_LOG_LEVEL, logArgs)
  322. #endif
  323. #else
  324. #define LOG4CPLUS_WARN(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  325. #define LOG4CPLUS_WARN_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  326. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  327. #define LOG4CPLUS_WARN_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
  328. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  329. #define LOG4CPLUS_WARN_FMT(logger, logArgs...) LOG4CPLUS_DOWHILE_NOTHING()
  330. #endif
  331. #endif
  332. /**
  333. * @def LOG4CPLUS_ERROR(logger, logEvent) This macro is used to log a
  334. * ERROR_LOG_LEVEL message to <code>logger</code>.
  335. * <code>logEvent</code> will be streamed into an <code>ostream</code>.
  336. */
  337. #if !defined(LOG4CPLUS_DISABLE_ERROR)
  338. #define LOG4CPLUS_ERROR(logger, logEvent) \
  339. LOG4CPLUS_MACRO_BODY (logger, logEvent, ERROR_LOG_LEVEL)
  340. #define LOG4CPLUS_ERROR_STR(logger, logEvent) \
  341. LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, ERROR_LOG_LEVEL)
  342. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  343. #define LOG4CPLUS_ERROR_FMT(logger, ...) \
  344. LOG4CPLUS_MACRO_FMT_BODY (logger, ERROR_LOG_LEVEL, __VA_ARGS__)
  345. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  346. #define LOG4CPLUS_ERROR_FMT(logger, logArgs...) \
  347. LOG4CPLUS_MACRO_FMT_BODY(logger, ERROR_LOG_LEVEL, logArgs)
  348. #endif
  349. #else
  350. #define LOG4CPLUS_ERROR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  351. #define LOG4CPLUS_ERROR_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  352. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  353. #define LOG4CPLUS_ERROR_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
  354. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  355. #define LOG4CPLUS_ERROR_FMT(logger, logArgs...) LOG4CPLUS_DOWHILE_NOTHING()
  356. #endif
  357. #endif
  358. /**
  359. * @def LOG4CPLUS_FATAL(logger, logEvent) This macro is used to log a
  360. * FATAL_LOG_LEVEL message to <code>logger</code>.
  361. * <code>logEvent</code> will be streamed into an <code>ostream</code>.
  362. */
  363. #if !defined(LOG4CPLUS_DISABLE_FATAL)
  364. #define LOG4CPLUS_FATAL(logger, logEvent) \
  365. LOG4CPLUS_MACRO_BODY (logger, logEvent, FATAL_LOG_LEVEL)
  366. #define LOG4CPLUS_FATAL_STR(logger, logEvent) \
  367. LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, FATAL_LOG_LEVEL)
  368. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  369. #define LOG4CPLUS_FATAL_FMT(logger, ...) \
  370. LOG4CPLUS_MACRO_FMT_BODY (logger, FATAL_LOG_LEVEL, __VA_ARGS__)
  371. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  372. #define LOG4CPLUS_FATAL_FMT(logger, logArgs...) \
  373. LOG4CPLUS_MACRO_FMT_BODY(logger, FATAL_LOG_LEVEL, logArgs)
  374. #endif
  375. #else
  376. #define LOG4CPLUS_FATAL(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  377. #define LOG4CPLUS_FATAL_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
  378. #if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
  379. #define LOG4CPLUS_FATAL_FMT(logger, ...) LOG4CPLUS_DOWHILE_NOTHING()
  380. #elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
  381. #define LOG4CPLUS_FATAL_FMT(logger, logArgs...) LOG4CPLUS_DOWHILE_NOTHING()
  382. #endif
  383. #endif
  384. //! Helper macro for LOG4CPLUS_ASSERT() macro.
  385. #define LOG4CPLUS_ASSERT_STRINGIFY(X) #X
  386. //! If the condition given in second parameter evaluates false, this
  387. //! macro logs it using FATAL log level, including the condition's
  388. //! source text.
  389. #define LOG4CPLUS_ASSERT(logger, condition) \
  390. LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
  391. do { \
  392. if (LOG4CPLUS_UNLIKELY(! (condition))) \
  393. LOG4CPLUS_FATAL_STR ((logger), \
  394. LOG4CPLUS_TEXT ("failed condition: ") \
  395. LOG4CPLUS_TEXT (LOG4CPLUS_ASSERT_STRINGIFY (condition))); \
  396. } while (0) \
  397. LOG4CPLUS_RESTORE_DOWHILE_WARNING()
  398. #endif /* LOG4CPLUS_LOGGING_MACROS_HEADER_ */