| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 | 
							- /*
 
-  * CBasicLogConfigurator.cpp, part of VCMI engine
 
-  *
 
-  * Authors: listed in file AUTHORS in main folder
 
-  *
 
-  * License: GNU General Public License v2.0 or later
 
-  * Full text of license available in license.txt file, in main folder
 
-  *
 
-  */
 
- #include "StdInc.h"
 
- #include "CBasicLogConfigurator.h"
 
- #include "CLogger.h"
 
- #include "../CConfigHandler.h"
 
- VCMI_LIB_NAMESPACE_BEGIN
 
- CBasicLogConfigurator::CBasicLogConfigurator(boost::filesystem::path filePath, CConsoleHandler * const console) :
 
- 	filePath(std::move(filePath)), console(console), appendToLogFile(false) {}
 
- void CBasicLogConfigurator::configureDefault()
 
- {
 
- 	CLogger::getGlobalLogger()->addTarget(std::make_unique<CLogConsoleTarget>(console));
 
- 	CLogger::getGlobalLogger()->addTarget(std::make_unique<CLogFileTarget>(filePath, appendToLogFile));
 
- 	appendToLogFile = true;
 
- }
 
- void CBasicLogConfigurator::configure()
 
- {
 
- 	try
 
- 	{
 
- 		const JsonNode & loggingNode = settings["logging"];
 
- 		if(loggingNode.isNull())
 
- 			throw std::runtime_error("Settings haven't been loaded.");
 
- 		// Configure loggers
 
- 		const JsonNode & loggers = loggingNode["loggers"];
 
- 		if(!loggers.isNull())
 
- 		{
 
- 			for(const auto & loggerNode : loggers.Vector())
 
- 			{
 
- 				// Get logger
 
- 				std::string name = loggerNode["domain"].String();
 
- 				CLogger * logger = CLogger::getLogger(CLoggerDomain(name));
 
- 				// Set log level
 
- 				std::string level = loggerNode["level"].String();
 
- 				logger->setLevel(getLogLevel(level));
 
- 				logGlobal->debug("Set log level %s => %d", name, level);
 
- 			}
 
- 		}
 
- 		CLogger::getGlobalLogger()->clearTargets();
 
- 		// Add console target
 
- 		auto consoleTarget = std::make_unique<CLogConsoleTarget>(console);
 
- 		const JsonNode & consoleNode = loggingNode["console"];
 
- 		if(!consoleNode.isNull())
 
- 		{
 
- 			const JsonNode & consoleFormatNode = consoleNode["format"];
 
- 			if(!consoleFormatNode.isNull()) consoleTarget->setFormatter(CLogFormatter(consoleFormatNode.String()));
 
- 			const JsonNode & consoleThresholdNode = consoleNode["threshold"];
 
- 			if(!consoleThresholdNode.isNull()) consoleTarget->setThreshold(getLogLevel(consoleThresholdNode.String()));
 
- 			const JsonNode & coloredConsoleEnabledNode = consoleNode["coloredOutputEnabled"];
 
- 			consoleTarget->setColoredOutputEnabled(coloredConsoleEnabledNode.Bool());
 
- 			CColorMapping colorMapping;
 
- 			const JsonNode & colorMappingNode = consoleNode["colorMapping"];
 
- 			if(!colorMappingNode.isNull())
 
- 			{
 
- 				for(const JsonNode & mappingNode : colorMappingNode.Vector())
 
- 				{
 
- 					std::string domain = mappingNode["domain"].String();
 
- 					std::string level = mappingNode["level"].String();
 
- 					std::string color = mappingNode["color"].String();
 
- 					colorMapping.setColorFor(CLoggerDomain(domain), getLogLevel(level), getConsoleColor(color));
 
- 				}
 
- 			}
 
- 			consoleTarget->setColorMapping(colorMapping);
 
- 		}
 
- 		CLogger::getGlobalLogger()->addTarget(std::move(consoleTarget));
 
- 		// Add file target
 
- 		auto fileTarget = std::make_unique<CLogFileTarget>(filePath, appendToLogFile);
 
- 		const JsonNode & fileNode = loggingNode["file"];
 
- 		if(!fileNode.isNull())
 
- 		{
 
- 			const JsonNode & fileFormatNode = fileNode["format"];
 
- 			if(!fileFormatNode.isNull()) fileTarget->setFormatter(CLogFormatter(fileFormatNode.String()));
 
- 		}
 
- 		CLogger::getGlobalLogger()->addTarget(std::move(fileTarget));
 
- 		appendToLogFile = true;
 
- 	}
 
- 	catch(const std::exception & e)
 
- 	{
 
- 		logGlobal->error("Could not initialize the logging system due to configuration error/s."
 
- 								     "The logging system can be in a corrupted state. %s", e.what());
 
- 	}
 
- 	logGlobal->info("Initialized logging system based on settings successfully.");
 
- 	for (auto& domain : CLogManager::get().getRegisteredDomains())
 
- 	{
 
- 		logGlobal->info("[log level] %s => %s", domain,
 
-                     ELogLevel::to_string(CLogger::getLogger(CLoggerDomain(domain))->getLevel()));
 
- 	}
 
- }
 
- ELogLevel::ELogLevel CBasicLogConfigurator::getLogLevel(const std::string & level)
 
- {
 
- 	static const std::map<std::string, ELogLevel::ELogLevel> levelMap =
 
- 	{
 
- 		{"trace", ELogLevel::TRACE},
 
- 		{"debug", ELogLevel::DEBUG},
 
- 		{"info", ELogLevel::INFO},
 
- 		{"warn", ELogLevel::WARN},
 
- 		{"error", ELogLevel::ERROR},
 
- 	};
 
- 	const auto & levelPair = levelMap.find(level);
 
- 	if(levelPair != levelMap.end())
 
- 		return levelPair->second;
 
- 	else
 
- 		throw std::runtime_error("Log level " + level + " unknown.");
 
- }
 
- EConsoleTextColor::EConsoleTextColor CBasicLogConfigurator::getConsoleColor(const std::string & colorName)
 
- {
 
- 	static const std::map<std::string, EConsoleTextColor::EConsoleTextColor> colorMap =
 
- 	{
 
- 		{"default", EConsoleTextColor::DEFAULT},
 
- 		{"green", EConsoleTextColor::GREEN},
 
- 		{"red", EConsoleTextColor::RED},
 
- 		{"magenta", EConsoleTextColor::MAGENTA},
 
- 		{"yellow", EConsoleTextColor::YELLOW},
 
- 		{"white", EConsoleTextColor::WHITE},
 
- 		{"gray", EConsoleTextColor::GRAY},
 
- 		{"teal", EConsoleTextColor::TEAL},
 
- 	};
 
- 	const auto & colorPair = colorMap.find(colorName);
 
- 	if(colorPair != colorMap.end())
 
- 		return colorPair->second;
 
- 	else
 
- 		throw std::runtime_error("Color " + colorName + " unknown.");
 
- }
 
- void CBasicLogConfigurator::deconfigure()
 
- {
 
- 	auto l = CLogger::getGlobalLogger();
 
- 	if(l != nullptr)
 
- 		l->clearTargets();
 
- 	appendToLogFile = true;
 
- }
 
- VCMI_LIB_NAMESPACE_END
 
 
  |