CBasicLogConfigurator.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "StdInc.h"
  2. #include "CBasicLogConfigurator.h"
  3. #include "../CConfigHandler.h"
  4. CBasicLogConfigurator::CBasicLogConfigurator(const std::string & filePath, CConsoleHandler * console) : filePath(filePath), console(console), appendToLogFile(false)
  5. {
  6. }
  7. void CBasicLogConfigurator::configureDefault()
  8. {
  9. CLogger::getGlobalLogger()->addTarget(make_unique<CLogConsoleTarget>(console));
  10. CLogger::getGlobalLogger()->addTarget(make_unique<CLogFileTarget>(filePath, appendToLogFile));
  11. appendToLogFile = true;
  12. }
  13. void CBasicLogConfigurator::configure()
  14. {
  15. try
  16. {
  17. const JsonNode & loggingNode = settings["logging"];
  18. if(loggingNode.isNull()) throw std::runtime_error("Settings haven't been loaded.");
  19. // Configure loggers
  20. const JsonNode & loggers = loggingNode["loggers"];
  21. if(!loggers.isNull())
  22. {
  23. BOOST_FOREACH(auto & loggerNode, loggers.Vector())
  24. {
  25. // Get logger
  26. std::string name = loggerNode["domain"].String();
  27. CLogger * logger = CLogger::getLogger(CLoggerDomain(name));
  28. // Set log level
  29. logger->setLevel(getLogLevel(loggerNode["level"].String()));
  30. }
  31. }
  32. CLogger::getGlobalLogger()->clearTargets();
  33. // Add console target
  34. auto consoleTarget = make_unique<CLogConsoleTarget>(console);
  35. const JsonNode & consoleNode = loggingNode["console"];
  36. if(!consoleNode.isNull())
  37. {
  38. const JsonNode & consoleFormatNode = consoleNode["format"];
  39. if(!consoleFormatNode.isNull()) consoleTarget->setFormatter(CLogFormatter(consoleFormatNode.String()));
  40. const JsonNode & consoleThresholdNode = consoleNode["threshold"];
  41. if(!consoleThresholdNode.isNull()) consoleTarget->setThreshold(getLogLevel(consoleThresholdNode.String()));
  42. const JsonNode & coloredConsoleEnabledNode = consoleNode["coloredOutputEnabled"];
  43. consoleTarget->setColoredOutputEnabled(coloredConsoleEnabledNode.Bool());
  44. CColorMapping colorMapping;
  45. const JsonNode & colorMappingNode = consoleNode["colorMapping"];
  46. if(!colorMappingNode.isNull())
  47. {
  48. BOOST_FOREACH(const JsonNode & mappingNode, colorMappingNode.Vector())
  49. {
  50. std::string domain = mappingNode["domain"].String();
  51. std::string level = mappingNode["level"].String();
  52. std::string color = mappingNode["color"].String();
  53. colorMapping.setColorFor(CLoggerDomain(domain), getLogLevel(level), getConsoleColor(color));
  54. }
  55. }
  56. consoleTarget->setColorMapping(colorMapping);
  57. }
  58. CLogger::getGlobalLogger()->addTarget(std::move(consoleTarget));
  59. // Add file target
  60. auto fileTarget = make_unique<CLogFileTarget>(filePath, appendToLogFile);
  61. const JsonNode & fileNode = loggingNode["file"];
  62. if(!fileNode.isNull())
  63. {
  64. const JsonNode & fileFormatNode = fileNode["format"];
  65. if(!fileFormatNode.isNull()) fileTarget->setFormatter(CLogFormatter(fileFormatNode.String()));
  66. }
  67. CLogger::getGlobalLogger()->addTarget(std::move(fileTarget));
  68. appendToLogFile = true;
  69. }
  70. catch(const std::exception & e)
  71. {
  72. logGlobal->errorStream() << "Could not initialize the logging system due to configuration error/s. The logging system can be in a corrupted state. " << e.what();
  73. }
  74. logGlobal->infoStream() << "Initialized logging system based on settings successfully.";
  75. }
  76. ELogLevel::ELogLevel CBasicLogConfigurator::getLogLevel(const std::string & level) const
  77. {
  78. static const std::map<std::string, ELogLevel::ELogLevel> levelMap = boost::assign::map_list_of
  79. ("trace", ELogLevel::TRACE)
  80. ("debug", ELogLevel::DEBUG)
  81. ("info", ELogLevel::INFO)
  82. ("warn", ELogLevel::WARN)
  83. ("error", ELogLevel::ERROR);
  84. const auto & levelPair = levelMap.find(level);
  85. if(levelPair != levelMap.end())
  86. {
  87. return levelPair->second;
  88. }
  89. else
  90. {
  91. throw std::runtime_error("Log level " + level + " unknown.");
  92. }
  93. }
  94. EConsoleTextColor::EConsoleTextColor CBasicLogConfigurator::getConsoleColor(const std::string & colorName) const
  95. {
  96. static const std::map<std::string, EConsoleTextColor::EConsoleTextColor> colorMap = boost::assign::map_list_of
  97. ("default", EConsoleTextColor::DEFAULT)
  98. ("green", EConsoleTextColor::GREEN)
  99. ("red", EConsoleTextColor::RED)
  100. ("magenta", EConsoleTextColor::MAGENTA)
  101. ("yellow", EConsoleTextColor::YELLOW)
  102. ("white", EConsoleTextColor::WHITE)
  103. ("gray", EConsoleTextColor::GRAY)
  104. ("teal", EConsoleTextColor::TEAL);
  105. const auto & colorPair = colorMap.find(colorName);
  106. if(colorPair != colorMap.end())
  107. {
  108. return colorPair->second;
  109. }
  110. else
  111. {
  112. throw std::runtime_error("Color " + colorName + " unknown.");
  113. }
  114. }