CBasicLogConfigurator.cpp 5.0 KB

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