aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Logging
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
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')
-rw-r--r--src/server/shared/Logging/Appender.h6
-rw-r--r--src/server/shared/Logging/AppenderFile.cpp70
-rw-r--r--src/server/shared/Logging/AppenderFile.h5
-rw-r--r--src/server/shared/Logging/Log.cpp28
4 files changed, 70 insertions, 39 deletions
diff --git a/src/server/shared/Logging/Appender.h b/src/server/shared/Logging/Appender.h
index a8854a8abc6..08628948b90 100644
--- a/src/server/shared/Logging/Appender.h
+++ b/src/server/shared/Logging/Appender.h
@@ -123,6 +123,12 @@ struct LogMessage
std::string prefix;
std::string param1;
time_t mtime;
+
+ ///@ Returns size of the log message content in bytes
+ uint32 Size() const
+ {
+ return prefix.size() + text.size();
+ }
};
class Appender
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;
+ }
}
diff --git a/src/server/shared/Logging/AppenderFile.h b/src/server/shared/Logging/AppenderFile.h
index a3fe285cc7d..c15974799e1 100644
--- a/src/server/shared/Logging/AppenderFile.h
+++ b/src/server/shared/Logging/AppenderFile.h
@@ -23,11 +23,12 @@
class AppenderFile: public Appender
{
public:
- AppenderFile(uint8 _id, std::string const& _name, LogLevel level, const char* filename, const char* logDir, const char* mode, AppenderFlags flags);
+ AppenderFile(uint8 _id, std::string const& _name, LogLevel level, const char* filename, const char* logDir, const char* mode, AppenderFlags flags, uint64 maxSize);
~AppenderFile();
FILE* OpenFile(std::string const& _name, std::string const& _mode, bool _backup);
private:
+ void CloseFile();
void _write(LogMessage const& message);
FILE* logfile;
std::string filename;
@@ -35,6 +36,8 @@ class AppenderFile: public Appender
std::string mode;
bool dynamicName;
bool backup;
+ uint64 maxFileSize;
+ uint64 fileSize;
};
#endif
diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp
index 96c72b5eb74..920ce4ce570 100644
--- a/src/server/shared/Logging/Log.cpp
+++ b/src/server/shared/Logging/Log.cpp
@@ -89,8 +89,9 @@ void Log::CreateAppenderFromConfig(const char* name)
options = ConfigMgr::GetStringDefault(options.c_str(), "");
Tokenizer tokens(options, ',');
Tokenizer::const_iterator iter = tokens.begin();
+ uint8 size = tokens.size();
- if (tokens.size() < 2)
+ if (size < 2)
{
fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong configuration for appender %s. Config line: %s\n", name, options.c_str());
return;
@@ -98,16 +99,15 @@ void Log::CreateAppenderFromConfig(const char* name)
AppenderFlags flags = APPENDER_FLAGS_NONE;
AppenderType type = AppenderType(atoi(*iter));
- ++iter;
- LogLevel level = LogLevel(atoi(*iter));
+ LogLevel level = LogLevel(atoi(*(++iter)));
if (level > LOG_LEVEL_FATAL)
{
fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong Log Level %d for appender %s\n", level, name);
return;
}
- if (++iter != tokens.end())
- flags = AppenderFlags(atoi(*iter));
+ if (size > 2)
+ flags = AppenderFlags(atoi(*(++iter)));
switch (type)
{
@@ -115,8 +115,8 @@ void Log::CreateAppenderFromConfig(const char* name)
{
AppenderConsole* appender = new AppenderConsole(NextAppenderId(), name, level, flags);
appenders[appender->getId()] = appender;
- if (++iter != tokens.end())
- appender->InitColors(*iter);
+ if (size > 3)
+ appender->InitColors(*(++iter));
//fprintf(stdout, "Log::CreateAppenderFromConfig: Created Appender %s (%u), Type CONSOLE, Mask %u\n", appender->getName().c_str(), appender->getId(), appender->getLogLevel()); // DEBUG - RemoveMe
break;
}
@@ -125,16 +125,16 @@ void Log::CreateAppenderFromConfig(const char* name)
std::string filename;
std::string mode = "a";
- if (++iter == tokens.end())
+ if (size < 4)
{
fprintf(stderr, "Log::CreateAppenderFromConfig: Missing file name for appender %s\n", name);
return;
}
- filename = *iter;
+ filename = *(++iter);
- if (++iter != tokens.end())
- mode = *iter;
+ if (size > 4)
+ mode = *(++iter);
if (flags & APPENDER_FLAGS_USE_TIMESTAMP)
{
@@ -145,8 +145,12 @@ void Log::CreateAppenderFromConfig(const char* name)
filename += m_logsTimestamp;
}
+ uint64 maxFileSize = 0;
+ if (size > 5)
+ maxFileSize = atoi(*(++iter));
+
uint8 id = NextAppenderId();
- appenders[id] = new AppenderFile(id, name, level, filename.c_str(), m_logsDir.c_str(), mode.c_str(), flags);
+ appenders[id] = new AppenderFile(id, name, level, filename.c_str(), m_logsDir.c_str(), mode.c_str(), flags, maxFileSize);
//fprintf(stdout, "Log::CreateAppenderFromConfig: Created Appender %s (%u), Type FILE, Mask %u, File %s, Mode %s\n", name, id, level, filename.c_str(), mode.c_str()); // DEBUG - RemoveMe
break;
}