CBasicLogConfigurator.cpp 4.5 KB

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