CBasicLogConfigurator.cpp 4.6 KB

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