CBasicLogConfigurator.cpp 4.7 KB

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