Browse Source

Logging cleanup.

AlexVinS 8 years ago
parent
commit
64d9dadd64

+ 4 - 4
client/CBitmapHandler.cpp

@@ -130,7 +130,7 @@ SDL_Surface * BitmapHandler::loadBitmapFromDir(std::string path, std::string fna
 		}
 		else
 		{
-			logGlobal->errorStream()<<"Failed to open "<<fname<<" as H3 PCX!";
+			logGlobal->error("Failed to open %s as H3 PCX!", fname);
 			return nullptr;
 		}
 	}
@@ -151,8 +151,8 @@ SDL_Surface * BitmapHandler::loadBitmapFromDir(std::string path, std::string fna
 		}
 		else
 		{
-			logGlobal->errorStream() << "Failed to open " << fname << " via SDL_Image";
-			logGlobal->errorStream() << "Reason: " << IMG_GetError();
+			logGlobal->error("Failed to open %s via SDL_Image", fname);
+			logGlobal->error("Reason: %s", IMG_GetError());
 			return nullptr;
 		}
 	}
@@ -183,7 +183,7 @@ SDL_Surface * BitmapHandler::loadBitmap(std::string fname, bool setKey)
 	if (!(bitmap = loadBitmapFromDir("DATA/", fname, setKey)) &&
 		!(bitmap = loadBitmapFromDir("SPRITES/", fname, setKey)))
 	{
-		logGlobal->errorStream() << "Error: Failed to find file " << fname;
+		logGlobal->error("Error: Failed to find file %s", fname);
 	}
 
 	return bitmap;

+ 11 - 11
client/CDefHandler.cpp

@@ -67,7 +67,7 @@ void CDefHandler::openFromMemory(ui8 *table, const std::string & name)
 		palette[it].r = de.palette[it].R;
 		palette[it].g = de.palette[it].G;
 		palette[it].b = de.palette[it].B;
-		palette[it].a = SDL_ALPHA_OPAQUE;	
+		palette[it].a = SDL_ALPHA_OPAQUE;
 	}
 
 	// The SDefEntryBlock starts just after the SDefEntry
@@ -163,22 +163,22 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, const ui8 * FDef, const SDL_Co
 		add=0;
 
 	ret = SDL_CreateRGBSurface(SDL_SWSURFACE, FullWidth, FullHeight, 8, 0, 0, 0, 0);
-	
+
 	if(nullptr == ret)
 	{
-		logGlobal->errorStream() << __FUNCTION__ <<": Unable to create surface";
-		logGlobal->errorStream() << FullWidth << "X" << FullHeight;
-		logGlobal->errorStream() << SDL_GetError();
-		throw std::runtime_error("Unable to create surface");		
+		logGlobal->error("%s: Unable to create surface", __FUNCTION__);
+		logGlobal->error("%dX%d", FullWidth, FullHeight);
+		logGlobal->error(SDL_GetError());
+		throw std::runtime_error("Unable to create surface");
 	}
 
 	BaseOffset += sizeof(SSpriteDef);
 	int BaseOffsetor = BaseOffset;
-	
-	SDL_Palette * p = SDL_AllocPalette(256);	
+
+	SDL_Palette * p = SDL_AllocPalette(256);
 	SDL_SetPaletteColors(p, palette, 0, 256);
 	SDL_SetSurfacePalette(ret, p);
-	SDL_FreePalette(p);	
+	SDL_FreePalette(p);
 
 	int ftcp=0;
 
@@ -344,8 +344,8 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, const ui8 * FDef, const SDL_Co
 	}
 
 	SDL_Color ttcol = ret->format->palette->colors[0];
-	Uint32 keycol = SDL_MapRGBA(ret->format, ttcol.r, ttcol.b, ttcol.g, ttcol.a);	
-	SDL_SetColorKey(ret, SDL_TRUE, keycol);	
+	Uint32 keycol = SDL_MapRGBA(ret->format, ttcol.r, ttcol.b, ttcol.g, ttcol.a);
+	SDL_SetColorKey(ret, SDL_TRUE, keycol);
 
 	return ret;
 }

+ 22 - 27
client/CMT.cpp

@@ -151,8 +151,7 @@ void startGameFromFile(const bfs::path &fname)
 	}
 	catch(std::exception &e)
 	{
-		logGlobal->errorStream() << "Failed to start from the file: " << fname << ". Error: " << e.what()
-			<< " Falling back to main menu.";
+		logGlobal->error("Failed to start from the file: %s. Error: %s. Falling back to main menu.", fname, e.what());
 		GH.curInt = CGPreGame::create();
 		return;
 	}
@@ -217,7 +216,7 @@ static void SDLLogCallback(void*           userdata,
 	//todo: convert SDL log priority to vcmi log priority
 	//todo: make separate log domain for SDL
 
-	logGlobal->debugStream() << "SDL(category " << category << "; priority " <<priority <<") "<<message;
+	logGlobal->debug("SDL(category %d; priority %d) %s", category, priority, message);
 }
 
 #ifdef VCMI_APPLE
@@ -320,9 +319,9 @@ int main(int argc, char * argv[])
 	const bfs::path logPath = VCMIDirs::get().userCachePath() / "VCMI_Client_log.txt";
 	CBasicLogConfigurator logConfig(logPath, console);
 	logConfig.configureDefault();
-	logGlobal->infoStream() << NAME;
+	logGlobal->info(NAME);
 	logGlobal->info("Creating console and configuring logger: %d ms", pomtime.getDiff());
-	logGlobal->infoStream() << "The log file will be saved to " << logPath;
+	logGlobal->info("The log file will be saved to %s", logPath);
 
 	// Init filesystem and settings
 	preinitDLL(::console);
@@ -355,7 +354,7 @@ int main(int argc, char * argv[])
 		if (CResourceHandler::get()->existsResource(ResourceID(filename)))
 			return true;
 
-		logGlobal->errorStream() << "Error: " << message << " was not found!";
+		logGlobal->error("Error: %s was not found!", message);
 		return false;
 	};
 
@@ -383,8 +382,8 @@ int main(int argc, char * argv[])
 	{
 		logGlobal->error("Fatal error: failed to load settings!");
 		logGlobal->error("Possible reasons:");
-		logGlobal->errorStream() << "\tCorrupted local configuration file at " << VCMIDirs::get().userConfigPath() << "/settings.json";
-		logGlobal->errorStream() << "\tMissing or corrupted global configuration file at " << VCMIDirs::get().userConfigPath() << "/schemas/settings.json";
+		logGlobal->error("\tCorrupted local configuration file at %s/settings.json", VCMIDirs::get().userConfigPath());
+		logGlobal->error("\tMissing or corrupted global configuration file at %s/schemas/settings.json", VCMIDirs::get().userConfigPath());
 		logGlobal->error("VCMI will now exit...");
 		exit(EXIT_FAILURE);
 	}
@@ -393,7 +392,7 @@ int main(int argc, char * argv[])
 	{
 		if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO|SDL_INIT_NOPARACHUTE))
 		{
-			logGlobal->errorStream()<<"Something was wrong: "<< SDL_GetError();
+			logGlobal->error("Something was wrong: %s", SDL_GetError());
 			exit(-1);
 		}
 
@@ -413,7 +412,7 @@ int main(int argc, char * argv[])
 		int driversCount = SDL_GetNumRenderDrivers();
 		std::string preferredDriverName = video["driver"].String();
 
-		logGlobal->infoStream() << "Found " << driversCount << " render drivers";
+		logGlobal->info("Found %d render drivers", driversCount);
 
 		for(int it = 0; it < driversCount; it++)
 		{
@@ -425,17 +424,17 @@ int main(int argc, char * argv[])
 			if(!preferredDriverName.empty() && driverName == preferredDriverName)
 			{
 				preferredDriverIndex = it;
-				logGlobal->infoStream() << "\t" << driverName << " (active)";
+				logGlobal->info("\t%s (active)", driverName);
 			}
 			else
-				logGlobal->infoStream() << "\t" << driverName;
+				logGlobal->info("\t%s", driverName);
 		}
 
 		config::CConfigHandler::GuiOptionsMap::key_type resPair(res["width"].Float(), res["height"].Float());
 		if (conf.guiOptions.count(resPair) == 0)
 		{
 			// selected resolution was not found - complain & fallback to something that we do have.
-			logGlobal->errorStream() << "Selected resolution " << resPair.first << "x" << resPair.second << " was not found!";
+			logGlobal->error("Selected resolution %dx%d was not found!", resPair.first, resPair.second);
 			if (conf.guiOptions.empty())
 			{
 				logGlobal->error("Unable to continue - no valid resolutions found! Please reinstall VCMI to fix this");
@@ -448,7 +447,7 @@ int main(int argc, char * argv[])
 				newRes["height"].Float() = conf.guiOptions.begin()->first.second;
 				conf.SetResolution(newRes["width"].Float(), newRes["height"].Float());
 
-				logGlobal->errorStream() << "Falling back to " << newRes["width"].Float() << "x" << newRes["height"].Float();
+				logGlobal->error("Falling back to %dx%d", newRes["width"].Integer(), newRes["height"].Integer());
 			}
 		}
 
@@ -548,8 +547,7 @@ int main(int argc, char * argv[])
 		{
 			if(!fileToStartFrom.empty())
 			{
-				logGlobal->warnStream() << "Warning: cannot find given file to start from (" << fileToStartFrom
-					<< "). Falling back to main menu.";
+				logGlobal->warn("Warning: cannot find given file to start from (%s). Falling back to main menu.", fileToStartFrom.string());
 			}
 			GH.curInt = CGPreGame::create(); //will set CGP pointer to itself
 		}
@@ -592,7 +590,7 @@ void printInfoAboutIntObject(const CIntObject *obj, int level)
 		sbuffer << "inactive";
 	sbuffer << " at " << obj->pos.x <<"x"<< obj->pos.y;
 	sbuffer << " (" << obj->pos.w <<"x"<< obj->pos.h << ")";
-	logGlobal->infoStream() << sbuffer.str();
+	logGlobal->info(sbuffer.str());
 
 	for(const CIntObject *child : obj->children)
 		printInfoAboutIntObject(child, level+1);
@@ -862,7 +860,7 @@ void processCommand(const std::string &message)
 		}
 		catch(std::exception &e)
 		{
-			logGlobal->warnStream() << "Failed opening " << fname << ": " << e.what();
+			logGlobal->warn("Failed opening %s: %s", fname, e.what());
 			logGlobal->warn("Setting not changes, AI not found or invalid!");
 		}
 	}
@@ -1062,7 +1060,7 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
 	}
 	if(!checkVideoMode(displayIndex, w, h))
 	{
-		logGlobal->errorStream() << "Error: SDL says that " << w << "x" << h << " resolution is not available!";
+		logGlobal->error("Error: SDL says that %dx%d resolution is not available!", w, h);
 		return false;
 	}
 
@@ -1105,8 +1103,8 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
 	}
 
 	SDL_RendererInfo info;
-	SDL_GetRendererInfo(mainRenderer,&info);
-	logGlobal->infoStream() << "Created renderer " << info.name;
+	SDL_GetRendererInfo(mainRenderer, &info);
+	logGlobal->info("Created renderer %s", info.name);
 
 	if(!(fullscreen && realFullscreen))
 	{
@@ -1134,10 +1132,7 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
 	screen = SDL_CreateRGBSurface(0,w,h,bpp,rmask,gmask,bmask,amask);
 	if(nullptr == screen)
 	{
-		logGlobal->error("Unable to create surface");
-		logGlobal->errorStream() << w << " "<<  h << " "<< bpp;
-
-		logGlobal->errorStream() << SDL_GetError();
+		logGlobal->error("Unable to create surface %dx%d with %d bpp: %s", w, h, bpp, SDL_GetError());
 		throw std::runtime_error("Unable to create surface");
 	}
 	//No blending for screen itself. Required for proper cursor rendering.
@@ -1151,7 +1146,7 @@ static bool recreateWindow(int w, int h, int bpp, bool fullscreen, int displayIn
 	if(nullptr == screenTexture)
 	{
 		logGlobal->error("Unable to create screen texture");
-		logGlobal->errorStream() << SDL_GetError();
+		logGlobal->error(SDL_GetError());
 		throw std::runtime_error("Unable to create screen texture");
 	}
 
@@ -1269,7 +1264,7 @@ static void handleEvent(SDL_Event & ev)
 			fullScreenChanged();
 			break;
 		default:
-			logGlobal->errorStream() << "Unknown user event. Code " << ev.user.code;
+			logGlobal->error("Unknown user event. Code %d", ev.user.code);
 			break;
 		}
 

+ 16 - 16
client/CMusicHandler.cpp

@@ -51,7 +51,7 @@ void CAudioBase::init()
 
 	if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)==-1)
 	{
-		logGlobal->errorStream() << "Mix_OpenAudio error: " << Mix_GetError();
+		logGlobal->error("Mix_OpenAudio error: %s", Mix_GetError());
 		return;
 	}
 
@@ -154,7 +154,7 @@ Mix_Chunk *CSoundHandler::GetSoundChunk(std::string &sound, bool cache)
 	}
 	catch(std::exception &e)
 	{
-		logGlobal->warnStream() << "Cannot get sound " << sound << " chunk: " << e.what();
+		logGlobal->warn("Cannot get sound %s chunk: %s", sound, e.what());
 		return nullptr;
 	}
 }
@@ -164,7 +164,7 @@ int CSoundHandler::playSound(soundBase::soundID soundID, int repeats)
 {
 	assert(soundID < soundBase::sound_after_last);
 	auto sound = sounds[soundID];
-	logGlobal->traceStream() << "Attempt to play sound " << soundID << " with file name " << sound << " with cache";
+	logGlobal->trace("Attempt to play sound %d with file name %s with cache", soundID, sound);
 
 	return playSound(sound, repeats, true);
 }
@@ -182,7 +182,7 @@ int CSoundHandler::playSound(std::string sound, int repeats, bool cache)
 		channel = Mix_PlayChannel(-1, chunk, repeats);
 		if (channel == -1)
 		{
-			logGlobal->errorStream() << "Unable to play sound file " << sound << " , error " << Mix_GetError();
+			logGlobal->error("Unable to play sound file %s , error %s", sound, Mix_GetError());
 			if (!cache)
 				Mix_FreeChunk(chunk);
 		}
@@ -314,7 +314,7 @@ void CMusicHandler::playMusicFromSet(std::string whichSet, bool loop)
 	auto selectedSet = musicsSet.find(whichSet);
 	if (selectedSet == musicsSet.end())
 	{
-		logGlobal->errorStream() << "Error: playing music from non-existing set: " << whichSet;
+		logGlobal->error("Error: playing music from non-existing set: %s", whichSet);
 		return;
 	}
 
@@ -331,14 +331,14 @@ void CMusicHandler::playMusicFromSet(std::string whichSet, int entryID, bool loo
 	auto selectedSet = musicsSet.find(whichSet);
 	if (selectedSet == musicsSet.end())
 	{
-		logGlobal->errorStream() << "Error: playing music from non-existing set: " << whichSet;
+		logGlobal->error("Error: playing music from non-existing set: %s", whichSet);
 		return;
 	}
 
 	auto selectedEntry = selectedSet->second.find(entryID);
 	if (selectedEntry == selectedSet->second.end())
 	{
-		logGlobal->errorStream() << "Error: playing non-existing entry " << entryID << " from set: " << whichSet;
+		logGlobal->error("Error: playing non-existing entry %d from set: %s", entryID, whichSet);
 		return;
 	}
 
@@ -373,8 +373,8 @@ void CMusicHandler::queueNext(CMusicHandler *owner, std::string setName, std::st
 	}
 	catch(std::exception &e)
 	{
-		logGlobal->errorStream() << "Failed to queue music. setName=" << setName << "\tmusicURI=" << musicURI;
-		logGlobal->errorStream() << "Exception: " << e.what();
+		logGlobal->error("Failed to queue music. setName=%s\tmusicURI=%s", setName, musicURI);
+		logGlobal->error("Exception: %s", e.what());
 	}
 }
 
@@ -429,7 +429,7 @@ MusicEntry::MusicEntry(CMusicHandler *owner, std::string setName, std::string mu
 }
 MusicEntry::~MusicEntry()
 {
-	logGlobal->traceStream()<<"Del-ing music file "<<currentName;
+	logGlobal->trace("Del-ing music file %s", currentName);
 	if (music)
 		Mix_FreeMusic(music);
 }
@@ -438,14 +438,14 @@ void MusicEntry::load(std::string musicURI)
 {
 	if (music)
 	{
-		logGlobal->traceStream()<<"Del-ing music file "<<currentName;
+		logGlobal->trace("Del-ing music file %s", currentName);
 		Mix_FreeMusic(music);
 		music = nullptr;
 	}
 
 	currentName = musicURI;
 
-	logGlobal->traceStream()<<"Loading music file "<<musicURI;
+	logGlobal->trace("Loading music file %s", musicURI);
 
 	auto musicFile = MakeSDLRWops(CResourceHandler::get()->load(ResourceID(std::move(musicURI), EResType::MUSIC)));
 
@@ -453,7 +453,7 @@ void MusicEntry::load(std::string musicURI)
 
 	if(!music)
 	{
-		logGlobal->warnStream() << "Warning: Cannot open " << currentName << ": " << Mix_GetError();
+		logGlobal->warn("Warning: Cannot open %s: %s", currentName, Mix_GetError());
 		return;
 	}
 }
@@ -469,10 +469,10 @@ bool MusicEntry::play()
 		load(RandomGeneratorUtil::nextItem(set, CRandomGenerator::getDefault())->second);
 	}
 
-	logGlobal->traceStream()<<"Playing music file "<<currentName;
+	logGlobal->trace("Playing music file %s", currentName);
 	if(Mix_PlayMusic(music, 1) == -1)
 	{
-		logGlobal->errorStream() << "Unable to play music (" << Mix_GetError() << ")";
+		logGlobal->error("Unable to play music (%s)", Mix_GetError());
 		return false;
 	}
 	return true;
@@ -482,7 +482,7 @@ bool MusicEntry::stop(int fade_ms)
 {
 	if (Mix_PlayingMusic())
 	{
-		logGlobal->traceStream()<<"Stopping music file "<<currentName;
+		logGlobal->trace("Stopping music file %s", currentName);
 		loop = 0;
 		Mix_FadeOutMusic(fade_ms);
 		return true;

+ 11 - 11
client/CPlayerInterface.cpp

@@ -110,7 +110,7 @@ struct HeroObjectRetriever : boost::static_visitor<const CGHeroInstance *>
 
 CPlayerInterface::CPlayerInterface(PlayerColor Player)
 {
-	logGlobal->traceStream() << "\tHuman player interface for player " << Player << " being constructed";
+	logGlobal->trace("\tHuman player interface for player %s being constructed", Player.getStr(false));
 	destinationTeleport = ObjectInstanceID();
 	destinationTeleportPos = int3(-1);
 	howManyPeople++;
@@ -136,7 +136,7 @@ CPlayerInterface::CPlayerInterface(PlayerColor Player)
 
 CPlayerInterface::~CPlayerInterface()
 {
-	logGlobal->traceStream() << "\tHuman player interface for player " << playerID << " being destructed";
+	logGlobal->trace("\tHuman player interface for player %s being destructed", playerID.getStr(false));
 	//howManyPeople--;
 	delete showingDialog;
 	delete cingconsole;
@@ -358,10 +358,10 @@ void CPlayerInterface::heroMoved(const TryMoveHero & details)
 		{
 			//evil returns here ...
 			//todo: get rid of it
-			logGlobal->traceStream() << "before [un]locks in " << __FUNCTION__;
+			logGlobal->trace("before [un]locks in %s", __FUNCTION__);
 			auto unlockPim = vstd::makeUnlockGuard(*pim); //let frame to be rendered
 			GH.mainFPSmng->framerateDelay(); //for animation purposes
-			logGlobal->traceStream() << "after [un]locks in " << __FUNCTION__;
+			logGlobal->trace("after [un]locks in %s", __FUNCTION__);
 		}
 		//CSDL_Ext::update(screen);
 
@@ -808,7 +808,7 @@ void CPlayerInterface::actionFinished(const BattleAction &action)
 BattleAction CPlayerInterface::activeStack(const CStack * stack) //called when it's turn of that stack
 {
 	THREAD_CREATED_BY_CLIENT;
-	logGlobal->traceStream() << "Awaiting command for " << stack->nodeName();
+	logGlobal->trace("Awaiting command for %s", stack->nodeName());
 	auto stackId = stack->ID;
 	auto stackName = stack->nodeName();
 	if (autofightingAI)
@@ -856,10 +856,10 @@ BattleAction CPlayerInterface::activeStack(const CStack * stack) //called when i
 	{
 		if (stackId != ret.stackNumber)
 			logGlobal->error("Not current active stack action canceled");
-		logGlobal->traceStream() << "Canceled command for " << stackName;
+		logGlobal->trace("Canceled command for %s", stackName);
 	}
 	else
-		logGlobal->traceStream() << "Giving command for " << stackName;
+		logGlobal->trace("Giving command for %s", stackName);
 
 	return ret;
 }
@@ -1362,7 +1362,7 @@ template <typename Handler> void CPlayerInterface::serializeTempl( Handler &h, c
 			if (p.second.nodes.size())
 				pathsMap[p.first] = p.second.endPos();
 			else
-				logGlobal->errorStream() << p.first->name << " has assigned an empty path! Ignoring it...";
+				logGlobal->debug("%s has assigned an empty path! Ignoring it...", p.first->name);
 		}
 		h & pathsMap;
 	}
@@ -1398,7 +1398,7 @@ void CPlayerInterface::loadGame( BinaryDeserializer & h, const int version )
 
 void CPlayerInterface::moveHero( const CGHeroInstance *h, CGPath path )
 {
-	logGlobal->traceStream() << __FUNCTION__;
+	LOG_TRACE(logGlobal);
 	if (!LOCPLINT->makingTurn)
 		return;
 	if (!h)
@@ -2857,7 +2857,7 @@ void CPlayerInterface::doMoveHero(const CGHeroInstance * h, CGPath path)
 
 			assert(h->pos.z == nextCoord.z); // Z should change only if it's movement via teleporter and in this case this code shouldn't be executed at all
 			int3 endpos(nextCoord.x, nextCoord.y, h->pos.z);
-			logGlobal->traceStream() << "Requesting hero movement to " << endpos;
+			logGlobal->trace("Requesting hero movement to %s", endpos());
 
 			bool useTransit = false;
 			if ((i-2 >= 0) // Check there is node after next one; otherwise transit is pointless
@@ -2871,7 +2871,7 @@ void CPlayerInterface::doMoveHero(const CGHeroInstance * h, CGPath path)
 
 			doMovement(endpos, useTransit);
 
-			logGlobal->traceStream() << "Resuming " << __FUNCTION__;
+			logGlobal->trace("Resuming %s", __FUNCTION__);
 			bool guarded = cb->isInTheMap(cb->getGuardingCreaturePosition(endpos - int3(1, 0, 0)));
 			if ((!useTransit && guarded) || showingDialog->get() == true) // Abort movement if a guard was fought or there is a dialog to display (Mantis #1136)
 				break;

+ 8 - 8
client/CPreGame.cpp

@@ -358,7 +358,7 @@ static std::function<void()> genCommand(CMenuScreen* menu, std::vector<std::stri
 			}
 		}
 	}
-	logGlobal->errorStream()<<"Failed to parse command: "<<string;
+	logGlobal->error("Failed to parse command: %s", string);
 	return std::function<void()>();
 }
 
@@ -538,7 +538,7 @@ void CGPreGame::openCampaignScreen(std::string name)
 		GH.pushInt(new CCampaignScreen(CGPreGameConfig::get().getCampaigns()[name]));
 		return;
 	}
-	logGlobal->errorStream()<<"Unknown campaign set: "<<name;
+	logGlobal->error("Unknown campaign set: %s", name);
 }
 
 CGPreGame *CGPreGame::create()
@@ -942,7 +942,7 @@ void CSelectionScreen::handleConnection()
 		{
 			CPackForSelectionScreen *pack = nullptr;
 			*serv >> pack;
-			logNetwork->traceStream() << "Received a pack of type " << typeid(*pack).name();
+			logNetwork->trace("Received a pack of type %s", typeid(*pack).name());
 			assert(pack);
 			if(QuitMenuWithoutStarting *endingPack = dynamic_cast<QuitMenuWithoutStarting *>(pack))
 			{
@@ -1130,7 +1130,7 @@ void SelectionTab::parseMaps(const std::unordered_set<ResourceID> &files)
 		}
 		catch(std::exception & e)
 		{
-			logGlobal->errorStream() << "Map " << file.getName() << " is invalid. Message: " << e.what();
+			logGlobal->error("Map %s is invalid. Message: %s", file.getName(), e.what());
 		}
 	}
 }
@@ -1183,7 +1183,7 @@ void SelectionTab::parseGames(const std::unordered_set<ResourceID> &files, CMenu
 		}
 		catch(const std::exception & e)
 		{
-			logGlobal->errorStream() << "Error: Failed to process " << file.getName() <<": " << e.what();
+			logGlobal->error("Error: Failed to process %s: %s", file.getName(), e.what());
 		}
 	}
 }
@@ -1494,7 +1494,7 @@ void SelectionTab::printMaps(SDL_Surface *to)
 				break;
 			default:
 				// Unknown version. Be safe and ignore that map
-				logGlobal->warnStream() << "Warning: " << currentItem->fileURI << " has wrong version!";
+				logGlobal->warn("Warning: %s has wrong version!", currentItem->fileURI);
 				continue;
 			}
 			IImage * icon = formatIcons->getImage(frame,group);
@@ -1824,7 +1824,7 @@ void CRandomMapTab::addButtonsToGroup(CToggleGroup * group, const std::vector<st
 
 void CRandomMapTab::deactivateButtonsFrom(CToggleGroup * group, int startId)
 {
-	logGlobal->infoStream() << "Blocking buttons from " << startId;
+	logGlobal->debug("Blocking buttons from %d", startId);
 	for(auto toggle : group->buttons)
 	{
 		if (auto button = dynamic_cast<CToggleButton*>(toggle.second))
@@ -3722,7 +3722,7 @@ void CBonusSelection::startMap()
 	{
 		auto exitCb = [=]()
 		{
-			logGlobal->infoStream() << "Starting scenario " << selectedMap;
+			logGlobal->info("Starting scenario %d", selectedMap);
             CGP->showLoadingScreen(std::bind(&startGame, si, (CConnection *)nullptr));
 		};
 

+ 1 - 1
client/CVideoHandler.cpp

@@ -99,7 +99,7 @@ bool CVideoPlayer::open(std::string fname, bool loop, bool useOverlay, bool scal
 
 	if (!CResourceHandler::get()->existsResource(resource))
 	{
-		logGlobal->errorStream() << "Error: video " << resource.getName() << " was not found";
+		logGlobal->error("Error: video %s was not found", resource.getName());
 		return false;
 	}
 

+ 6 - 7
client/Client.cpp

@@ -152,7 +152,7 @@ void CClient::waitForMoveAndSend(PlayerColor color)
 		BattleAction ba = battleints[color]->activeStack(gs->curB->battleGetStackByID(gs->curB->activeStack, false));
 		if(ba.actionType != Battle::CANCEL)
 		{
-			logNetwork->traceStream() << "Send battle action to server: " << ba;
+			logNetwork->trace("Send battle action to server: %s", ba.toString());
 			MakeAction temp_action(ba);
 			sendRequest(&temp_action, color);
 		}
@@ -301,7 +301,7 @@ void CClient::loadGame(const std::string & fname, const bool server, const std::
 	}
 	catch(std::exception &e)
 	{
-		logGlobal->errorStream() << "Cannot load game " << fname << ". Error: " << e.what();
+		logGlobal->error("Cannot load game %s. Error: %s", fname, e.what());
 		throw; //obviously we cannot continue here
 	}
 
@@ -367,7 +367,7 @@ void CClient::loadGame(const std::string & fname, const bool server, const std::
 // 	{
 // 		auto o = gs->map->objects[i];
 // 		if(o)
-// 			logGlobal->traceStream() << boost::format("\tindex=%5d, id=%5d; address=%5d, pos=%s, name=%s") % i % o->id % (int)o.get() % o->pos % o->getHoverText();
+// 			logGlobal->trace("\tindex=%5d, id=%5d; address=%5d, pos=%s, name=%s", i, o->id, (int)o.get(), o->pos, o->getHoverText());
 // 		else
 // 			logGlobal->trace("\tindex=%5d --- nullptr", i);
 // 	}
@@ -454,7 +454,7 @@ void CClient::newGame( CConnection *con, StartInfo *si )
 		if(!vstd::contains(myPlayers, color))
 			continue;
 
-		logNetwork->traceStream() << "Preparing interface for player " << color;
+		logNetwork->trace("Preparing interface for player %s", color.getStr(false));
 		if(elem.second.playerID == PlayerSettings::PLAYER_AI)
 		{
 			auto AiToGive = aiNameForPlayer(elem.second, false);
@@ -882,8 +882,7 @@ int CClient::sendRequest(const CPack *request, PlayerColor player)
 	static ui32 requestCounter = 0;
 
 	ui32 requestID = requestCounter++;
-	logNetwork->traceStream() << boost::format("Sending a request \"%s\". It'll have an ID=%d.")
-				% typeid(*request).name() % requestID;
+	logNetwork->trace("Sending a request \"%s\". It'll have an ID=%d.", typeid(*request).name(), requestID);
 
 	waitingRequest.pushBack(requestID);
 	serv->sendPackToServer(*request, player, requestID);
@@ -1118,7 +1117,7 @@ void CServerHandler::callServer()
 	else
 	{
 		logNetwork->error("Error: server failed to close correctly or crashed!");
-		logNetwork->errorStream() << "Check " << logName << " for more info";
+		logNetwork->error("Check %s for more info", logName);
 		exit(1);// exit in case of error. Othervice without working server VCMI will hang
 	}
 #endif

+ 1 - 1
client/Graphics.cpp

@@ -291,7 +291,7 @@ void Graphics::blueToPlayersAdv(SDL_Surface * sur, PlayerColor player)
 		}
 		else
 		{
-			logGlobal->errorStream() << "Wrong player id in blueToPlayersAdv (" << player << ")!";
+			logGlobal->error("Wrong player id in blueToPlayersAdv (%s)!", player.getStr(false));
 			return;
 		}
 		SDL_SetColors(sur, palette, 224, 32);

+ 5 - 5
client/NetPacksClient.cpp

@@ -122,7 +122,7 @@ void SetPrimSkill::applyCl(CClient *cl)
 	const CGHeroInstance *h = cl->getHero(id);
 	if(!h)
 	{
-		logNetwork->errorStream() << "Cannot find hero with ID " << id.getNum();
+		logNetwork->error("Cannot find hero with ID %d", id.getNum());
 		return;
 	}
 	INTERFACE_CALL_IF_PRESENT(h->tempOwner,heroPrimarySkillChanged,h,which,val);
@@ -133,7 +133,7 @@ void SetSecSkill::applyCl(CClient *cl)
 	const CGHeroInstance *h = cl->getHero(id);
 	if(!h)
 	{
-		logNetwork->errorStream() << "Cannot find hero with ID " << id;
+		logNetwork->error("Cannot find hero with ID %d", id.getNum());
 		return;
 	}
 	INTERFACE_CALL_IF_PRESENT(h->tempOwner,heroSecondarySkillChanged,h,which,val);
@@ -784,7 +784,7 @@ void SystemMessage::applyCl(CClient *cl)
 	std::ostringstream str;
 	str << "System message: " << text;
 
-	logNetwork->errorStream() << str.str(); // usually used to receive error messages from server
+	logNetwork->error(str.str()); // usually used to receive error messages from server
 	if(LOCPLINT && !settings["session"]["hideSystemMessages"].Bool())
 		LOCPLINT->cingconsole->print(str.str());
 }
@@ -813,13 +813,13 @@ void SaveGame::applyCl(CClient *cl)
 	}
 	catch(std::exception &e)
 	{
-		logNetwork->errorStream() << "Failed to save game:" << e.what();
+		logNetwork->error("Failed to save game:%s", e.what());
 	}
 }
 
 void PlayerMessage::applyCl(CClient *cl)
 {
-	logNetwork->debugStream() << "Player "<< player <<" sends a message: " << text;
+	logNetwork->debug("Player %s sends a message: %s", player.getStr(false), text);
 
 	std::ostringstream str;
 	if(player.isSpectator())

+ 5 - 5
client/battle/CBattleAnimations.cpp

@@ -283,7 +283,7 @@ void CDefenceAnimation::endAnim()
 CDummyAnimation::CDummyAnimation(CBattleInterface * _owner, int howManyFrames)
 : CBattleAnimation(_owner), counter(0), howMany(howManyFrames)
 {
-	logAnim->debugStream() << "Created dummy animation for " << howManyFrames <<" frames";
+	logAnim->debug("Created dummy animation for %d frames", howManyFrames);
 }
 
 bool CDummyAnimation::init()
@@ -360,7 +360,7 @@ bool CMeleeAttackAnimation::init()
 		group = mutPosToGroup[mutPos];
 		break;
 	default:
-		logGlobal->errorStream()<<"Critical Error! Wrong dest in stackAttacking! dest: "<<dest<<" attacking stack pos: "<<attackingStackPosBeforeReturn<<" mutual pos: "<<mutPos;
+		logGlobal->error("Critical Error! Wrong dest in stackAttacking! dest: %d; attacking stack pos: %d; mutual pos: %d", dest.hex, attackingStackPosBeforeReturn, mutPos);
 		group = CCreatureAnim::ATTACK_FRONT;
 		break;
 	}
@@ -875,19 +875,19 @@ void CShootingAnimation::endAnim()
 CSpellEffectAnimation::CSpellEffectAnimation(CBattleInterface * _owner, ui32 _effect, BattleHex _destTile, int _dx, int _dy, bool _Vflip, bool _alignToBottom)
 	:CBattleAnimation(_owner), effect(_effect), destTile(_destTile), customAnim(""), x(-1), y(-1), dx(_dx), dy(_dy), Vflip(_Vflip), alignToBottom(_alignToBottom)
 {
-	logAnim->debugStream() << "Created spell anim for effect #" << effect;
+	logAnim->debug("Created spell anim for effect #%d", effect);
 }
 
 CSpellEffectAnimation::CSpellEffectAnimation(CBattleInterface * _owner, std::string _customAnim, int _x, int _y, int _dx, int _dy, bool _Vflip, bool _alignToBottom)
 	:CBattleAnimation(_owner), effect(-1), destTile(BattleHex::INVALID), customAnim(_customAnim), x(_x), y(_y), dx(_dx), dy(_dy), Vflip(_Vflip), alignToBottom(_alignToBottom)
 {
-	logAnim->debugStream() << "Created spell anim for " << customAnim;
+	logAnim->debug("Created spell anim for %s", customAnim);
 }
 
 CSpellEffectAnimation::CSpellEffectAnimation(CBattleInterface * _owner, std::string _customAnim, BattleHex _destTile, bool _Vflip, bool _alignToBottom)
 	:CBattleAnimation(_owner), effect(-1), destTile(_destTile), customAnim(_customAnim), x(-1), y(-1), dx(0), dy(0), Vflip(_Vflip), alignToBottom(_alignToBottom)
 {
-	logAnim->debugStream() << "Created spell anim for " << customAnim;
+	logAnim->debug("Created spell anim for %s", customAnim);
 }
 
 

+ 7 - 7
client/battle/CBattleInterface.cpp

@@ -189,9 +189,9 @@ CBattleInterface::CBattleInterface(const CCreatureSet *army1, const CCreatureSet
 	{
 		auto bfieldType = (int)curInt->cb->battleGetBattlefieldType();
 		if (graphics->battleBacks.size() <= bfieldType || bfieldType < 0)
-			logGlobal->errorStream() << bfieldType << " is not valid battlefield type index!";
+			logGlobal->error("%d is not valid battlefield type index!", bfieldType);
 		else if (graphics->battleBacks[bfieldType].empty())
-			logGlobal->errorStream() << bfieldType << " battlefield type does not have any backgrounds!";
+			logGlobal->error("%d battlefield type does not have any backgrounds!", bfieldType);
 		else
 		{
 			const std::string bgName = *RandomGeneratorUtil::nextItem(graphics->battleBacks[bfieldType], CRandomGenerator::getDefault());
@@ -718,7 +718,7 @@ void CBattleInterface::setBattleCursor(const int myNumber)
 	// Generally should NEVER happen, but to avoid the possibility of having endless loop below... [#1016]
 	if (!vstd::contains_if (sectorCursor, [](int sc) { return sc != -1; }))
 	{
-		logGlobal->errorStream() << "Error: for hex " << myNumber << " cannot find a hex to attack from!";
+		logGlobal->error("Error: for hex %d cannot find a hex to attack from!", myNumber);
 		attackingHex = -1;
 		return;
 	}
@@ -1143,7 +1143,7 @@ void CBattleInterface::giveCommand(Battle::ActionType action, BattleHex tile, ui
 
 	if (!tacticsMode)
 	{
-		logGlobal->traceStream() << "Setting command for " << (stack ? stack->nodeName() : "hero");
+		logGlobal->trace("Setting command for %s", (stack ? stack->nodeName() : "hero"));
 		myTurn = false;
 		setActiveStack(nullptr);
 		givenCommand.setn(ba);
@@ -1926,7 +1926,7 @@ void CBattleInterface::startAction(const BattleAction* action)
 	}
 	if (!stack)
 	{
-		logGlobal->errorStream()<<"Something wrong with stackNumber in actionStarted. Stack number: "<<action->stackNumber;
+		logGlobal->error("Something wrong with stackNumber in actionStarted. Stack number: %d", action->stackNumber);
 		return;
 	}
 
@@ -2715,13 +2715,13 @@ void CBattleInterface::obstaclePlaced(const CObstacleInstance & oi)
 		sound = soundBase::fireWall;
 		break;
 	default:
-		logGlobal->errorStream() << "I don't know how to animate appearing obstacle of type " << (int)oi.obstacleType;
+		logGlobal->error("I don't know how to animate appearing obstacle of type %d", (int)oi.obstacleType);
 		return;
 	}
 
 	if (effectID >= 0 && graphics->battleACToDef[effectID].empty())
 	{
-		logGlobal->errorStream() << "Cannot find def for effect type " << effectID;
+		logGlobal->error("Cannot find def for effect type %d", effectID);
 		return;
 	}
 

+ 1 - 1
client/battle/CBattleInterfaceClasses.cpp

@@ -69,7 +69,7 @@ void CBattleConsole::showAll(SDL_Surface * to)
 
 bool CBattleConsole::addText(const std::string & text)
 {
-	logGlobal->traceStream() <<"CBattleConsole message: "<<text;
+	logGlobal->trace("CBattleConsole message: %s", text);
 	if(text.size()>70)
 		return false; //text too long!
 	int firstInToken = 0;

+ 1 - 1
client/battle/CCreatureAnimation.cpp

@@ -385,7 +385,7 @@ void CCreatureAnimation::nextFrame(SDL_Surface *dest, bool attacker)
 	case 3: return nextFrameT<3>(dest, !attacker);
 	case 4: return nextFrameT<4>(dest, !attacker);
 	default:
-		logGlobal->errorStream() << (int)dest->format->BitsPerPixel << " bpp is not supported!!!";
+		logGlobal->error("%d bpp is not supported!", (int)dest->format->BitsPerPixel);
 	}
 }
 

+ 5 - 6
client/gui/CAnimation.cpp

@@ -445,7 +445,7 @@ void CDefFile::loadFrame(size_t frame, size_t group, ImageLoader &loader) const
 			break;
 		}
 	default:
-	logGlobal->errorStream()<<"Error: unsupported format of def file: "<<sprite.format;
+	logGlobal->error("Error: unsupported format of def file: %d", sprite.format);
 		break;
 	}
 }
@@ -741,7 +741,7 @@ SDLImage::SDLImage(std::string filename, bool compressed):
 
 	if (surf == nullptr)
 	{
-		logGlobal->errorStream() << "Error: failed to load image "<<filename;
+		logGlobal->error("Error: failed to load image %s", filename);
 		return;
 	}
 	else
@@ -1373,8 +1373,7 @@ CDefFile * CAnimation::getFile() const
 
 void CAnimation::printError(size_t frame, size_t group, std::string type) const
 {
-	logGlobal->errorStream() << type << " error: Request for frame not present in CAnimation! "
-		<< "\tFile name: " << name << " Group: " << group << " Frame: " << frame;
+	logGlobal->error("%s error: Request for frame not present in CAnimation! File name: %s, Group: %d, Frame: %d", type, name, group, frame);
 }
 
 CAnimation::CAnimation(std::string Name, bool Compressed):
@@ -1406,7 +1405,7 @@ CAnimation::~CAnimation()
 
 	if(!images.empty())
 	{
-		logGlobal->warnStream()<<"Warning: not all frames were unloaded from "<<name;
+		logGlobal->warn("Warning: not all frames were unloaded from %s", name);
 		for (auto & elem : images)
 			for (auto & _image : elem.second)
 				delete _image.second;
@@ -1579,7 +1578,7 @@ void CFadeAnimation::init(EMode mode, SDL_Surface * sourceSurface, bool freeSurf
 	}
 	if (animDelta <= 0.0f)
 	{
-		logGlobal->warnStream() << "Fade anim: delta should be positive; " << animDelta << " given.";
+		logGlobal->warn("Fade anim: delta should be positive; %f given.", animDelta);
 		animDelta = DEFAULT_DELTA;
 	}
 

+ 1 - 1
client/gui/CGuiHandler.cpp

@@ -461,7 +461,7 @@ void CGuiHandler::renderFrame()
 		CCS->curh->render();
 
 		if(0 != SDL_RenderCopy(mainRenderer, screenTexture, nullptr, nullptr))
-			logGlobal->errorStream() << __FUNCTION__ << " SDL_RenderCopy " << SDL_GetError();
+			logGlobal->error("%s SDL_RenderCopy %s", __FUNCTION__, SDL_GetError());
 
 		SDL_RenderPresent(mainRenderer);
 	}

+ 6 - 6
client/gui/SDL_Extensions.cpp

@@ -26,11 +26,11 @@ void SDL_UpdateRect(SDL_Surface *surface, int x, int y, int w, int h)
 {
 	Rect rect(x,y,w,h);
 	if(0 !=SDL_UpdateTexture(screenTexture, &rect, surface->pixels, surface->pitch))
-		logGlobal->errorStream() << __FUNCTION__ << "SDL_UpdateTexture " << SDL_GetError();
+		logGlobal->error("%sSDL_UpdateTexture %s", __FUNCTION__, SDL_GetError());
 
 	SDL_RenderClear(mainRenderer);
 	if(0 != SDL_RenderCopy(mainRenderer, screenTexture, NULL, NULL))
-		logGlobal->errorStream() << __FUNCTION__ << "SDL_RenderCopy " <<  SDL_GetError();
+		logGlobal->error("%sSDL_RenderCopy %s", __FUNCTION__, SDL_GetError());
 	SDL_RenderPresent(mainRenderer);
 
 }
@@ -326,7 +326,7 @@ int CSDL_Ext::blit8bppAlphaTo24bpp(const SDL_Surface * src, const SDL_Rect * src
 	case 3: return blit8bppAlphaTo24bppT<3>(src, srcRect, dst, dstRect);
 	case 4: return blit8bppAlphaTo24bppT<4>(src, srcRect, dst, dstRect);
 	default:
-		logGlobal->errorStream() << (int)dst->format->BitsPerPixel << " bpp is not supported!!!";
+		logGlobal->error("%d bpp is not supported!", (int)dst->format->BitsPerPixel);
 		return -1;
 	}
 }
@@ -349,7 +349,7 @@ void CSDL_Ext::update(SDL_Surface * what)
 	if(!what)
 		return;
 	if(0 !=SDL_UpdateTexture(screenTexture, nullptr, what->pixels, what->pitch))
-		logGlobal->errorStream() << __FUNCTION__ << "SDL_UpdateTexture " << SDL_GetError();
+		logGlobal->error("%s SDL_UpdateTexture %s", __FUNCTION__, SDL_GetError());
 }
 void CSDL_Ext::drawBorder(SDL_Surface * sur, int x, int y, int w, int h, const int3 &color)
 {
@@ -428,7 +428,7 @@ case BytesPerPixel:									\
 		CASE_BPP(3)
 		CASE_BPP(4)
 	default:
-		logGlobal->errorStream() << (int)dest->format->BitsPerPixel << "bpp is not supported!";
+		logGlobal->error("%d bpp is not supported!", (int)dest->format->BitsPerPixel);
 		return nullptr;
 	}
 
@@ -442,7 +442,7 @@ TColorPutterAlpha CSDL_Ext::getPutterAlphaFor(SDL_Surface * const &dest, int inc
 		CASE_BPP(3)
 		CASE_BPP(4)
 	default:
-		logGlobal->errorStream() << (int)dest->format->BitsPerPixel << "bpp is not supported!";
+		logGlobal->error("%d bpp is not supported!", (int)dest->format->BitsPerPixel);
 		return nullptr;
 	}
 #undef CASE_BPP

+ 6 - 7
client/mapHandler.cpp

@@ -755,7 +755,7 @@ void CMapHandler::CMapBlitter::drawObjects(SDL_Surface * targetSurf, const Terra
 				fade->draw(targetSurf, nullptr, &r2);
 				continue;
 			}
-			logGlobal->errorStream() << "Fading map object with missing fade anim : " << object.fadeAnimKey;
+			logGlobal->error("Fading map object with missing fade anim : %d", object.fadeAnimKey);
 			continue;
 		}
 
@@ -967,7 +967,7 @@ CMapHandler::AnimBitmapHolder CMapHandler::CMapBlitter::findHeroBitmap(const CGH
 	{
 		if(hero->tempOwner >= PlayerColor::PLAYER_LIMIT) //Neutral hero?
 		{
-			logGlobal->errorStream() << "A neutral hero (" << hero->name << ") at " << hero->pos << ". Should not happen!";
+			logGlobal->error("A neutral hero (%s) at %s. Should not happen!", hero->name, hero->pos());
 			return CMapHandler::AnimBitmapHolder();
 		}
 
@@ -1025,7 +1025,7 @@ IImage * CMapHandler::CMapBlitter::findBoatFlagBitmap(const CGBoat * boat, int a
 	int boatType = boat->subID;
 	if(boatType < 0 || boatType >= graphics->boatFlagAnimations.size())
 	{
-		logGlobal->errorStream() << "Not supported boat subtype: " << boat->subID;
+		logGlobal->error("Not supported boat subtype: %d", boat->subID);
 		return nullptr;
 	}
 
@@ -1035,7 +1035,7 @@ IImage * CMapHandler::CMapBlitter::findBoatFlagBitmap(const CGBoat * boat, int a
 
 	if(colorIndex < 0 || colorIndex >= subtypeFlags.size())
 	{
-		logGlobal->errorStream() << "Invalid player color " << colorIndex;
+		logGlobal->error("Invalid player color %d", colorIndex);
 		return nullptr;
 	}
 
@@ -1138,7 +1138,7 @@ bool CMapHandler::updateObjectsFade()
 			{
 				if ((*objIter).fadeAnimKey == (*iter).first)
 				{
-					logAnim->traceStream() << "Fade anim finished for obj at " << pos << "; remaining: " << (fadeAnims.size() - 1);
+					logAnim->trace("Fade anim finished for obj at %s; remaining: %d", pos(), fadeAnims.size() - 1);
 					if (anim->fadingMode == CFadeAnimation::EMode::OUT)
 						objs.erase(objIter); // if this was fadeout, remove the object from the map
 					else
@@ -1185,8 +1185,7 @@ bool CMapHandler::startObjectFade(TerrainTileObject & obj, bool in, int3 pos)
 		fadeAnims[++fadeAnimCounter] = std::pair<int3, CFadeAnimation*>(pos, anim);
 		obj.fadeAnimKey = fadeAnimCounter;
 
-		logAnim->traceStream() << "Fade anim started for obj " << obj.obj->ID
-							   << " at " << pos << "; anim count: " << fadeAnims.size();
+		logAnim->trace("Fade anim started for obj %d at %s; anim count: %d", obj.obj->ID, pos(), fadeAnims.size());
 		return true;
 	}
 

+ 1 - 1
client/widgets/AdventureMapClasses.cpp

@@ -503,7 +503,7 @@ std::map<int, std::pair<SDL_Color, SDL_Color> > CMinimap::loadColors(std::string
 		auto index = boost::find(GameConstants::TERRAIN_NAMES, m.first);
 		if (index == std::end(GameConstants::TERRAIN_NAMES))
 		{
-			logGlobal->errorStream() << "Error: unknown terrain in terrains.json: " << m.first;
+			logGlobal->error("Error: unknown terrain in terrains.json: %s", m.first);
 			continue;
 		}
 		int terrainID = index - std::begin(GameConstants::TERRAIN_NAMES);

+ 2 - 2
client/widgets/Buttons.cpp

@@ -117,12 +117,12 @@ void CButton::block(bool on)
 void CButton::onButtonClicked()
 {
 	// debug logging to figure out pressed button (and as result - player actions) in case of crash
-	logAnim->traceStream() << "Button clicked at " << pos.x << "x" << pos.y;
+	logAnim->trace("Button clicked at %dx%d", pos.x, pos.y);
 	CIntObject * parent = this->parent;
 	std::string prefix = "Parent is";
 	while (parent)
 	{
-		logAnim->traceStream() << prefix << typeid(*parent).name() << " at " << parent->pos.x << "x" << parent->pos.y;
+		logAnim->trace("%s%s at %dx%d", prefix, typeid(*parent).name(), parent->pos.x, parent->pos.y);
 		parent = parent->parent;
 		prefix = '\t' + prefix;
 	}

+ 2 - 6
client/widgets/CArtifactHolder.cpp

@@ -229,11 +229,7 @@ bool CHeroArtPlace::askToAssemble(const CArtifactInstance *art, ArtifactPosition
 			0);
 
 		if(assemblyPossibilities.size() > 2)
-		{
-			logGlobal->warnStream() << boost::format(
-				"More than one possibility of assembling on %s... taking only first")
-				% art->artType->Name();
-		}
+			logGlobal->warn("More than one possibility of assembling on %s... taking only first", art->artType->Name());
 		return true;
 	}
 	return false;
@@ -821,7 +817,7 @@ CHeroArtPlace * CArtifactsOfHero::getArtPlace(int slot)
 	{
 		if(artWorn.find(ArtifactPosition(slot)) == artWorn.end())
 		{
-			logGlobal->errorStream() << "CArtifactsOfHero::getArtPlace: invalid slot " << slot;
+			logGlobal->error("CArtifactsOfHero::getArtPlace: invalid slot %d", slot);
 			return nullptr;
 		}
 

+ 1 - 1
client/widgets/CGarrisonInt.cpp

@@ -63,7 +63,7 @@ void CGarrisonSlot::hover (bool on)
 				}
 				else
 				{
-					logGlobal->warnStream() << "Warning - shouldn't be - highlighted void slot "<<owner->getSelection();
+					logGlobal->warn("Warning - shouldn't be - highlighted void slot %d", owner->getSelection()->ID.getNum());
 					logGlobal->warn("Highlighted set to nullptr");
 					owner->selectSlot(nullptr);
 				}

+ 1 - 1
client/widgets/Images.cpp

@@ -297,7 +297,7 @@ void CAnimImage::setFrame(size_t Frame, size_t Group)
 		}
 	}
 	else
-		logGlobal->errorStream() << "Error: accessing unavailable frame " << Group << ":" << Frame << " in CAnimation!";
+		logGlobal->error("Error: accessing unavailable frame %d:%d in CAnimation!", Group, Frame);
 }
 
 void CAnimImage::playerColored(PlayerColor currPlayer)

+ 1 - 1
client/widgets/MiscWidgets.cpp

@@ -234,7 +234,7 @@ void CArmyTooltip::init(const InfoAboutArmy &army)
 	{
 		if(slot.first.getNum() >= GameConstants::ARMY_SIZE)
 		{
-			logGlobal->warnStream() << "Warning: " << army.name << " has stack in slot " << slot.first;
+			logGlobal->warn("%s has stack in slot %d", army.name, slot.first.getNum());
 			continue;
 		}
 

+ 1 - 1
client/widgets/TextControls.cpp

@@ -592,7 +592,7 @@ void CTextInput::numberFilter(std::string & text, const std::string & oldText, i
 	catch(boost::bad_lexical_cast &)
 	{
 		//Should never happen. Unless I missed some cases
-		logGlobal->warnStream() << "Warning: failed to convert "<< text << " to number!";
+		logGlobal->warn("Warning: failed to convert %s to number!", text);
 		text = oldText;
 	}
 }

+ 1 - 1
client/windows/CAdvmapInterface.cpp

@@ -440,7 +440,7 @@ int3 CTerrainRect::tileCountOnScreen()
 	switch (adventureInt->mode)
 	{
 	default:
-		logGlobal->errorStream() << "Unhandled map mode " << (int)adventureInt->mode;
+		logGlobal->error("Unknown map mode %d", (int)adventureInt->mode);
 		return int3();
 	case EAdvMapMode::NORMAL:
 		return int3(tilesw, tilesh, 1);

+ 4 - 4
client/windows/CCastleInterface.cpp

@@ -229,7 +229,7 @@ std::string CBuildingRect::getSubtitle()//hover text for building
 		}
 		else
 		{
-			logGlobal->warnStream() << "Problem: dwelling with id " << bid << " offers no creatures!";
+			logGlobal->warn("Dwelling with id %d offers no creatures!", bid);
 			return "#ERROR#";
 		}
 	}
@@ -600,7 +600,7 @@ const CGHeroInstance* CCastleBuildings::getHero()
 
 void CCastleBuildings::buildingClicked(BuildingID building)
 {
-	logGlobal->traceStream()<<"You've clicked on "<<building;
+	logGlobal->trace("You've clicked on %d", (int)building.toEnum());
 	const CBuilding *b = town->town->buildings.find(building)->second;
 
 	if(building >= BuildingID::DWELL_FIRST)
@@ -1183,7 +1183,7 @@ void CCastleInterface::keyPressed( const SDL_KeyboardEvent & key )
 			for(const CStructure * str : town->town->clientInfo.structures)
 			{
 				if (str->building)
-					logGlobal->errorStream() << int(str->building->bid) << " -> " << int(str->pos.z);
+					logGlobal->error("%d -> %d", int(str->building->bid), int(str->pos.z));
 			}
 		}
 		break;
@@ -1199,7 +1199,7 @@ void CCastleInterface::keyPressed( const SDL_KeyboardEvent & key )
 			for(const CStructure * str : town->town->clientInfo.structures)
 			{
 				if (str->building)
-					logGlobal->errorStream() << int(str->building->bid) << " -> " << int(str->pos.z);
+					logGlobal->error("%d -> %d", int(str->building->bid), int(str->pos.z));
 			}
 
 		}

+ 11 - 4
lib/battle/BattleAction.cpp

@@ -92,11 +92,18 @@ BattleAction BattleAction::makeEndOFTacticPhase(ui8 side)
 	return ba;
 }
 
-std::ostream & operator<<(std::ostream & os, const BattleAction & ba)
+std::string BattleAction::toString() const
 {
 	std::stringstream actionTypeStream;
-	actionTypeStream << ba.actionType;
+	actionTypeStream << actionType;
+
+	boost::format fmt("{BattleAction: side '%d', stackNumber '%d', actionType '%s', destinationTile '%s', additionalInfo '%d', selectedStack '%d'}");
+	fmt % static_cast<int>(side) % stackNumber % actionTypeStream.str() % destinationTile % additionalInfo % selectedStack;
+	return fmt.str();
+}
 
-	return os << boost::str(boost::format("{BattleAction: side '%d', stackNumber '%d', actionType '%s', destinationTile '%s', additionalInfo '%d', selectedStack '%d'}")
-			% static_cast<int>(ba.side) % ba.stackNumber % actionTypeStream.str() % ba.destinationTile % ba.additionalInfo % ba.selectedStack);
+std::ostream & operator<<(std::ostream & os, const BattleAction & ba)
+{
+	os << ba.toString();
+	return os;
 }

+ 3 - 1
lib/battle/BattleAction.h

@@ -42,6 +42,8 @@ struct DLL_LINKAGE BattleAction
 	static BattleAction makeShotAttack(const CStack * shooter, const CStack * target);
 	static BattleAction makeMove(const CStack * stack, BattleHex dest);
 	static BattleAction makeEndOFTacticPhase(ui8 side);
+
+	std::string toString() const;
 };
 
-DLL_EXPORT std::ostream & operator<<(std::ostream & os, const BattleAction & ba);
+DLL_EXPORT std::ostream & operator<<(std::ostream & os, const BattleAction & ba); //todo: remove

+ 1 - 1
lib/filesystem/CArchiveLoader.cpp

@@ -45,7 +45,7 @@ CArchiveLoader::CArchiveLoader(std::string _mountPoint, boost::filesystem::path
 	else
 		throw std::runtime_error("LOD archive format unknown. Cannot deal with " + archive.string());
 
-	logGlobal->traceStream() << ext << "Archive \""<<archive.filename()<<"\" loaded (" << entries.size() << " files found).";
+	logGlobal->trace("%sArchive \"%s\" loaded (%d files found).", ext, archive.filename(), entries.size());
 }
 
 void CArchiveLoader::initLODArchive(const std::string &mountPoint, CFileInputStream & fileStream)