CLogConsoleTarget.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "StdInc.h"
  2. #include "CLogConsoleTarget.h"
  3. #include "LogRecord.h"
  4. CColorMapping::CColorMapping()
  5. {
  6. // Set default mappings
  7. auto & levelMap = map[""];
  8. levelMap[ELogLevel::TRACE] = EConsoleTextColor::GRAY;
  9. levelMap[ELogLevel::DEBUG] = EConsoleTextColor::WHITE;
  10. levelMap[ELogLevel::INFO] = EConsoleTextColor::GREEN;
  11. levelMap[ELogLevel::WARN] = EConsoleTextColor::YELLOW;
  12. levelMap[ELogLevel::ERROR] = EConsoleTextColor::RED;
  13. }
  14. void CColorMapping::setColorFor(const CLoggerDomain & domain, ELogLevel::ELogLevel level, EConsoleTextColor::EConsoleTextColor color)
  15. {
  16. if(level == ELogLevel::NOT_SET) throw std::runtime_error("Log level NOT_SET not allowed for configuring the color mapping.");
  17. map[domain.getName()][level] = color;
  18. }
  19. EConsoleTextColor::EConsoleTextColor CColorMapping::getColorFor(const CLoggerDomain & domain, ELogLevel::ELogLevel level) const
  20. {
  21. std::string name = domain.getName();
  22. while(true)
  23. {
  24. const auto & loggerPair = map.find(name);
  25. if(loggerPair != map.end())
  26. {
  27. const auto & levelMap = loggerPair->second;
  28. const auto & levelPair = levelMap.find(level);
  29. if(levelPair != levelMap.end())
  30. {
  31. return levelPair->second;
  32. }
  33. }
  34. CLoggerDomain currentDomain(name);
  35. if(!currentDomain.isGlobalDomain())
  36. {
  37. name = currentDomain.getParent().getName();
  38. }
  39. else
  40. {
  41. break;
  42. }
  43. }
  44. throw std::runtime_error("No color mapping found. Should not happen.");
  45. }
  46. CLogConsoleTarget::CLogConsoleTarget(CConsoleHandler * console) : console(console), threshold(ELogLevel::INFO), coloredOutputEnabled(true)
  47. {
  48. }
  49. void CLogConsoleTarget::write(const LogRecord & record)
  50. {
  51. if(threshold > record.level) return;
  52. std::string message = formatter.format(record);
  53. bool printToStdErr = record.level >= ELogLevel::WARN;
  54. if(console)
  55. {
  56. if(coloredOutputEnabled)
  57. {
  58. console->print(message, colorMapping.getColorFor(record.domain, record.level));
  59. }
  60. else
  61. {
  62. console->print(message, EConsoleTextColor::DEFAULT, printToStdErr);
  63. }
  64. }
  65. else
  66. {
  67. TLockGuard _(mx);
  68. if(printToStdErr)
  69. {
  70. std::cerr << message << std::flush;
  71. }
  72. else
  73. {
  74. std::cout << message << std::flush;
  75. }
  76. }
  77. }
  78. bool CLogConsoleTarget::isColoredOutputEnabled() const
  79. {
  80. return coloredOutputEnabled;
  81. }
  82. void CLogConsoleTarget::setColoredOutputEnabled(bool coloredOutputEnabled)
  83. {
  84. this->coloredOutputEnabled = coloredOutputEnabled;
  85. }
  86. ELogLevel::ELogLevel CLogConsoleTarget::getThreshold() const
  87. {
  88. return threshold;
  89. }
  90. void CLogConsoleTarget::setThreshold(ELogLevel::ELogLevel threshold)
  91. {
  92. this->threshold = threshold;
  93. }
  94. const CLogFormatter & CLogConsoleTarget::getFormatter() const
  95. {
  96. return formatter;
  97. }
  98. void CLogConsoleTarget::setFormatter(const CLogFormatter & formatter)
  99. {
  100. this->formatter = formatter;
  101. }
  102. const CColorMapping & CLogConsoleTarget::getColorMapping() const
  103. {
  104. return colorMapping;
  105. }
  106. void CLogConsoleTarget::setColorMapping(const CColorMapping & colorMapping)
  107. {
  108. this->colorMapping = colorMapping;
  109. }