aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Logging/AppenderFile.cpp
diff options
context:
space:
mode:
authorNay <dnpd.dd@gmail.com>2013-01-28 01:04:37 +0000
committerNay <dnpd.dd@gmail.com>2013-01-28 01:04:37 +0000
commitb404e0bec1d39a90a516ed935d882faa47e54a04 (patch)
tree575ae3ed3c0a631dc8a1b2ca2f824161c65e73b1 /src/server/shared/Logging/AppenderFile.cpp
parenta3d07b5e6ac45c23ec4116028c4bccae9307083b (diff)
parentda080ac4e796be6039a239b7e035ead02e73b333 (diff)
Merge remote-tracking branch 'origin/master' into 4.3.4
Conflicts: dep/PackageList.txt src/server/game/Battlegrounds/Battleground.cpp src/server/game/Combat/ThreatManager.cpp src/server/game/Entities/Object/Object.cpp src/server/game/Entities/Player/Player.cpp src/server/game/Entities/Unit/Unit.cpp src/server/game/Handlers/BattleGroundHandler.cpp src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp src/server/game/Movement/Spline/MoveSplineInit.cpp src/server/game/Spells/Auras/SpellAuraEffects.cpp src/server/game/Spells/SpellEffects.cpp src/server/game/World/World.cpp src/server/game/World/World.h src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h src/server/scripts/Spells/spell_druid.cpp src/server/scripts/Spells/spell_mage.cpp src/server/scripts/Spells/spell_paladin.cpp src/server/scripts/Spells/spell_priest.cpp src/server/scripts/Spells/spell_rogue.cpp src/server/scripts/Spells/spell_shaman.cpp src/server/scripts/Spells/spell_warlock.cpp src/server/scripts/Spells/spell_warrior.cpp src/tools/map_extractor/CMakeLists.txt src/tools/map_extractor/System.cpp src/tools/map_extractor/loadlib.cpp src/tools/map_extractor/mpq_libmpq.cpp src/tools/map_extractor/mpq_libmpq04.h src/tools/vmap4_assembler/CMakeLists.txt src/tools/vmap4_extractor/CMakeLists.txt src/tools/vmap4_extractor/mpq_libmpq.cpp src/tools/vmap4_extractor/mpq_libmpq04.h
Diffstat (limited to 'src/server/shared/Logging/AppenderFile.cpp')
-rw-r--r--src/server/shared/Logging/AppenderFile.cpp70
1 files changed, 44 insertions, 26 deletions
diff --git a/src/server/shared/Logging/AppenderFile.cpp b/src/server/shared/Logging/AppenderFile.cpp
index 8189237bb4e..25141815de6 100644
--- a/src/server/shared/Logging/AppenderFile.cpp
+++ b/src/server/shared/Logging/AppenderFile.cpp
@@ -18,58 +18,76 @@
#include "AppenderFile.h"
#include "Common.h"
-AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, const char* _filename, const char* _logDir, const char* _mode, AppenderFlags _flags)
- : Appender(id, name, APPENDER_FILE, level, _flags)
- , filename(_filename)
- , logDir(_logDir)
- , mode(_mode)
+AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, const char* _filename, const char* _logDir, const char* _mode, AppenderFlags _flags, uint64 fileSize):
+ Appender(id, name, APPENDER_FILE, level, _flags),
+ filename(_filename),
+ logDir(_logDir),
+ mode(_mode),
+ maxFileSize(fileSize),
+ fileSize(0),
+ logfile(NULL)
{
dynamicName = std::string::npos != filename.find("%s");
backup = _flags & APPENDER_FLAGS_MAKE_FILE_BACKUP;
- logfile = !dynamicName ? OpenFile(_filename, _mode, backup) : NULL;
+ logfile = !dynamicName ? OpenFile(_filename, _mode, mode == "w" && backup) : NULL;
}
AppenderFile::~AppenderFile()
{
- if (logfile)
- {
- fclose(logfile);
- logfile = NULL;
- }
+ CloseFile();
}
void AppenderFile::_write(LogMessage const& message)
{
+ bool exceedMaxSize = maxFileSize > 0 && (fileSize + message.Size()) > maxFileSize;
+
if (dynamicName)
{
char namebuf[TRINITY_PATH_MAX];
snprintf(namebuf, TRINITY_PATH_MAX, filename.c_str(), message.param1.c_str());
- logfile = OpenFile(namebuf, mode, backup);
+ logfile = OpenFile(namebuf, mode, backup || exceedMaxSize);
}
+ else if (exceedMaxSize)
+ logfile = OpenFile(filename, "w", true);
- if (logfile)
- {
- fprintf(logfile, "%s%s", message.prefix.c_str(), message.text.c_str());
- fflush(logfile);
+ if (!logfile)
+ return;
- if (dynamicName)
- {
- fclose(logfile);
- logfile = NULL;
- }
- }
+ fprintf(logfile, "%s%s", message.prefix.c_str(), message.text.c_str());
+ fflush(logfile);
+ fileSize += message.Size();
+
+ if (dynamicName)
+ CloseFile();
}
FILE* AppenderFile::OpenFile(std::string const &filename, std::string const &mode, bool backup)
{
- if (mode == "w" && backup)
+ std::string fullName(logDir + filename);
+ if (backup)
{
- std::string newName(filename);
+ CloseFile();
+ std::string newName(fullName);
newName.push_back('.');
newName.append(LogMessage::getTimeStr(time(NULL)));
- rename(filename.c_str(), newName.c_str()); // no error handling... if we couldn't make a backup, just ignore
+ rename(fullName.c_str(), newName.c_str()); // no error handling... if we couldn't make a backup, just ignore
}
- return fopen((logDir + filename).c_str(), mode.c_str());
+ if (FILE* ret = fopen(fullName.c_str(), mode.c_str()))
+ {
+ fileSize = ftell(ret);
+ return ret;
+ }
+
+ return NULL;
+}
+
+void AppenderFile::CloseFile()
+{
+ if (logfile)
+ {
+ fclose(logfile);
+ logfile = NULL;
+ }
}