1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-26 22:57:00 +02:00

- Integrated the logging API into the server project - Simplified CBasicLogConfigurator usage(exception handling, logging, log file appending)

This commit is contained in:
beegee1 2013-04-10 17:18:01 +00:00
parent abf96a5b66
commit 6827fcdb53
6 changed files with 151 additions and 140 deletions

View File

@ -260,7 +260,7 @@ int main(int argc, char** argv)
atexit(dispose); atexit(dispose);
CBasicLogConfigurator logConfig(VCMIDirs::get().localPath() + "/VCMI_Client_log2.txt", console); CBasicLogConfigurator logConfig(VCMIDirs::get().localPath() + "/VCMI_Client_log2.txt", console);
logConfig.configureDefault(false); logConfig.configureDefault();
logGlobal->infoStream() <<"Creating console and logfile: "<<pomtime.getDiff(); logGlobal->infoStream() <<"Creating console and logfile: "<<pomtime.getDiff();
// Init filesystem and settings // Init filesystem and settings
@ -268,15 +268,7 @@ int main(int argc, char** argv)
settings.init(); settings.init();
// Initialize logging based on settings // Initialize logging based on settings
try logConfig.configure();
{
logConfig.configure();
logGlobal->infoStream() << "Initialized logging system successfully.";
}
catch(const std::exception & e)
{
std::cout << "Could not initialize the logging system due to configuration error/s. " << e.what() << std::endl;
}
// Some basic data validation to produce better error messages in cases of incorrect install // Some basic data validation to produce better error messages in cases of incorrect install
auto testFile = [](std::string filename, std::string message) -> bool auto testFile = [](std::string filename, std::string message) -> bool

View File

@ -3,75 +3,86 @@
#include "../CConfigHandler.h" #include "../CConfigHandler.h"
CBasicLogConfigurator::CBasicLogConfigurator(const std::string & filePath, CConsoleHandler * console) : filePath(filePath), console(console) CBasicLogConfigurator::CBasicLogConfigurator(const std::string & filePath, CConsoleHandler * console) : filePath(filePath), console(console), appendToLogFile(false)
{ {
} }
void CBasicLogConfigurator::configureDefault(bool appendToLogFile /*= true*/) void CBasicLogConfigurator::configureDefault()
{ {
CGLogger::getGlobalLogger()->addTarget(make_unique<CLogConsoleTarget>(console)); CGLogger::getGlobalLogger()->addTarget(make_unique<CLogConsoleTarget>(console));
CGLogger::getGlobalLogger()->addTarget(make_unique<CLogFileTarget>(filePath, appendToLogFile)); CGLogger::getGlobalLogger()->addTarget(make_unique<CLogFileTarget>(filePath, appendToLogFile));
appendToLogFile = true;
} }
void CBasicLogConfigurator::configure(bool appendToLogFile /*= true*/) void CBasicLogConfigurator::configure()
{ {
const JsonNode & loggingNode = settings["logging"]; try
if(loggingNode.isNull()) throw std::runtime_error("Settings haven't been loaded.");
// Configure loggers
const JsonNode & loggers = loggingNode["loggers"];
if(!loggers.isNull())
{ {
BOOST_FOREACH(auto & loggerNode, loggers.Vector()) 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())
{ {
// Get logger BOOST_FOREACH(auto & loggerNode, loggers.Vector())
std::string name = loggerNode["domain"].String();
CGLogger * logger = CGLogger::getLogger(CLoggerDomain(name));
// Set log level
logger->setLevel(getLogLevel(loggerNode["level"].String()));
}
}
CGLogger::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())
{
BOOST_FOREACH(const JsonNode & mappingNode, colorMappingNode.Vector())
{ {
std::string domain = mappingNode["domain"].String(); // Get logger
std::string level = mappingNode["level"].String(); std::string name = loggerNode["domain"].String();
std::string color = mappingNode["color"].String(); CGLogger * logger = CGLogger::getLogger(CLoggerDomain(name));
colorMapping.setColorFor(CLoggerDomain(domain), getLogLevel(level), getConsoleColor(color));
// Set log level
logger->setLevel(getLogLevel(loggerNode["level"].String()));
} }
} }
consoleTarget->setColorMapping(colorMapping); CGLogger::getGlobalLogger()->clearTargets();
}
CGLogger::getGlobalLogger()->addTarget(std::move(consoleTarget));
// Add file target // Add console target
auto fileTarget = make_unique<CLogFileTarget>(filePath, appendToLogFile); auto consoleTarget = make_unique<CLogConsoleTarget>(console);
const JsonNode & fileNode = loggingNode["file"]; const JsonNode & consoleNode = loggingNode["console"];
if(!fileNode.isNull()) if(!consoleNode.isNull())
{ {
const JsonNode & fileFormatNode = fileNode["format"]; const JsonNode & consoleFormatNode = consoleNode["format"];
if(!fileFormatNode.isNull()) fileTarget->setFormatter(CLogFormatter(fileFormatNode.String())); 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())
{
BOOST_FOREACH(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);
}
CGLogger::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()));
}
CGLogger::getGlobalLogger()->addTarget(std::move(fileTarget));
appendToLogFile = true;
} }
CGLogger::getGlobalLogger()->addTarget(std::move(fileTarget)); 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.";
} }
ELogLevel::ELogLevel CBasicLogConfigurator::getLogLevel(const std::string & level) const ELogLevel::ELogLevel CBasicLogConfigurator::getLogLevel(const std::string & level) const

View File

@ -17,20 +17,19 @@ class CConsoleHandler;
class JsonNode; class JsonNode;
/// The class CBasicLogConfigurator reads log properties from settings.json and /// The class CBasicLogConfigurator reads log properties from settings.json and
/// sets up the logging system. /// sets up the logging system. Make sure that you use the same configurator object to
/// initialize the whole logging system. If you don't do so, the log file will be overwritten/truncated.
class DLL_LINKAGE CBasicLogConfigurator class DLL_LINKAGE CBasicLogConfigurator
{ {
public: public:
CBasicLogConfigurator(const std::string & filePath, CConsoleHandler * console); CBasicLogConfigurator(const std::string & filePath, CConsoleHandler * console);
/// Configures the logging system by parsing the logging settings. It adds the console target and the file target to the global logger. /// Configures the logging system by parsing the logging settings. It adds the console target and the file target to the global logger.
/// If the append parameter is true, the log file will be appended to. Otherwise the log file will be truncated. /// Doesn't throw, but logs on success or fault.
/// Throws std::runtime_error if the configuration has errors. void configure();
void configure(bool appendToLogFile = true);
/// Configures a default logging system by adding the console target and the file target to the global logger. /// Configures a default logging system by adding the console target and the file target to the global logger.
/// If the append parameter is true, the log file will be appended to. Otherwise the log file will be truncated. void configureDefault();
void configureDefault(bool appendToLogFile = true);
private: private:
ELogLevel::ELogLevel getLogLevel(const std::string & level) const; ELogLevel::ELogLevel getLogLevel(const std::string & level) const;
@ -38,4 +37,5 @@ private:
std::string filePath; std::string filePath;
CConsoleHandler * console; CConsoleHandler * console;
bool appendToLogFile;
}; };

View File

@ -211,7 +211,7 @@ void CGameHandler::levelUpHero(const CGHeroInstance * hero)
} }
//give prim skill //give prim skill
tlog5 << hero->name <<" got level "<<hero->level<<std::endl; logGlobal->traceStream() << hero->name <<" got level "<<hero->level;
int r = rand()%100, pom=0, x=0; int r = rand()%100, pom=0, x=0;
auto & skillChances = (hero->level>9) ? hero->type->heroClass->primarySkillLowLevel : hero->type->heroClass->primarySkillHighLevel; auto & skillChances = (hero->level>9) ? hero->type->heroClass->primarySkillLowLevel : hero->type->heroClass->primarySkillHighLevel;
@ -222,7 +222,7 @@ void CGameHandler::levelUpHero(const CGHeroInstance * hero)
if(r<pom) if(r<pom)
break; break;
} }
tlog5 << "The hero gets the primary skill with the no. " << x << " with a probability of " << r << "%." << std::endl; logGlobal->traceStream() << "The hero gets the primary skill with the no. " << x << " with a probability of " << r << "%.";
SetPrimSkill sps; SetPrimSkill sps;
sps.id = hero->id; sps.id = hero->id;
sps.which = static_cast<PrimarySkill::PrimarySkill>(x); sps.which = static_cast<PrimarySkill::PrimarySkill>(x);
@ -904,7 +904,7 @@ void CGameHandler::handleConnection(std::set<PlayerColor> players, CConnection &
c >> player >> requestID >> pack; //get the package c >> player >> requestID >> pack; //get the package
packType = typeList.getTypeID(pack); //get the id of type packType = typeList.getTypeID(pack); //get the id of type
tlog5 << boost::format("Received client message (request %d by player %d) of type with ID=%d (%s).\n") logGlobal->traceStream() << boost::format("Received client message (request %d by player %d) of type with ID=%d (%s).\n")
% requestID % player.getNum() % packType % typeid(*pack).name(); % requestID % player.getNum() % packType % typeid(*pack).name();
} }
@ -927,7 +927,7 @@ void CGameHandler::handleConnection(std::set<PlayerColor> players, CConnection &
else if(apply) else if(apply)
{ {
bool result = apply->applyOnGH(this,&c,pack, player); bool result = apply->applyOnGH(this,&c,pack, player);
tlog5 << "Message successfully applied (result=" << result << ")!\n"; logGlobal->traceStream() << "Message successfully applied (result=" << result << ")!";
//send confirmation that we've applied the package //send confirmation that we've applied the package
applied.result = result; applied.result = result;
@ -938,7 +938,7 @@ void CGameHandler::handleConnection(std::set<PlayerColor> players, CConnection &
} }
else else
{ {
tlog1 << "Message cannot be applied, cannot find applier (unregistered type)!\n"; logGlobal->errorStream() << "Message cannot be applied, cannot find applier (unregistered type)!";
} }
vstd::clear_pointer(pack); vstd::clear_pointer(pack);
@ -947,12 +947,12 @@ void CGameHandler::handleConnection(std::set<PlayerColor> players, CConnection &
catch(boost::system::system_error &e) //for boost errors just log, not crash - probably client shut down connection catch(boost::system::system_error &e) //for boost errors just log, not crash - probably client shut down connection
{ {
assert(!c.connected); //make sure that connection has been marked as broken assert(!c.connected); //make sure that connection has been marked as broken
tlog1 << e.what() << std::endl; logGlobal->errorStream() << e.what();
end2 = true; end2 = true;
} }
HANDLE_EXCEPTION(end2 = true); HANDLE_EXCEPTION(end2 = true);
tlog1 << "Ended handling connection\n"; logGlobal->errorStream() << "Ended handling connection";
} }
int CGameHandler::moveStack(int stack, BattleHex dest) int CGameHandler::moveStack(int stack, BattleHex dest)
@ -1103,9 +1103,9 @@ void CGameHandler::init(StartInfo *si)
si->seedToBeUsed = std::time(NULL); si->seedToBeUsed = std::time(NULL);
gs = new CGameState(); gs = new CGameState();
tlog0 << "Gamestate created!" << std::endl; logGlobal->infoStream() << "Gamestate created!";
gs->init(si); gs->init(si);
tlog0 << "Gamestate initialized!" << std::endl; logGlobal->infoStream() << "Gamestate initialized!";
for(auto i = gs->players.begin(); i != gs->players.end(); i++) for(auto i = gs->players.begin(); i != gs->players.end(); i++)
states.addPlayer(i->first); states.addPlayer(i->first);
@ -1121,7 +1121,7 @@ void CGameHandler::setPortalDwelling(const CGTownInstance * town, bool forced=fa
const PlayerState *p = gs->getPlayer(town->tempOwner); const PlayerState *p = gs->getPlayer(town->tempOwner);
if(!p) if(!p)
{ {
tlog3 << "There is no player owner of town " << town->name << " at " << town->pos << std::endl; logGlobal->warnStream() << "There is no player owner of town " << town->name << " at " << town->pos;
return; return;
} }
@ -1154,7 +1154,7 @@ void CGameHandler::setPortalDwelling(const CGTownInstance * town, bool forced=fa
void CGameHandler::newTurn() void CGameHandler::newTurn()
{ {
tlog5 << "Turn " << gs->day+1 << std::endl; logGlobal->traceStream() << "Turn " << gs->day+1;
NewTurn n; NewTurn n;
n.specialWeek = NewTurn::NO_ACTION; n.specialWeek = NewTurn::NO_ACTION;
n.creatureid = CreatureID::NONE; n.creatureid = CreatureID::NONE;
@ -1459,7 +1459,7 @@ void CGameHandler::newTurn()
} }
} }
tlog5 << "Info about turn " << n.day << "has been sent!" << std::endl; logGlobal->traceStream() << "Info about turn " << n.day << "has been sent!";
handleTimeEvents(); handleTimeEvents();
//call objects //call objects
for(size_t i = 0; i<gs->map->objects.size(); i++) for(size_t i = 0; i<gs->map->objects.size(); i++)
@ -1517,16 +1517,17 @@ void CGameHandler::run(bool resume)
std::set<PlayerColor> players; std::set<PlayerColor> players;
(*cc) >> players; //how many players will be handled at that client (*cc) >> players; //how many players will be handled at that client
tlog0 << "Connection " << cc->connectionID << " will handle " << players.size() << " player: "; std::stringstream sbuffer;
sbuffer << "Connection " << cc->connectionID << " will handle " << players.size() << " player: ";
BOOST_FOREACH(PlayerColor color, players) BOOST_FOREACH(PlayerColor color, players)
{ {
tlog0 << color << " "; sbuffer << color << " ";
{ {
boost::unique_lock<boost::recursive_mutex> lock(gsm); boost::unique_lock<boost::recursive_mutex> lock(gsm);
connections[color] = cc; connections[color] = cc;
} }
} }
tlog0 << std::endl; logGlobal->infoStream() << sbuffer.str();
cc->addStdVecItems(gs); cc->addStdVecItems(gs);
cc->enableStackSendingByID(); cc->enableStackSendingByID();
@ -1660,7 +1661,7 @@ bool CGameHandler::removeObject( const CGObjectInstance * obj )
{ {
if(!obj || !getObj(obj->id)) if(!obj || !getObj(obj->id))
{ {
tlog1 << "Something wrong, that object already has been removed or hasn't existed!\n"; logGlobal->errorStream() << "Something wrong, that object already has been removed or hasn't existed!";
return false; return false;
} }
@ -1685,16 +1686,16 @@ bool CGameHandler::moveHero( ObjectInstanceID hid, int3 dst, ui8 instant, Player
if(!h || (asker != PlayerColor::NEUTRAL && (instant || h->getOwner() != gs->currentPlayer)) //not turn of that hero or player can't simply teleport hero (at least not with this function) if(!h || (asker != PlayerColor::NEUTRAL && (instant || h->getOwner() != gs->currentPlayer)) //not turn of that hero or player can't simply teleport hero (at least not with this function)
) )
{ {
tlog1 << "Illegal call to move hero!\n"; logGlobal->errorStream() << "Illegal call to move hero!";
return false; return false;
} }
tlog5 << "Player " << asker << " wants to move hero "<< hid.getNum() << " from "<< h->pos << " to " << dst << std::endl; logGlobal->traceStream() << "Player " << asker << " wants to move hero "<< hid.getNum() << " from "<< h->pos << " to " << dst;
int3 hmpos = dst + int3(-1,0,0); int3 hmpos = dst + int3(-1,0,0);
if(!gs->map->isInTheMap(hmpos)) if(!gs->map->isInTheMap(hmpos))
{ {
tlog1 << "Destination tile is outside the map!\n"; logGlobal->errorStream() << "Destination tile is outside the map!";
return false; return false;
} }
@ -1766,7 +1767,7 @@ bool CGameHandler::moveHero( ObjectInstanceID hid, int3 dst, ui8 instant, Player
//can't move to that tile but we visit object //can't move to that tile but we visit object
objectVisited(t.visitableObjects.back(), h); objectVisited(t.visitableObjects.back(), h);
tlog5 << "Blocking visit at " << hmpos << std::endl; logGlobal->traceStream() << "Blocking visit at " << hmpos;
return true; return true;
} }
} }
@ -1810,12 +1811,12 @@ bool CGameHandler::moveHero( ObjectInstanceID hid, int3 dst, ui8 instant, Player
tmh.attackedFrom = guardPos; tmh.attackedFrom = guardPos;
applyWithResult(TryMoveHero::SUCCESS); applyWithResult(TryMoveHero::SUCCESS);
tlog5 << "Moved to " <<tmh.end<<std::endl; logGlobal->traceStream() << "Moved to " <<tmh.end;
if (!tryAttackingGuard(guardPos, h)) // If a creature guards the tile, block visit. if (!tryAttackingGuard(guardPos, h)) // If a creature guards the tile, block visit.
visitObjectOnTile(t, h); visitObjectOnTile(t, h);
tlog5 << "Movement end!\n"; logGlobal->traceStream() << "Movement end!";
return true; return true;
} }
else //instant move - teleportation else //instant move - teleportation
@ -1845,7 +1846,7 @@ bool CGameHandler::teleportHero(ObjectInstanceID hid, ObjectInstanceID dstid, ui
const CGTownInstance *t = getTown(dstid); const CGTownInstance *t = getTown(dstid);
if ( !h || !t || h->getOwner() != gs->currentPlayer ) if ( !h || !t || h->getOwner() != gs->currentPlayer )
tlog1<<"Invalid call to teleportHero!"; logGlobal->errorStream()<<"Invalid call to teleportHero!";
const CGTownInstance *from = h->visitedTown; const CGTownInstance *from = h->visitedTown;
if(((h->getOwner() != t->getOwner()) if(((h->getOwner() != t->getOwner())
@ -2216,7 +2217,7 @@ void CGameHandler::heroExchange(ObjectInstanceID hero1, ObjectInstanceID hero2)
void CGameHandler::prepareNewQuery(Query * queryPack, PlayerColor player, const boost::function<void(ui32)> &callback) void CGameHandler::prepareNewQuery(Query * queryPack, PlayerColor player, const boost::function<void(ui32)> &callback)
{ {
boost::unique_lock<boost::recursive_mutex> lock(gsm); boost::unique_lock<boost::recursive_mutex> lock(gsm);
tlog4 << "Creating a query for player " << player << " with ID=" << QID << std::endl; logGlobal->debugStream() << "Creating a query for player " << player << " with ID=" << QID;
callbacks[QID] = callback; callbacks[QID] = callback;
states.addQuery(player, QID); states.addQuery(player, QID);
queryPack->queryID = QID; queryPack->queryID = QID;
@ -2239,7 +2240,7 @@ void CGameHandler::ask( Query * sel, PlayerColor player, const CFunctionList<voi
void CGameHandler::sendToAllClients( CPackForClient * info ) void CGameHandler::sendToAllClients( CPackForClient * info )
{ {
tlog5 << "Sending to all clients a package of type " << typeid(*info).name() << std::endl; logGlobal->traceStream() << "Sending to all clients a package of type " << typeid(*info).name();
for(std::set<CConnection*>::iterator i=conns.begin(); i!=conns.end();i++) for(std::set<CConnection*>::iterator i=conns.begin(); i!=conns.end();i++)
{ {
boost::unique_lock<boost::mutex> lock(*(*i)->wmx); boost::unique_lock<boost::mutex> lock(*(*i)->wmx);
@ -2297,13 +2298,13 @@ void CGameHandler::sendAndApply( NewStructures * info )
void CGameHandler::save(const std::string & filename ) void CGameHandler::save(const std::string & filename )
{ {
tlog1 << "Saving to " << filename << "\n"; logGlobal->errorStream() << "Saving to " << filename;
CFileInfo info(filename); CFileInfo info(filename);
CResourceHandler::get()->createResource(info.getStem() + ".vlgm1"); CResourceHandler::get()->createResource(info.getStem() + ".vlgm1");
CResourceHandler::get()->createResource(info.getStem() + ".vsgm1"); CResourceHandler::get()->createResource(info.getStem() + ".vsgm1");
{ {
tlog0 << "Ordering clients to serialize...\n"; logGlobal->infoStream() << "Ordering clients to serialize...";
SaveGame sg(info.getStem() + ".vcgm1"); SaveGame sg(info.getStem() + ".vcgm1");
sendToAllClients(&sg); sendToAllClients(&sg);
} }
@ -2311,7 +2312,7 @@ void CGameHandler::save(const std::string & filename )
try try
{ {
// { // {
// tlog0 << "Serializing game info...\n"; // logGlobal->infoStream() << "Serializing game info...";
// CSaveFile save(CResourceHandler::get()->getResourceName(ResourceID(info.getStem(), EResType::LIB_SAVEGAME))); // CSaveFile save(CResourceHandler::get()->getResourceName(ResourceID(info.getStem(), EResType::LIB_SAVEGAME)));
// // char hlp[8] = "VCMISVG"; // // char hlp[8] = "VCMISVG";
// // save << hlp; // // save << hlp;
@ -2321,20 +2322,20 @@ void CGameHandler::save(const std::string & filename )
{ {
CSaveFile save(CResourceHandler::get()->getResourceName(ResourceID(info.getStem(), EResType::SERVER_SAVEGAME))); CSaveFile save(CResourceHandler::get()->getResourceName(ResourceID(info.getStem(), EResType::SERVER_SAVEGAME)));
saveCommonState(save); saveCommonState(save);
tlog0 << "Saving server state\n"; logGlobal->infoStream() << "Saving server state";
save << *this; save << *this;
} }
tlog0 << "Game has been successfully saved!\n"; logGlobal->infoStream() << "Game has been successfully saved!";
} }
catch(std::exception &e) catch(std::exception &e)
{ {
tlog1 << "Failed to save game: " << e.what() << std::endl; logGlobal->errorStream() << "Failed to save game: " << e.what();
} }
} }
void CGameHandler::close() void CGameHandler::close()
{ {
tlog0 << "We have been requested to close.\n"; logGlobal->infoStream() << "We have been requested to close.";
if(gs->initialOpts->mode == StartInfo::DUEL) if(gs->initialOpts->mode == StartInfo::DUEL)
{ {
@ -3294,7 +3295,7 @@ static EndAction end_action;
bool CGameHandler::makeBattleAction( BattleAction &ba ) bool CGameHandler::makeBattleAction( BattleAction &ba )
{ {
tlog1 << "\tMaking action of type " << ba.actionType << std::endl; logGlobal->errorStream() << "\tMaking action of type " << ba.actionType;
bool ok = true; bool ok = true;
@ -3421,7 +3422,7 @@ bool CGameHandler::makeBattleAction( BattleAction &ba )
BattleHex startingPos = stack->position; BattleHex startingPos = stack->position;
int distance = moveStack(ba.stackNumber, ba.destinationTile); int distance = moveStack(ba.stackNumber, ba.destinationTile);
tlog5 << stack->nodeName() << " will attack " << stackAtEnd->nodeName() << std::endl; logGlobal->traceStream() << stack->nodeName() << " will attack " << stackAtEnd->nodeName();
if(stack->position != ba.destinationTile //we wasn't able to reach destination tile if(stack->position != ba.destinationTile //we wasn't able to reach destination tile
&& !(stack->doubleWide() && !(stack->doubleWide()
@ -3430,7 +3431,7 @@ bool CGameHandler::makeBattleAction( BattleAction &ba )
) )
{ {
std::string problem = "We cannot move this stack to its destination " + stack->getCreature()->namePl; std::string problem = "We cannot move this stack to its destination " + stack->getCreature()->namePl;
tlog3 << problem << std::endl; logGlobal->warnStream() << problem;
complain(problem); complain(problem);
ok = false; ok = false;
sendAndApply(&end_action); sendAndApply(&end_action);
@ -4437,12 +4438,12 @@ bool CGameHandler::makeCustomAction( BattleAction &ba )
const CGHeroInstance *secondHero = gs->curB->heroes[!ba.side]; const CGHeroInstance *secondHero = gs->curB->heroes[!ba.side];
if(!h) if(!h)
{ {
tlog2 << "Wrong caster!\n"; logGlobal->warnStream() << "Wrong caster!";
return false; return false;
} }
if(ba.additionalInfo >= VLC->spellh->spells.size()) if(ba.additionalInfo >= VLC->spellh->spells.size())
{ {
tlog2 << "Wrong spell id (" << ba.additionalInfo << ")!\n"; logGlobal->warnStream() << "Wrong spell id (" << ba.additionalInfo << ")!";
return false; return false;
} }
@ -4455,8 +4456,8 @@ bool CGameHandler::makeCustomAction( BattleAction &ba )
ESpellCastProblem::ESpellCastProblem escp = gs->curB->battleCanCastThisSpell(h->tempOwner, s, ECastingMode::HERO_CASTING); ESpellCastProblem::ESpellCastProblem escp = gs->curB->battleCanCastThisSpell(h->tempOwner, s, ECastingMode::HERO_CASTING);
if(escp != ESpellCastProblem::OK) if(escp != ESpellCastProblem::OK)
{ {
tlog2 << "Spell cannot be cast!\n"; logGlobal->warnStream() << "Spell cannot be cast!";
tlog2 << "Problem : " << escp << std::endl; logGlobal->warnStream() << "Problem : " << escp;
return false; return false;
} }
@ -4484,7 +4485,7 @@ bool CGameHandler::makeCustomAction( BattleAction &ba )
} }
else else
{ {
tlog2 << "Spell " << s->name << " is not yet supported!\n"; logGlobal->warnStream() << "Spell " << s->name << " is not yet supported!";
return false; return false;
} }
} }
@ -4847,7 +4848,7 @@ void CGameHandler::handleTownEvents(CGTownInstance * town, NewTurn &n)
bool CGameHandler::complain( const std::string &problem ) bool CGameHandler::complain( const std::string &problem )
{ {
sendMessageToAll("Server encountered a problem: " + problem); sendMessageToAll("Server encountered a problem: " + problem);
tlog1 << problem << std::endl; logGlobal->errorStream() << problem;
return true; return true;
} }
@ -6018,7 +6019,7 @@ void CGameHandler::runBattle()
} }
else else
{ {
tlog5 << "Activating " << next->nodeName() << std::endl; logGlobal->traceStream() << "Activating " << next->nodeName();
BattleSetActiveStack sas; BattleSetActiveStack sas;
sas.stack = next->ID; sas.stack = next->ID;
sendAndApply(&sas); sendAndApply(&sas);
@ -6173,12 +6174,12 @@ void CGameHandler::spawnWanderingMonsters(CreatureID creatureID)
getFreeTiles(tiles); getFreeTiles(tiles);
ui32 amount = tiles.size() / 200; //Chance is 0.5% for each tile ui32 amount = tiles.size() / 200; //Chance is 0.5% for each tile
std::random_shuffle(tiles.begin(), tiles.end()); std::random_shuffle(tiles.begin(), tiles.end());
tlog5 << "Spawning wandering monsters. Found " << tiles.size() << " free tiles. Creature type: " << creatureID << std::endl; logGlobal->traceStream() << "Spawning wandering monsters. Found " << tiles.size() << " free tiles. Creature type: " << creatureID;
const CCreature *cre = VLC->creh->creatures[creatureID]; const CCreature *cre = VLC->creh->creatures[creatureID];
for (int i = 0; i < amount; ++i) for (int i = 0; i < amount; ++i)
{ {
tile = tiles.begin(); tile = tiles.begin();
tlog5 << "\tSpawning monster at " << *tile << std::endl; logGlobal->traceStream() << "\tSpawning monster at " << *tile;
putNewMonster(creatureID, cre->getRandomAmount(std::rand), *tile); putNewMonster(creatureID, cre->getRandomAmount(std::rand), *tile);
tiles.erase(tile); //not use it again tiles.erase(tile); //not use it again
} }

View File

@ -28,6 +28,8 @@
#include "../lib/mapping/CMapInfo.h" #include "../lib/mapping/CMapInfo.h"
#include "../lib/CObjectHandler.h" #include "../lib/CObjectHandler.h"
#include "../lib/GameConstants.h" #include "../lib/GameConstants.h"
#include "../lib/logging/CBasicLogConfigurator.h"
#include "../lib/CConfigHandler.h"
#include "../lib/UnlockGuard.h" #include "../lib/UnlockGuard.h"
@ -74,7 +76,7 @@ void CPregameServer::handleConnection(CConnection *cpc)
CPackForSelectionScreen *cpfs = NULL; CPackForSelectionScreen *cpfs = NULL;
*cpc >> cpfs; *cpc >> cpfs;
tlog0 << "Got package to announce " << typeid(*cpfs).name() << " from " << *cpc << std::endl; logNetwork->infoStream() << "Got package to announce " << typeid(*cpfs).name() << " from " << *cpc;
boost::unique_lock<boost::recursive_mutex> queueLock(mx); boost::unique_lock<boost::recursive_mutex> queueLock(mx);
bool quitting = dynamic_cast<QuitMenuWithoutStarting*>(cpfs), bool quitting = dynamic_cast<QuitMenuWithoutStarting*>(cpfs),
@ -102,7 +104,7 @@ void CPregameServer::handleConnection(CConnection *cpc)
catch (const std::exception& e) catch (const std::exception& e)
{ {
boost::unique_lock<boost::recursive_mutex> queueLock(mx); boost::unique_lock<boost::recursive_mutex> queueLock(mx);
tlog0 << *cpc << " dies... \nWhat happened: " << e.what() << std::endl; logNetwork->errorStream() << *cpc << " dies... \nWhat happened: " << e.what();
} }
boost::unique_lock<boost::recursive_mutex> queueLock(mx); boost::unique_lock<boost::recursive_mutex> queueLock(mx);
@ -118,13 +120,13 @@ void CPregameServer::handleConnection(CConnection *cpc)
if(!connections.size()) if(!connections.size())
{ {
tlog0 << "Last connection lost, server will close itself...\n"; logNetwork->errorStream() << "Last connection lost, server will close itself...";
boost::this_thread::sleep(boost::posix_time::seconds(2)); //we should never be hasty when networking boost::this_thread::sleep(boost::posix_time::seconds(2)); //we should never be hasty when networking
state = ENDING_WITHOUT_START; state = ENDING_WITHOUT_START;
} }
} }
tlog0 << "Thread listening for " << *cpc << " ended\n"; logNetwork->infoStream() << "Thread listening for " << *cpc << " ended";
listeningThreads--; listeningThreads--;
vstd::clear_pointer(cpc->handler); vstd::clear_pointer(cpc->handler);
} }
@ -152,7 +154,7 @@ void CPregameServer::run()
if(state != RUNNING) if(state != RUNNING)
{ {
tlog0 << "Stopping listening for connections...\n"; logNetwork->infoStream() << "Stopping listening for connections...";
acceptor->close(); acceptor->close();
} }
@ -166,13 +168,13 @@ void CPregameServer::run()
boost::this_thread::sleep(boost::posix_time::milliseconds(50)); boost::this_thread::sleep(boost::posix_time::milliseconds(50));
} }
tlog0 << "Thread handling connections ended\n"; logNetwork->infoStream() << "Thread handling connections ended";
if(state == ENDING_AND_STARTING_GAME) if(state == ENDING_AND_STARTING_GAME)
{ {
tlog0 << "Waiting for listening thread to finish...\n"; logNetwork->infoStream() << "Waiting for listening thread to finish...";
while(listeningThreads) boost::this_thread::sleep(boost::posix_time::milliseconds(50)); while(listeningThreads) boost::this_thread::sleep(boost::posix_time::milliseconds(50));
tlog0 << "Preparing new game\n"; logNetwork->infoStream() << "Preparing new game";
} }
} }
@ -193,11 +195,11 @@ void CPregameServer::connectionAccepted(const boost::system::error_code& ec)
{ {
if(ec) if(ec)
{ {
tlog0 << "Something wrong during accepting: " << ec.message() << std::endl; logNetwork->infoStream() << "Something wrong during accepting: " << ec.message();
return; return;
} }
tlog0 << "We got a new connection! :)\n"; logNetwork->infoStream() << "We got a new connection! :)";
CConnection *pc = new CConnection(upcomingConnection, NAME); CConnection *pc = new CConnection(upcomingConnection, NAME);
initConnection(pc); initConnection(pc);
upcomingConnection = NULL; upcomingConnection = NULL;
@ -226,7 +228,7 @@ void CPregameServer::start_async_accept()
void CPregameServer::announceTxt(const std::string &txt, const std::string &playerName /*= "system"*/) void CPregameServer::announceTxt(const std::string &txt, const std::string &playerName /*= "system"*/)
{ {
tlog0 << playerName << " says: " << txt << std::endl; logNetwork->infoStream() << playerName << " says: " << txt;
ChatMessage cm; ChatMessage cm;
cm.playerName = playerName; cm.playerName = playerName;
cm.message = txt; cm.message = txt;
@ -245,7 +247,7 @@ void CPregameServer::sendPack(CConnection * pc, const CPackForSelectionScreen &
{ {
if(!pc->sendStop) if(!pc->sendStop)
{ {
tlog0 << "\tSending pack of type " << typeid(pack).name() << " to " << *pc << std::endl; logNetwork->infoStream() << "\tSending pack of type " << typeid(pack).name() << " to " << *pc;
*pc << &pack; *pc << &pack;
} }
@ -294,7 +296,7 @@ void CPregameServer::initConnection(CConnection *c)
{ {
*c >> c->name; *c >> c->name;
connections.insert(c); connections.insert(c);
tlog0 << "Pregame connection with player " << c->name << " established!" << std::endl; logNetwork->infoStream() << "Pregame connection with player " << c->name << " established!";
} }
void CPregameServer::startListeningThread(CConnection * pc) void CPregameServer::startListeningThread(CConnection * pc)
@ -307,7 +309,7 @@ void CPregameServer::startListeningThread(CConnection * pc)
CVCMIServer::CVCMIServer() CVCMIServer::CVCMIServer()
: io(new boost::asio::io_service()), acceptor(new TAcceptor(*io, tcp::endpoint(tcp::v4(), port))), firstConnection(NULL) : io(new boost::asio::io_service()), acceptor(new TAcceptor(*io, tcp::endpoint(tcp::v4(), port))), firstConnection(NULL)
{ {
tlog4 << "CVCMIServer created!" <<std::endl; logNetwork->debugStream() << "CVCMIServer created!";
} }
CVCMIServer::~CVCMIServer() CVCMIServer::~CVCMIServer()
{ {
@ -396,7 +398,7 @@ void CVCMIServer::start()
} }
boost::system::error_code error; boost::system::error_code error;
tlog0<<"Listening for connections at port " << acceptor->local_endpoint().port() << std::endl; logNetwork->infoStream()<<"Listening for connections at port " << acceptor->local_endpoint().port();
tcp::socket * s = new tcp::socket(acceptor->get_io_service()); tcp::socket * s = new tcp::socket(acceptor->get_io_service());
boost::thread acc(boost::bind(vaccept,acceptor,s,&error)); boost::thread acc(boost::bind(vaccept,acceptor,s,&error));
sr->setToTrueAndNotify(); sr->setToTrueAndNotify();
@ -405,12 +407,12 @@ void CVCMIServer::start()
acc.join(); acc.join();
if (error) if (error)
{ {
tlog2<<"Got connection but there is an error " << std::endl << error; logNetwork->warnStream()<<"Got connection but there is an error " << error;
return; return;
} }
tlog0<<"We've accepted someone... " << std::endl; logNetwork->infoStream()<<"We've accepted someone... ";
firstConnection = new CConnection(s,NAME); firstConnection = new CConnection(s,NAME);
tlog0<<"Got connection!" << std::endl; logNetwork->infoStream()<<"Got connection!";
while(!end2) while(!end2)
{ {
ui8 mode; ui8 mode;
@ -455,14 +457,14 @@ void CVCMIServer::loadGame()
// //
// CLoadFile lf(CResourceHandler::get()->getResourceName(ResourceID(fname, EResType::LIB_SAVEGAME))); // CLoadFile lf(CResourceHandler::get()->getResourceName(ResourceID(fname, EResType::LIB_SAVEGAME)));
// lf >> sig >> dum >> si; // lf >> sig >> dum >> si;
// tlog0 <<"Reading save signature"<<std::endl; // logNetwork->infoStream() <<"Reading save signature";
// //
// lf >> *VLC; // lf >> *VLC;
// tlog0 <<"Reading handlers"<<std::endl; // logNetwork->infoStream() <<"Reading handlers";
// //
// lf >> (gh.gs); // lf >> (gh.gs);
// c.addStdVecItems(gh.gs); // c.addStdVecItems(gh.gs);
// tlog0 <<"Reading gamestate"<<std::endl; // logNetwork->infoStream() <<"Reading gamestate";
// } // }
{ {
@ -486,7 +488,7 @@ void CVCMIServer::loadGame()
acceptor->accept(*s,error); acceptor->accept(*s,error);
if(error) //retry if(error) //retry
{ {
tlog3<<"Cannot establish connection - retrying..." << std::endl; logNetwork->warnStream()<<"Cannot establish connection - retrying...";
i--; i--;
continue; continue;
} }
@ -507,6 +509,8 @@ int main(int argc, char** argv)
{ {
logfile = new std::ofstream((VCMIDirs::get().localPath() + "/VCMI_Server_log.txt").c_str()); logfile = new std::ofstream((VCMIDirs::get().localPath() + "/VCMI_Server_log.txt").c_str());
console = new CConsoleHandler; console = new CConsoleHandler;
CBasicLogConfigurator logConfig(VCMIDirs::get().localPath() + "/VCMI_Server_log2.txt", console);
logConfig.configureDefault();
//boost::thread t(boost::bind(&CConsoleHandler::run,::console)); //boost::thread t(boost::bind(&CConsoleHandler::run,::console));
if(argc > 1) if(argc > 1)
{ {
@ -517,7 +521,10 @@ int main(int argc, char** argv)
#endif #endif
} }
preinitDLL(console,logfile); preinitDLL(console,logfile);
tlog0 << "Port " << port << " will be used." << std::endl; settings.init();
logConfig.configure();
logNetwork->infoStream() << "Port " << port << " will be used.";
loadDLLClasses(); loadDLLClasses();
srand ( (ui32)time(NULL) ); srand ( (ui32)time(NULL) );
try try
@ -535,13 +542,13 @@ int main(int argc, char** argv)
} }
catch(boost::system::system_error &e) //for boost errors just log, not crash - probably client shut down connection catch(boost::system::system_error &e) //for boost errors just log, not crash - probably client shut down connection
{ {
tlog1 << e.what() << std::endl; logNetwork->errorStream() << e.what();
end2 = true; end2 = true;
}HANDLE_EXCEPTION }HANDLE_EXCEPTION
} }
catch(boost::system::system_error &e) catch(boost::system::system_error &e)
{ {
tlog1 << e.what() << std::endl; logNetwork->errorStream() << e.what();
//catch any startup errors (e.g. can't access port) errors //catch any startup errors (e.g. can't access port) errors
//and return non-zero status so client can detect error //and return non-zero status so client can detect error
throw; throw;

View File

@ -17,12 +17,12 @@
boost::unique_lock<boost::mutex> lock(*c->wmx); \ boost::unique_lock<boost::mutex> lock(*c->wmx); \
*c << &temp_message; \ *c << &temp_message; \
} \ } \
tlog1<<"Player is not allowed to perform this action!\n"; \ logNetwork->errorStream()<<"Player is not allowed to perform this action!"; \
return false;} while(0) return false;} while(0)
#define WRONG_PLAYER_MSG(expectedplayer) do {std::ostringstream oss;\ #define WRONG_PLAYER_MSG(expectedplayer) do {std::ostringstream oss;\
oss << "You were identified as player " << gh->getPlayerAt(c) << " while expecting " << expectedplayer;\ oss << "You were identified as player " << gh->getPlayerAt(c) << " while expecting " << expectedplayer;\
tlog1 << oss.str() << std::endl; \ logNetwork->errorStream() << oss.str(); \
if(c) { SystemMessage temp_message(oss.str()); boost::unique_lock<boost::mutex> lock(*c->wmx); *c << &temp_message; } } while(0) if(c) { SystemMessage temp_message(oss.str()); boost::unique_lock<boost::mutex> lock(*c->wmx); *c << &temp_message; } } while(0)
#define ERROR_IF_NOT_OWNS(id) do{if(!PLAYER_OWNS(id)){WRONG_PLAYER_MSG(gh->getOwner(id)); ERROR_AND_RETURN; }}while(0) #define ERROR_IF_NOT_OWNS(id) do{if(!PLAYER_OWNS(id)){WRONG_PLAYER_MSG(gh->getOwner(id)); ERROR_AND_RETURN; }}while(0)
@ -295,7 +295,7 @@ bool SetSelection::applyGh( CGameHandler *gh )
ERROR_IF_NOT(player); ERROR_IF_NOT(player);
if(!gh->getObj(id)) if(!gh->getObj(id))
{ {
tlog1 << "No such object...\n"; logNetwork->errorStream() << "No such object...";
ERROR_AND_RETURN; ERROR_AND_RETURN;
} }
gh->sendAndApply(this); gh->sendAndApply(this);