diff options
Diffstat (limited to 'src/server/shared/Logging/Log.cpp')
-rw-r--r-- | src/server/shared/Logging/Log.cpp | 133 |
1 files changed, 60 insertions, 73 deletions
diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp index e6400176155..9cd4e4a8cce 100644 --- a/src/server/shared/Logging/Log.cpp +++ b/src/server/shared/Logging/Log.cpp @@ -57,13 +57,6 @@ std::string GetConfigStringDefault(std::string base, const char* name, const cha return sConfigMgr->GetStringDefault(base.c_str(), value); } -// Returns default logger if the requested logger is not found -Logger* Log::GetLoggerByType(LogFilterType filterType) -{ - LoggerMap::iterator it = loggers.find(static_cast<uint8>(filterType)); - return it == loggers.end() ? &loggers[0] : &it->second; -} - Appender* Log::GetAppenderByName(std::string const& name) { AppenderMap::iterator it = appenders.begin(); @@ -73,24 +66,23 @@ Appender* Log::GetAppenderByName(std::string const& name) return it == appenders.end() ? NULL : it->second; } -void Log::CreateAppenderFromConfig(const char* name) +void Log::CreateAppenderFromConfig(std::string const& appenderName) { - if (!name || *name == '\0') + if (appenderName.empty()) return; // Format=type, level, flags, optional1, optional2 // if type = File. optional1 = file and option2 = mode // if type = Console. optional1 = Color - std::string options = "Appender."; - options.append(name); - options = sConfigMgr->GetStringDefault(options.c_str(), ""); + std::string options = sConfigMgr->GetStringDefault(appenderName.c_str(), ""); Tokenizer tokens(options, ','); Tokenizer::const_iterator iter = tokens.begin(); uint8 size = tokens.size(); + std::string name = appenderName.substr(9); if (size < 2) { - fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong configuration for appender %s. Config line: %s\n", name, options.c_str()); + fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong configuration for appender %s. Config line: %s\n", name.c_str(), options.c_str()); return; } @@ -99,7 +91,7 @@ void Log::CreateAppenderFromConfig(const char* name) LogLevel level = LogLevel(atoi(*(++iter))); if (level > LOG_LEVEL_FATAL) { - fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong Log Level %d for appender %s\n", level, name); + fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong Log Level %d for appender %s\n", level, name.c_str()); return; } @@ -114,7 +106,7 @@ void Log::CreateAppenderFromConfig(const char* name) 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()); // DEBUG - RemoveMe + //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: @@ -124,7 +116,7 @@ void Log::CreateAppenderFromConfig(const char* name) if (size < 4) { - fprintf(stderr, "Log::CreateAppenderFromConfig: Missing file name for appender %s\n", name); + fprintf(stderr, "Log::CreateAppenderFromConfig: Missing file name for appender %s\n", name.c_str()); return; } @@ -148,7 +140,7 @@ void Log::CreateAppenderFromConfig(const char* name) 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, id, level, filename.c_str(), mode.c_str()); // DEBUG - RemoveMe + //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: @@ -158,62 +150,53 @@ void Log::CreateAppenderFromConfig(const char* name) break; } default: - fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown type %d for appender %s\n", type, name); + fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown type %d for appender %s\n", type, name.c_str()); break; } } -void Log::CreateLoggerFromConfig(const char* name) +void Log::CreateLoggerFromConfig(std::string const& appenderName) { - if (!name || *name == '\0') + if (appenderName.empty()) return; LogLevel level = LOG_LEVEL_DISABLED; uint8 type = uint8(-1); - std::string options = "Logger."; - options.append(name); - options = sConfigMgr->GetStringDefault(options.c_str(), ""); + std::string options = sConfigMgr->GetStringDefault(appenderName.c_str(), ""); + std::string name = appenderName.substr(7); if (options.empty()) { - fprintf(stderr, "Log::CreateLoggerFromConfig: Missing config option Logger.%s\n", name); + fprintf(stderr, "Log::CreateLoggerFromConfig: Missing config option Logger.%s\n", name.c_str()); return; } Tokenizer tokens(options, ','); Tokenizer::const_iterator iter = tokens.begin(); - if (tokens.size() != 3) - { - fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong config option Logger.%s=%s\n", name, options.c_str()); - return; - } - - type = uint8(atoi(*iter)); - if (type > MaxLogFilter) + if (tokens.size() != 2) { - fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong type %u for logger %s\n", type, name); + fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong config option Logger.%s=%s\n", name.c_str(), options.c_str()); return; } - Logger& logger = loggers[type]; + Logger& logger = loggers[name]; if (!logger.getName().empty()) { - fprintf(stderr, "Error while configuring Logger %s. Already defined\n", name); + fprintf(stderr, "Error while configuring Logger %s. Already defined\n", name.c_str()); return; } - ++iter; level = LogLevel(atoi(*iter)); if (level > LOG_LEVEL_FATAL) { - fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong Log Level %u for logger %s\n", type, name); + fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong Log Level %u for logger %s\n", type, name.c_str()); return; } - logger.Create(name, LogFilterType(type), level); - //fprintf(stdout, "Log::CreateLoggerFromConfig: Created Logger %s, Type %u, mask %u\n", name, LogFilterType(type), level); // DEBUG - RemoveMe + logger.Create(name, level); + //fprintf(stdout, "Log::CreateLoggerFromConfig: Created Logger %s, Level %u\n", name.c_str(), level); ++iter; std::istringstream ss(*iter); @@ -225,63 +208,67 @@ void Log::CreateLoggerFromConfig(const char* name) if (Appender* appender = GetAppenderByName(str)) { logger.addAppender(appender->getId(), appender); - //fprintf(stdout, "Log::CreateLoggerFromConfig: Added Appender %s to Logger %s\n", appender->getName().c_str(), name); // DEBUG - RemoveMe + //fprintf(stdout, "Log::CreateLoggerFromConfig: Added Appender %s to Logger %s\n", appender->getName().c_str(), name.c_str()); } else - fprintf(stderr, "Error while configuring Appender %s in Logger %s. Appender does not exist", str.c_str(), name); + fprintf(stderr, "Error while configuring Appender %s in Logger %s. Appender does not exist", str.c_str(), name.c_str()); ss >> str; } } void Log::ReadAppendersFromConfig() { - std::istringstream ss(sConfigMgr->GetStringDefault("Appenders", "")); - std::string name; + std::list<std::string> keys = sConfigMgr->GetKeysByString("Appender."); - do + while (!keys.empty()) { - ss >> name; - CreateAppenderFromConfig(name.c_str()); - name = ""; + CreateAppenderFromConfig(keys.front()); + keys.pop_front(); } - while (ss); } void Log::ReadLoggersFromConfig() { - std::istringstream ss(sConfigMgr->GetStringDefault("Loggers", "")); - std::string name; + std::list<std::string> keys = sConfigMgr->GetKeysByString("Logger."); - do + while (!keys.empty()) { - ss >> name; - CreateLoggerFromConfig(name.c_str()); - name = ""; + CreateLoggerFromConfig(keys.front()); + keys.pop_front(); } - while (ss); - // root logger must exist. Marking as disabled as its not configured - if (loggers.find(LOG_FILTER_GENERAL) == loggers.end()) - loggers[LOG_FILTER_GENERAL].Create("root", LOG_FILTER_GENERAL, LOG_LEVEL_DISABLED); + // Bad config configuration, creating default config + if (loggers.find(LOGGER_ROOT) == loggers.end()) + { + fprintf(stderr, "Wrong Loggers configuration. Review your Logger config section.\n" + "Creating default loggers [root (Error), server (Info)] to console\n"); + + Close(); // Clean any Logger or Appender created + + AppenderConsole* appender = new AppenderConsole(NextAppenderId(), "Console", LOG_LEVEL_DEBUG, APPENDER_FLAGS_NONE); + appenders[appender->getId()] = appender; + + Logger& logger = loggers[LOGGER_ROOT]; + logger.Create(LOGGER_ROOT, LOG_LEVEL_ERROR); + logger.addAppender(appender->getId(), appender); + + logger = loggers["server"]; + logger.Create("server", LOG_LEVEL_ERROR); + logger.addAppender(appender->getId(), appender); + } } -void Log::vlog(LogFilterType filter, LogLevel level, char const* str, va_list argptr) +void Log::vlog(std::string const& filter, LogLevel level, char const* str, va_list argptr) { char text[MAX_QUERY_LEN]; vsnprintf(text, MAX_QUERY_LEN, str, argptr); write(new LogMessage(level, filter, text)); } -void Log::write(LogMessage* msg) +void Log::write(LogMessage* msg) const { - if (loggers.empty()) - { - delete msg; - return; - } - + Logger const* logger = GetLoggerByType(msg->type); msg->text.append("\n"); - Logger* logger = GetLoggerByType(msg->type); if (worker) worker->enqueue(new LogOperation(logger, msg)); @@ -336,7 +323,7 @@ bool Log::SetLogLevel(std::string const& name, const char* newLevelc, bool isLog return true; } -void Log::outTrace(LogFilterType filter, const char * str, ...) +void Log::outTrace(std::string const& filter, const char * str, ...) { va_list ap; va_start(ap, str); @@ -346,7 +333,7 @@ void Log::outTrace(LogFilterType filter, const char * str, ...) va_end(ap); } -void Log::outDebug(LogFilterType filter, const char * str, ...) +void Log::outDebug(std::string const& filter, const char * str, ...) { va_list ap; va_start(ap, str); @@ -356,7 +343,7 @@ void Log::outDebug(LogFilterType filter, const char * str, ...) va_end(ap); } -void Log::outInfo(LogFilterType filter, const char * str, ...) +void Log::outInfo(std::string const& filter, const char * str, ...) { va_list ap; va_start(ap, str); @@ -366,7 +353,7 @@ void Log::outInfo(LogFilterType filter, const char * str, ...) va_end(ap); } -void Log::outWarn(LogFilterType filter, const char * str, ...) +void Log::outWarn(std::string const& filter, const char * str, ...) { va_list ap; va_start(ap, str); @@ -376,7 +363,7 @@ void Log::outWarn(LogFilterType filter, const char * str, ...) va_end(ap); } -void Log::outError(LogFilterType filter, const char * str, ...) +void Log::outError(std::string const& filter, const char * str, ...) { va_list ap; va_start(ap, str); @@ -386,7 +373,7 @@ void Log::outError(LogFilterType filter, const char * str, ...) va_end(ap); } -void Log::outFatal(LogFilterType filter, const char * str, ...) +void Log::outFatal(std::string const& filter, const char * str, ...) { va_list ap; va_start(ap, str); |