logger.hpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // This file is part of OpenCV project.
  2. // It is subject to the license terms in the LICENSE file found in the top-level directory
  3. // of this distribution and at http://opencv.org/license.html.
  4. #ifndef OPENCV_LOGGER_HPP
  5. #define OPENCV_LOGGER_HPP
  6. #include <iostream>
  7. #include <sstream>
  8. #include <limits.h> // INT_MAX
  9. #include "logger.defines.hpp"
  10. namespace cv {
  11. namespace utils {
  12. namespace logging {
  13. //! @addtogroup core_logging
  14. //! @{
  15. //! Supported logging levels and their semantic
  16. enum LogLevel {
  17. LOG_LEVEL_SILENT = 0, //!< for using in setLogVevel() call
  18. LOG_LEVEL_FATAL = 1, //!< Fatal (critical) error (unrecoverable internal error)
  19. LOG_LEVEL_ERROR = 2, //!< Error message
  20. LOG_LEVEL_WARNING = 3, //!< Warning message
  21. LOG_LEVEL_INFO = 4, //!< Info message
  22. LOG_LEVEL_DEBUG = 5, //!< Debug message. Disabled in the "Release" build.
  23. LOG_LEVEL_VERBOSE = 6, //!< Verbose (trace) messages. Requires verbosity level. Disabled in the "Release" build.
  24. #ifndef CV_DOXYGEN
  25. ENUM_LOG_LEVEL_FORCE_INT = INT_MAX
  26. #endif
  27. };
  28. /** Set global logging level
  29. @return previous logging level
  30. */
  31. CV_EXPORTS LogLevel setLogLevel(LogLevel logLevel);
  32. /** Get global logging level */
  33. CV_EXPORTS LogLevel getLogLevel();
  34. namespace internal {
  35. /** Write log message */
  36. CV_EXPORTS void writeLogMessage(LogLevel logLevel, const char* message);
  37. } // namespace
  38. /**
  39. * \def CV_LOG_STRIP_LEVEL
  40. *
  41. * Define CV_LOG_STRIP_LEVEL=CV_LOG_LEVEL_[DEBUG|INFO|WARN|ERROR|FATAL|DISABLED] to compile out anything at that and before that logging level
  42. */
  43. #ifndef CV_LOG_STRIP_LEVEL
  44. # if defined NDEBUG
  45. # define CV_LOG_STRIP_LEVEL CV_LOG_LEVEL_DEBUG
  46. # else
  47. # define CV_LOG_STRIP_LEVEL CV_LOG_LEVEL_VERBOSE
  48. # endif
  49. #endif
  50. #define CV_LOG_WITH_TAG(tag, msgLevel, extra_check0, extra_check1, msg_prefix, ...) \
  51. for(;;) { \
  52. extra_check0; \
  53. if (cv::utils::logging::getLogLevel() < msgLevel) break; \
  54. extra_check1; \
  55. std::stringstream ss; ss msg_prefix << __VA_ARGS__; \
  56. cv::utils::logging::internal::writeLogMessage(msgLevel, ss.str().c_str()); \
  57. break; \
  58. }
  59. #define CV_LOG_FATAL(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_FATAL, , , , __VA_ARGS__)
  60. #define CV_LOG_ERROR(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_ERROR, , , , __VA_ARGS__)
  61. #define CV_LOG_WARNING(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_WARNING, , , , __VA_ARGS__)
  62. #define CV_LOG_INFO(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_INFO, , , , __VA_ARGS__)
  63. #define CV_LOG_DEBUG(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_DEBUG, , , , __VA_ARGS__)
  64. #define CV_LOG_VERBOSE(tag, v, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_VERBOSE, , , << "[VERB" << v << ":" << cv::utils::getThreadID() << "] ", __VA_ARGS__)
  65. #if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_INFO
  66. #undef CV_LOG_INFO
  67. #define CV_LOG_INFO(tag, ...)
  68. #endif
  69. #if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_DEBUG
  70. #undef CV_LOG_DEBUG
  71. #define CV_LOG_DEBUG(tag, ...)
  72. #endif
  73. #if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_VERBOSE
  74. #undef CV_LOG_VERBOSE
  75. #define CV_LOG_VERBOSE(tag, v, ...)
  76. #endif
  77. //! @cond IGNORED
  78. #define CV__LOG_ONCE_CHECK_PRE \
  79. static bool _cv_log_once_ ## __LINE__ = false; \
  80. if (_cv_log_once_ ## __LINE__) break;
  81. #define CV__LOG_ONCE_CHECK_POST \
  82. _cv_log_once_ ## __LINE__ = true;
  83. #define CV__LOG_IF_CHECK(logging_cond) \
  84. if (!(logging_cond)) break;
  85. //! @endcond
  86. // CV_LOG_ONCE_XXX macros
  87. #define CV_LOG_ONCE_ERROR(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_ERROR, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, , __VA_ARGS__)
  88. #define CV_LOG_ONCE_WARNING(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_WARNING, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, , __VA_ARGS__)
  89. #define CV_LOG_ONCE_INFO(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_INFO, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, , __VA_ARGS__)
  90. #define CV_LOG_ONCE_DEBUG(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_DEBUG, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, , __VA_ARGS__)
  91. #define CV_LOG_ONCE_VERBOSE(tag, v, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_VERBOSE, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, << "[VERB" << v << ":" << cv::utils::getThreadID() << "] ", __VA_ARGS__)
  92. #if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_INFO
  93. #undef CV_LOG_ONCE_INFO
  94. #define CV_LOG_ONCE_INFO(tag, ...)
  95. #endif
  96. #if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_DEBUG
  97. #undef CV_LOG_ONCE_DEBUG
  98. #define CV_LOG_ONCE_DEBUG(tag, ...)
  99. #endif
  100. #if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_VERBOSE
  101. #undef CV_LOG_ONCE_VERBOSE
  102. #define CV_LOG_ONCE_VERBOSE(tag, v, ...)
  103. #endif
  104. // CV_LOG_IF_XXX macros
  105. #define CV_LOG_IF_FATAL(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_FATAL, , CV__LOG_IF_CHECK(logging_cond), , __VA_ARGS__)
  106. #define CV_LOG_IF_ERROR(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_ERROR, , CV__LOG_IF_CHECK(logging_cond), , __VA_ARGS__)
  107. #define CV_LOG_IF_WARNING(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_WARNING, , CV__LOG_IF_CHECK(logging_cond), , __VA_ARGS__)
  108. #define CV_LOG_IF_INFO(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_INFO, , CV__LOG_IF_CHECK(logging_cond), , __VA_ARGS__)
  109. #define CV_LOG_IF_DEBUG(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_DEBUG, , CV__LOG_IF_CHECK(logging_cond), , __VA_ARGS__)
  110. #define CV_LOG_IF_VERBOSE(tag, v, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_VERBOSE, , CV__LOG_IF_CHECK(logging_cond), << "[VERB" << v << ":" << cv::utils::getThreadID() << "] ", __VA_ARGS__)
  111. #if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_INFO
  112. #undef CV_LOG_IF_INFO
  113. #define CV_LOG_IF_INFO(tag, logging_cond, ...)
  114. #endif
  115. #if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_DEBUG
  116. #undef CV_LOG_IF_DEBUG
  117. #define CV_LOG_IF_DEBUG(tag, logging_cond, ...)
  118. #endif
  119. #if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_VERBOSE
  120. #undef CV_LOG_IF_VERBOSE
  121. #define CV_LOG_IF_VERBOSE(tag, v, logging_cond, ...)
  122. #endif
  123. //! @}
  124. }}} // namespace
  125. #endif // OPENCV_LOGGER_HPP