CLoggerDomain CLoggerDomain::getParent() const { if(isGlobalDomain()) return *this; const size_t pos = name.find_last_of("."); if(pos != std::string::npos) return CLoggerDomain(name.substr(0, pos)); return CLoggerDomain(DOMAIN_GLOBAL); }
CLogger * CLogger::getGlobalLogger() { return getLogger(CLoggerDomain(CLoggerDomain::DOMAIN_GLOBAL)); }
CLoggerStream::~CLoggerStream() { if(sbuffer) { logger.log(level, sbuffer->str()); delete sbuffer; sbuffer = nullptr; } } boost::recursive_mutex CLogger::smx; boost::recursive_mutex CLogManager::smx; DLL_LINKAGE CLogger * logGlobal = CLogger::getGlobalLogger(); DLL_LINKAGE CLogger * logBonus = CLogger::getLogger(CLoggerDomain("bonus")); DLL_LINKAGE CLogger * logNetwork = CLogger::getLogger(CLoggerDomain("network")); DLL_LINKAGE CLogger * logAi = CLogger::getLogger(CLoggerDomain("ai")); DLL_LINKAGE CLogger * logAnim = CLogger::getLogger(CLoggerDomain("animation")); CLogger * CLogger::getLogger(const CLoggerDomain & domain) { boost::lock_guard<boost::recursive_mutex> _(smx); CLogger * logger = CLogManager::get().getLogger(domain); if(logger) { return logger; } else {
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(auto & loggerNode : loggers.Vector()) { // Get logger std::string name = loggerNode["domain"].String(); CLogger * logger = CLogger::getLogger(CLoggerDomain(name)); // Set log level logger->setLevel(getLogLevel(loggerNode["level"].String())); } } CLogger::getGlobalLogger()->clearTargets(); // Add console target auto consoleTarget = 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 = 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->errorStream() << "Could not initialize the logging system due to configuration error/s." << "The logging system can be in a corrupted state. " << e.what(); } logGlobal->infoStream() << "Initialized logging system based on settings successfully."; }