diff options
Diffstat (limited to 'src/server/shared/Logging/Log.cpp')
-rw-r--r-- | src/server/shared/Logging/Log.cpp | 90 |
1 files changed, 30 insertions, 60 deletions
diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp index 6c2580b3168..88ce78f0d86 100644 --- a/src/server/shared/Logging/Log.cpp +++ b/src/server/shared/Logging/Log.cpp @@ -31,7 +31,8 @@ Log::Log() : _ioService(nullptr), _strand(nullptr) { m_logsTimestamp = "_" + GetTimestampStr(); - LoadFromConfig(); + RegisterAppender<AppenderConsole>(); + RegisterAppender<AppenderFile>(); } Log::~Log() @@ -101,60 +102,21 @@ void Log::CreateAppenderFromConfig(std::string const& appenderName) if (size > 2) flags = AppenderFlags(atoi(*iter++)); - switch (type) + auto factoryFunction = appenderFactory.find(type); + if (factoryFunction == appenderFactory.end()) { - case APPENDER_CONSOLE: - { - AppenderConsole* appender = new AppenderConsole(NextAppenderId(), name, level, flags); - appenders[appender->getId()] = appender; - 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()); - break; - } - case APPENDER_FILE: - { - std::string filename; - std::string mode = "a"; - - if (size < 4) - { - fprintf(stderr, "Log::CreateAppenderFromConfig: Missing file name for appender %s\n", name.c_str()); - return; - } - - filename = *iter++; - - if (size > 4) - mode = *iter++; - - if (flags & APPENDER_FLAGS_USE_TIMESTAMP) - { - size_t dot_pos = filename.find_last_of("."); - if (dot_pos != filename.npos) - filename.insert(dot_pos, m_logsTimestamp); - else - 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, maxFileSize); - //fprintf(stdout, "Log::CreateAppenderFromConfig: Created Appender %s (%u), Type FILE, Mask %u, File %s, Mode %s\n", name.c_str(), id, level, filename.c_str(), mode.c_str()); - break; - } - case APPENDER_DB: - { - uint8 id = NextAppenderId(); - appenders[id] = new AppenderDB(id, name, level); - break; - } - default: - fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown type %d for appender %s\n", type, name.c_str()); - break; + fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown type %d for appender %s\n", type, name.c_str()); + return; + } + + try + { + Appender* appender = factoryFunction->second(NextAppenderId(), name, level, flags, ExtraAppenderArgs(iter, tokens.end())); + appenders[appender->getId()] = appender; + } + catch (InvalidAppenderArgsException const& iaae) + { + fprintf(stderr, iaae.what()); } } @@ -250,7 +212,7 @@ void Log::ReadLoggersFromConfig() Close(); // Clean any Logger or Appender created - AppenderConsole* appender = new AppenderConsole(NextAppenderId(), "Console", LOG_LEVEL_DEBUG, APPENDER_FLAGS_NONE); + AppenderConsole* appender = new AppenderConsole(NextAppenderId(), "Console", LOG_LEVEL_DEBUG, APPENDER_FLAGS_NONE, ExtraAppenderArgs()); appenders[appender->getId()] = appender; Logger& logger = loggers[LOGGER_ROOT]; @@ -347,21 +309,29 @@ void Log::outCharDump(char const* str, uint32 accountId, uint64 guid, char const void Log::SetRealmId(uint32 id) { for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it) - if (it->second && it->second->getType() == APPENDER_DB) - static_cast<AppenderDB*>(it->second)->setRealmId(id); + it->second->setRealmId(id); } void Log::Close() { loggers.clear(); for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it) - { delete it->second; - it->second = NULL; - } + appenders.clear(); } +void Log::Initialize(boost::asio::io_service* ioService) +{ + if (ioService) + { + _ioService = ioService; + _strand = new boost::asio::strand(*ioService); + } + + LoadFromConfig(); +} + void Log::LoadFromConfig() { Close(); |