1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-25 00:37:24 +02:00
Files
.github
AI
CI
Mods
android
client
clientapp
cmake_modules
config
debian
docs
include
ios
launcher
lib
battle
bonuses
campaign
constants
entities
events
filesystem
gameState
json
logging
CBasicLogConfigurator.cpp
CBasicLogConfigurator.h
CLogger.cpp
CLogger.h
VisualLogger.cpp
VisualLogger.h
mapObjectConstructors
mapObjects
mapping
minizip
modding
network
networkPacks
pathfinder
rewardable
rmg
serializer
spells
texts
vstd
AI_Base.h
ArtifactUtils.cpp
ArtifactUtils.h
BasicTypes.cpp
BattleFieldHandler.cpp
BattleFieldHandler.h
CAndroidVMHelper.cpp
CAndroidVMHelper.h
CArtHandler.cpp
CArtHandler.h
CArtifactInstance.cpp
CArtifactInstance.h
CBonusTypeHandler.cpp
CBonusTypeHandler.h
CConfigHandler.cpp
CConfigHandler.h
CConsoleHandler.cpp
CConsoleHandler.h
CCreatureHandler.cpp
CCreatureHandler.h
CCreatureSet.cpp
CCreatureSet.h
CGameInfoCallback.cpp
CGameInfoCallback.h
CGameInterface.cpp
CGameInterface.h
CMakeLists.txt
CPlayerState.cpp
CPlayerState.h
CRandomGenerator.cpp
CRandomGenerator.h
CScriptingModule.cpp
CScriptingModule.h
CSkillHandler.cpp
CSkillHandler.h
CSoundBase.h
CStack.cpp
CStack.h
CStopWatch.h
CThreadHelper.cpp
CThreadHelper.h
Color.h
ConstTransitivePtr.h
ExceptionsCommon.h
ExtraOptionsInfo.cpp
ExtraOptionsInfo.h
FunctionList.h
GameCallbackHolder.h
GameConstants.h
GameSettings.cpp
GameSettings.h
IBonusTypeHandler.h
IGameCallback.cpp
IGameCallback.h
IGameEventsReceiver.h
IGameSettings.h
IHandlerBase.cpp
IHandlerBase.h
LoadProgress.cpp
LoadProgress.h
LogicalExpression.cpp
LogicalExpression.h
ObstacleHandler.cpp
ObstacleHandler.h
Point.h
Rect.cpp
Rect.h
ResourceSet.cpp
ResourceSet.h
RiverHandler.cpp
RiverHandler.h
RoadHandler.cpp
RoadHandler.h
ScopeGuard.h
ScriptHandler.cpp
ScriptHandler.h
StartInfo.cpp
StartInfo.h
StdInc.cpp
StdInc.h
TerrainHandler.cpp
TerrainHandler.h
TurnTimerInfo.cpp
TurnTimerInfo.h
UnlockGuard.h
VCMIDirs.cpp
VCMIDirs.h
VCMI_Lib.cpp
VCMI_Lib.h
int3.h
vcmi_endian.h
lobby
mapeditor
osx
rpm
scripting
scripts
server
serverapp
test
vcmiqt
win
xcode
.gitattributes
.gitignore
.gitmodules
.travis.yml
AUTHORS.h
CCallback.cpp
CCallback.h
CMakeLists.txt
CMakePresets.json
ChangeLog.md
Global.h
Version.cpp.in
Version.h
conanfile.py
fuzzylite.pc.in
license.txt
vcmibuilder
vcmi/lib/logging/CBasicLogConfigurator.cpp

155 lines
5.1 KiB
C++
Raw Normal View History

/*
* 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) :
2014-08-11 21:24:31 +02:00
filePath(std::move(filePath)), console(console), appendToLogFile(false) {}
void CBasicLogConfigurator::configureDefault()
{
2022-12-07 23:36:20 +02:00
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())
{
2023-02-15 00:35:06 +03:00
for(const auto & loggerNode : loggers.Vector())
{
// Get logger
std::string name = loggerNode["domain"].String();
CLogger * logger = CLogger::getLogger(CLoggerDomain(name));
// Set log level
2016-10-02 20:21:20 +02:00
std::string level = loggerNode["level"].String();
logger->setLevel(getLogLevel(level));
2016-10-03 20:32:01 +02:00
logGlobal->debug("Set log level %s => %d", name, level);
}
}
CLogger::getGlobalLogger()->clearTargets();
// Add console target
2022-12-07 23:36:20 +02:00
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
2022-12-07 23:36:20 +02:00
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)
{
2016-10-03 20:32:01 +02:00
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());
}
2016-10-03 20:32:01 +02:00
logGlobal->info("Initialized logging system based on settings successfully.");
2016-10-02 20:21:20 +02:00
for (auto& domain : CLogManager::get().getRegisteredDomains())
{
2016-10-03 20:32:01 +02:00
logGlobal->info("[log level] %s => %s", domain,
ELogLevel::to_string(CLogger::getLogger(CLoggerDomain(domain))->getLevel()));
2016-10-02 20:21:20 +02:00
}
}
ELogLevel::ELogLevel CBasicLogConfigurator::getLogLevel(const std::string & level)
{
2014-10-02 19:43:46 +04:00
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)
{
2014-10-02 19:43:46 +04:00
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.");
}
2020-05-16 16:14:58 +03:00
void CBasicLogConfigurator::deconfigure()
{
auto l = CLogger::getGlobalLogger();
2020-05-16 16:14:58 +03:00
if(l != nullptr)
l->clearTargets();
2023-02-15 00:35:06 +03:00
appendToLogFile = true;
}
VCMI_LIB_NAMESPACE_END