diff options
author | Spp <spp@jorge.gr> | 2013-11-07 16:34:44 +0100 |
---|---|---|
committer | Spp <spp@jorge.gr> | 2013-11-07 16:34:44 +0100 |
commit | 8aa9745c4c7e80ffcbbd3f2377125ad08b30b661 (patch) | |
tree | 824a43c64f1778ed1bcad62a24137262473464f5 /src | |
parent | d26bb8517c6030139b0383659fede9628abac22c (diff) |
Core/Logging: Extend logging system to allow inheritance of loggers
- Changed default loggers and appenders
- '.' determines the relation between loggers ("type.subtype" inherits "type" logger setting if logger "type.subtype" is not defined)
- When core logs a message it search for the correct logger (root is the default one)
ie: a message logged with "type.subtype"
* Core will try to find a logger with name "type.subtype", if its not found then will search for "type", again if its not found it will return the default one "root"
Diffstat (limited to 'src')
-rw-r--r-- | src/server/authserver/authserver.conf.dist | 22 | ||||
-rw-r--r-- | src/server/shared/Configuration/Config.cpp | 32 | ||||
-rw-r--r-- | src/server/shared/Configuration/Config.h | 3 | ||||
-rw-r--r-- | src/server/shared/Logging/Appender.cpp | 109 | ||||
-rw-r--r-- | src/server/shared/Logging/Appender.h | 56 | ||||
-rw-r--r-- | src/server/shared/Logging/AppenderDB.cpp | 26 | ||||
-rw-r--r-- | src/server/shared/Logging/Log.cpp | 118 | ||||
-rw-r--r-- | src/server/shared/Logging/Log.h | 111 | ||||
-rw-r--r-- | src/server/shared/Logging/LogOperation.h | 6 | ||||
-rw-r--r-- | src/server/shared/Logging/Logger.cpp | 14 | ||||
-rw-r--r-- | src/server/shared/Logging/Logger.h | 6 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 138 |
12 files changed, 245 insertions, 396 deletions
diff --git a/src/server/authserver/authserver.conf.dist b/src/server/authserver/authserver.conf.dist index 3c811eda3b3..80edcead6d9 100644 --- a/src/server/authserver/authserver.conf.dist +++ b/src/server/authserver/authserver.conf.dist @@ -219,6 +219,11 @@ LoginDatabase.WorkerThreads = 1 Appender.Console=1,2,0 Appender.Auth=2,2,0,Auth.log,w +# Logger config values: Given a logger "name" +# Logger.name +# Description: Defines 'What to log' +# Format: LogLevel,AppenderList +# # LogLevel # 0 - (Disabled) # 1 - (Trace) @@ -231,23 +236,6 @@ Appender.Auth=2,2,0,Auth.log,w # AppenderList: List of appenders linked to logger # (Using spaces as separator). # -# Appenders -# Description: List of Appenders to read from config -# (Using spaces as separator). -# Default: "Console Server" - -Appenders=Console Auth - -# Logger config values: Given a logger "name" -# Logger.name -# Description: Defines 'What to log' -# Format: Type,LogLevel,AppenderList -# Type -# 0 - Default. Each type that has no config will -# rely on this one. Core will create this logger -# (disabled) if it's not configured -# 7 - Network input/output, -# 30 - Authserver Logger.Root=0,3,Console Auth diff --git a/src/server/shared/Configuration/Config.cpp b/src/server/shared/Configuration/Config.cpp index 47d59a57100..055c33b40ee 100644 --- a/src/server/shared/Configuration/Config.cpp +++ b/src/server/shared/Configuration/Config.cpp @@ -117,3 +117,35 @@ std::string const& ConfigMgr::GetFilename() GuardType guard(_configLock); return _filename; } + +std::list<std::string> ConfigMgr::GetKeysByString(std::string const& name) +{ + GuardType guard(_configLock); + + std::list<std::string> keys; + if (_config.get() == 0) + return keys; + + ACE_TString section_name; + ACE_Configuration_Section_Key section_key; + const ACE_Configuration_Section_Key &root_key = _config->root_section(); + + int i = 0; + while (_config->enumerate_sections(root_key, i++, section_name) == 0) + { + _config->open_section(root_key, section_name.c_str(), 0, section_key); + + ACE_TString key_name; + ACE_Configuration::VALUETYPE type; + int j = 0; + while (_config->enumerate_values(section_key, j++, key_name, type) == 0) + { + std::string temp = key_name.c_str(); + + if (!temp.find(name)) + keys.push_back(temp); + } + } + + return keys; +} diff --git a/src/server/shared/Configuration/Config.h b/src/server/shared/Configuration/Config.h index d633e37f0c4..49f5c5e07fb 100644 --- a/src/server/shared/Configuration/Config.h +++ b/src/server/shared/Configuration/Config.h @@ -20,7 +20,7 @@ #define CONFIG_H #include <string> -#include <map> +#include <list> #include <ace/Singleton.h> #include <ace/Configuration_Import_Export.h> #include <ace/Thread_Mutex.h> @@ -56,6 +56,7 @@ public: float GetFloatDefault(const char* name, float def); std::string const& GetFilename(); + std::list<std::string> GetKeysByString(std::string const& name); private: bool GetValueHelper(const char* name, ACE_TString &result); diff --git a/src/server/shared/Logging/Appender.cpp b/src/server/shared/Logging/Appender.cpp index 89fe8d39a1d..06aa6159014 100644 --- a/src/server/shared/Logging/Appender.cpp +++ b/src/server/shared/Logging/Appender.cpp @@ -74,7 +74,7 @@ void Appender::write(LogMessage& message) message.prefix.clear(); if (flags & APPENDER_FLAGS_PREFIX_TIMESTAMP) - message.prefix.append(message.getTimeStr().c_str()); + message.prefix.append(message.getTimeStr()); if (flags & APPENDER_FLAGS_PREFIX_LOGLEVEL) { @@ -91,9 +91,9 @@ void Appender::write(LogMessage& message) if (!message.prefix.empty()) message.prefix.push_back(' '); - char text[MAX_QUERY_LEN]; - snprintf(text, MAX_QUERY_LEN, "[%s]", Appender::getLogFilterTypeString(message.type)); - message.prefix.append(text); + message.prefix.push_back('['); + message.prefix.append(message.type); + message.prefix.push_back(']'); } if (!message.prefix.empty()) @@ -122,104 +122,3 @@ const char* Appender::getLogLevelString(LogLevel level) return "DISABLED"; } } - -char const* Appender::getLogFilterTypeString(LogFilterType type) -{ - switch (type) - { - case LOG_FILTER_GENERAL: - return "GENERAL"; - case LOG_FILTER_UNITS: - return "UNITS"; - case LOG_FILTER_PETS: - return "PETS"; - case LOG_FILTER_VEHICLES: - return "VEHICLES"; - case LOG_FILTER_TSCR: - return "TSCR"; - case LOG_FILTER_DATABASE_AI: - return "DATABASE_AI"; - case LOG_FILTER_MAPSCRIPTS: - return "MAPSCRIPTS"; - case LOG_FILTER_NETWORKIO: - return "NETWORKIO"; - case LOG_FILTER_SPELLS_AURAS: - return "SPELLS_AURAS"; - case LOG_FILTER_ACHIEVEMENTSYS: - return "ACHIEVEMENTSYS"; - case LOG_FILTER_CONDITIONSYS: - return "CONDITIONSYS"; - case LOG_FILTER_POOLSYS: - return "POOLSYS"; - case LOG_FILTER_AUCTIONHOUSE: - return "AUCTIONHOUSE"; - case LOG_FILTER_BATTLEGROUND: - return "BATTLEGROUND"; - case LOG_FILTER_OUTDOORPVP: - return "OUTDOORPVP"; - case LOG_FILTER_CHATSYS: - return "CHATSYS"; - case LOG_FILTER_LFG: - return "LFG"; - case LOG_FILTER_MAPS: - return "MAPS"; - case LOG_FILTER_PLAYER: - return "PLAYER"; - case LOG_FILTER_PLAYER_LOADING: - return "PLAYER LOADING"; - case LOG_FILTER_PLAYER_ITEMS: - return "PLAYER ITEMS"; - case LOG_FILTER_PLAYER_SKILLS: - return "PLAYER SKILLS"; - case LOG_FILTER_PLAYER_CHATLOG: - return "PLAYER CHATLOG"; - case LOG_FILTER_LOOT: - return "LOOT"; - case LOG_FILTER_GUILD: - return "GUILD"; - case LOG_FILTER_TRANSPORTS: - return "TRANSPORTS"; - case LOG_FILTER_SQL: - return "SQL"; - case LOG_FILTER_GMCOMMAND: - return "GMCOMMAND"; - case LOG_FILTER_REMOTECOMMAND: - return "REMOTECOMMAND"; - case LOG_FILTER_WARDEN: - return "WARDEN"; - case LOG_FILTER_AUTHSERVER: - return "AUTHSERVER"; - case LOG_FILTER_WORLDSERVER: - return "WORLDSERVER"; - case LOG_FILTER_GAMEEVENTS: - return "GAMEEVENTS"; - case LOG_FILTER_CALENDAR: - return "CALENDAR"; - case LOG_FILTER_CHARACTER: - return "CHARACTER"; - case LOG_FILTER_ARENAS: - return "ARENAS"; - case LOG_FILTER_SQL_DRIVER: - return "SQL DRIVER"; - case LOG_FILTER_SQL_DEV: - return "SQL DEV"; - case LOG_FILTER_PLAYER_DUMP: - return "PLAYER DUMP"; - case LOG_FILTER_BATTLEFIELD: - return "BATTLEFIELD"; - case LOG_FILTER_SERVER_LOADING: - return "SERVER LOADING"; - case LOG_FILTER_OPCODES: - return "OPCODE"; - case LOG_FILTER_SOAP: - return "SOAP"; - case LOG_FILTER_RBAC: - return "RBAC"; - case LOG_FILTER_CHEAT: - return "CHEAT"; - default: - break; - } - - return "???"; -} diff --git a/src/server/shared/Logging/Appender.h b/src/server/shared/Logging/Appender.h index 14fe52f0837..f5a8d4cd435 100644 --- a/src/server/shared/Logging/Appender.h +++ b/src/server/shared/Logging/Appender.h @@ -24,57 +24,6 @@ #include <string> -enum LogFilterType -{ - LOG_FILTER_GENERAL = 0, // This one should only be used inside Log.cpp - LOG_FILTER_UNITS = 1, // Anything related to units that doesn't fit in other categories. ie. creature formations - LOG_FILTER_PETS = 2, - LOG_FILTER_VEHICLES = 3, - LOG_FILTER_TSCR = 4, // C++ AI, instance scripts, etc. - LOG_FILTER_DATABASE_AI = 5, // SmartAI, EventAI, Creature* * AI - LOG_FILTER_MAPSCRIPTS = 6, - LOG_FILTER_NETWORKIO = 7, - LOG_FILTER_SPELLS_AURAS = 8, - LOG_FILTER_ACHIEVEMENTSYS = 9, - LOG_FILTER_CONDITIONSYS = 10, - LOG_FILTER_POOLSYS = 11, - LOG_FILTER_AUCTIONHOUSE = 12, - LOG_FILTER_BATTLEGROUND = 13, - LOG_FILTER_OUTDOORPVP = 14, - LOG_FILTER_CHATSYS = 15, - LOG_FILTER_LFG = 16, - LOG_FILTER_MAPS = 17, - LOG_FILTER_PLAYER = 18, // Any player log that does not fit in other player filters - LOG_FILTER_PLAYER_LOADING = 19, // Debug output from Player::_Load functions - LOG_FILTER_PLAYER_ITEMS = 20, - LOG_FILTER_PLAYER_SKILLS = 21, - LOG_FILTER_PLAYER_CHATLOG = 22, - LOG_FILTER_LOOT = 23, - LOG_FILTER_GUILD = 24, - LOG_FILTER_TRANSPORTS = 25, - LOG_FILTER_SQL = 26, - LOG_FILTER_GMCOMMAND = 27, - LOG_FILTER_REMOTECOMMAND = 28, - LOG_FILTER_WARDEN = 29, - LOG_FILTER_AUTHSERVER = 30, - LOG_FILTER_WORLDSERVER = 31, - LOG_FILTER_GAMEEVENTS = 32, - LOG_FILTER_CALENDAR = 33, - LOG_FILTER_CHARACTER = 34, - LOG_FILTER_ARENAS = 35, - LOG_FILTER_SQL_DRIVER = 36, - LOG_FILTER_SQL_DEV = 37, - LOG_FILTER_PLAYER_DUMP = 38, - LOG_FILTER_BATTLEFIELD = 39, - LOG_FILTER_SERVER_LOADING = 40, - LOG_FILTER_OPCODES = 41, - LOG_FILTER_SOAP = 42, - LOG_FILTER_RBAC = 43, - LOG_FILTER_CHEAT = 44 -}; - -const uint8 MaxLogFilter = 45; - // Values assigned have their equivalent in enum ACE_Log_Priority enum LogLevel { @@ -109,7 +58,7 @@ enum AppenderFlags struct LogMessage { - LogMessage(LogLevel _level, LogFilterType _type, std::string _text) + LogMessage(LogLevel _level, std::string const& _type, std::string const& _text) : level(_level), type(_type), text(_text), mtime(time(NULL)) { } @@ -117,7 +66,7 @@ struct LogMessage std::string getTimeStr(); LogLevel level; - LogFilterType type; + std::string type; std::string text; std::string prefix; std::string param1; @@ -145,7 +94,6 @@ class Appender void setLogLevel(LogLevel); void write(LogMessage& message); static const char* getLogLevelString(LogLevel level); - static const char* getLogFilterTypeString(LogFilterType type); private: virtual void _write(LogMessage const& /*message*/) = 0; diff --git a/src/server/shared/Logging/AppenderDB.cpp b/src/server/shared/Logging/AppenderDB.cpp index 8b237277d79..c461186089c 100644 --- a/src/server/shared/Logging/AppenderDB.cpp +++ b/src/server/shared/Logging/AppenderDB.cpp @@ -25,25 +25,17 @@ AppenderDB::~AppenderDB() { } void AppenderDB::_write(LogMessage const& message) { - if (!enabled) + // Avoid infinite loop, PExecute triggers Logging with LOG_FILTER_SQL type + if (!enabled || !message.type.find("sql")) return; - switch (message.type) - { - case LOG_FILTER_SQL: - case LOG_FILTER_SQL_DRIVER: - case LOG_FILTER_SQL_DEV: - break; // Avoid infinite loop, PExecute triggers Logging with LOG_FILTER_SQL type - default: - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_LOG); - stmt->setUInt64(0, message.mtime); - stmt->setUInt32(1, realmId); - stmt->setUInt8(2, uint8(message.type)); - stmt->setUInt8(3, uint8(message.level)); - stmt->setString(4, message.text); - LoginDatabase.Execute(stmt); - break; - } + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_LOG); + stmt->setUInt64(0, message.mtime); + stmt->setUInt32(1, realmId); + stmt->setString(2, message.type); + stmt->setUInt8(3, uint8(message.level)); + stmt->setString(4, message.text); + LoginDatabase.Execute(stmt); } void AppenderDB::setRealmId(uint32 _realmId) diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp index e6400176155..367c42f104c 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,54 @@ 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); + if (loggers.find(LOGGER_ROOT) == loggers.end()) + { + fprintf(stdout, "Wrong Loggers configuration, Logger.root needs to exist, nothing will be logged.\n"); + loggers[LOGGER_ROOT].Create(LOGGER_ROOT, LOG_LEVEL_DISABLED); + } } -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 +310,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 +320,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 +330,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 +340,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 +350,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 +360,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); diff --git a/src/server/shared/Logging/Log.h b/src/server/shared/Logging/Log.h index e35e4f3ab7f..81daee02503 100644 --- a/src/server/shared/Logging/Log.h +++ b/src/server/shared/Logging/Log.h @@ -28,11 +28,60 @@ #include <string> #include <ace/Singleton.h> +// TODO: Replace all defines in core +#define LOG_FILTER_ACHIEVEMENTSYS "achievement" +#define LOG_FILTER_AUCTIONHOUSE "auctionHouse" +#define LOG_FILTER_ARENAS "bg.arena" +#define LOG_FILTER_BATTLEFIELD "bg.battlefield" +#define LOG_FILTER_BATTLEGROUND "bg.battleground" +#define LOG_FILTER_PLAYER_CHATLOG "chat.log" +#define LOG_FILTER_CALENDAR "calendar" +#define LOG_FILTER_CHATSYS "chat.system" +#define LOG_FILTER_CHEAT "cheat" +#define LOG_FILTER_REMOTECOMMAND "commands.ra" +#define LOG_FILTER_GMCOMMAND "commands.gm" +#define LOG_FILTER_CONDITIONSYS "condition" +#define LOG_FILTER_PETS "entities.pet" +#define LOG_FILTER_CHARACTER "entities.player.character" +#define LOG_FILTER_PLAYER_DUMP "entities.player.dump" +#define LOG_FILTER_PLAYER "entities.player" +#define LOG_FILTER_PLAYER_ITEMS "entities.player.items" +#define LOG_FILTER_PLAYER_LOADING "entities.player.loading" +#define LOG_FILTER_PLAYER_SKILLS "entities.player.skills" +#define LOG_FILTER_TRANSPORTS "entities.transport" +#define LOG_FILTER_UNITS "entities.unit" +#define LOG_FILTER_VEHICLES "entities.vehicle" +#define LOG_FILTER_GAMEEVENTS "gameevent" +#define LOG_FILTER_GUILD "guild" +#define LOG_FILTER_LFG "lfg" +#define LOG_FILTER_LOOT "loot" +#define LOG_FILTER_MAPSCRIPTS "maps.script" +#define LOG_FILTER_MAPS "maps" +#define LOG_FILTER_GENERAL "misc" +#define LOG_FILTER_NETWORKIO "network" +#define LOG_FILTER_OPCODES "network.opcode" +#define LOG_FILTER_SOAP "network.soap" +#define LOG_FILTER_OUTDOORPVP "outdoorpvp" +#define LOG_FILTER_POOLSYS "pool" +#define LOG_FILTER_RBAC "rbac" +#define LOG_FILTER_TSCR "scripts" +#define LOG_FILTER_DATABASE_AI "scripts.ai" +#define LOG_FILTER_SERVER_LOADING "server.loading" +#define LOG_FILTER_AUTHSERVER "server.authserver" +#define LOG_FILTER_WORLDSERVER "server.worldserver" +#define LOG_FILTER_SPELLS_AURAS "spells" +#define LOG_FILTER_SQL_DEV "sql.dev" +#define LOG_FILTER_SQL_DRIVER "sql.driver" +#define LOG_FILTER_SQL "sql.sql" +#define LOG_FILTER_WARDEN "warden" + +#define LOGGER_ROOT "root" + class Log { friend class ACE_Singleton<Log, ACE_Thread_Mutex>; - typedef UNORDERED_MAP<uint8, Logger> LoggerMap; + typedef UNORDERED_MAP<std::string, Logger> LoggerMap; private: Log(); @@ -41,15 +90,15 @@ class Log public: void LoadFromConfig(); void Close(); - bool ShouldLog(LogFilterType type, LogLevel level) const; + bool ShouldLog(std::string const& type, LogLevel level) const; bool SetLogLevel(std::string const& name, char const* level, bool isLogger = true); - void outTrace(LogFilterType f, char const* str, ...) ATTR_PRINTF(3, 4); - void outDebug(LogFilterType f, char const* str, ...) ATTR_PRINTF(3, 4); - void outInfo(LogFilterType f, char const* str, ...) ATTR_PRINTF(3, 4); - void outWarn(LogFilterType f, char const* str, ...) ATTR_PRINTF(3, 4); - void outError(LogFilterType f, char const* str, ...) ATTR_PRINTF(3, 4); - void outFatal(LogFilterType f, char const* str, ...) ATTR_PRINTF(3, 4); + void outTrace(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4); + void outDebug(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4); + void outInfo(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4); + void outWarn(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4); + void outError(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4); + void outFatal(std::string const& f, char const* str, ...) ATTR_PRINTF(3, 4); void outCommand(uint32 account, const char * str, ...) ATTR_PRINTF(3, 4); void outCharDump(char const* str, uint32 account_id, uint32 guid, char const* name); @@ -58,14 +107,14 @@ class Log void SetRealmId(uint32 id); private: - void vlog(LogFilterType f, LogLevel level, char const* str, va_list argptr); - void write(LogMessage* msg); + void vlog(std::string const& f, LogLevel level, char const* str, va_list argptr); + void write(LogMessage* msg) const; - Logger* GetLoggerByType(LogFilterType filter); + Logger const* GetLoggerByType(std::string const& type) const; Appender* GetAppenderByName(std::string const& name); uint8 NextAppenderId(); - void CreateAppenderFromConfig(const char* name); - void CreateLoggerFromConfig(const char* name); + void CreateAppenderFromConfig(std::string const& name); + void CreateLoggerFromConfig(std::string const& name); void ReadAppendersFromConfig(); void ReadLoggersFromConfig(); @@ -79,19 +128,35 @@ class Log LogWorker* worker; }; -inline bool Log::ShouldLog(LogFilterType type, LogLevel level) const +inline Logger const* Log::GetLoggerByType(std::string const& type) const { - LoggerMap::const_iterator it = loggers.find(uint8(type)); + LoggerMap::const_iterator it = loggers.find(type); if (it != loggers.end()) - { - LogLevel logLevel = it->second.getLogLevel(); - return logLevel != LOG_LEVEL_DISABLED && logLevel <= level; - } - - if (type != LOG_FILTER_GENERAL) - return ShouldLog(LOG_FILTER_GENERAL, level); - else + return &(it->second); + + if (type == LOGGER_ROOT) + return NULL; + + std::string parentLogger = LOGGER_ROOT; + size_t found = type.find_last_of("."); + if (found != std::string::npos) + parentLogger = type.substr(0,found); + + return GetLoggerByType(parentLogger); +} + +inline bool Log::ShouldLog(std::string const& type, LogLevel level) const +{ + // TODO: Use cache to store "Type.sub1.sub2": "Type" equivalence, should + // Speed up in cases where requesting "Type.sub1.sub2" but only configured + // Logger "Type" + + Logger const* logger = GetLoggerByType(type); + if (!logger) return false; + + LogLevel logLevel = logger->getLogLevel(); + return logLevel != LOG_LEVEL_DISABLED && logLevel <= level; } #define sLog ACE_Singleton<Log, ACE_Thread_Mutex>::instance() diff --git a/src/server/shared/Logging/LogOperation.h b/src/server/shared/Logging/LogOperation.h index 40017cb87f4..237f50de4ad 100644 --- a/src/server/shared/Logging/LogOperation.h +++ b/src/server/shared/Logging/LogOperation.h @@ -24,7 +24,7 @@ struct LogMessage; class LogOperation { public: - LogOperation(Logger* _logger, LogMessage* _msg) + LogOperation(Logger const* _logger, LogMessage* _msg) : logger(_logger), msg(_msg) { } @@ -33,8 +33,8 @@ class LogOperation int call(); protected: - Logger *logger; - LogMessage *msg; + Logger const* logger; + LogMessage* msg; }; #endif diff --git a/src/server/shared/Logging/Logger.cpp b/src/server/shared/Logging/Logger.cpp index 5cb0d0966f4..ea8ed27ed03 100644 --- a/src/server/shared/Logging/Logger.cpp +++ b/src/server/shared/Logging/Logger.cpp @@ -17,12 +17,11 @@ #include "Logger.h" -Logger::Logger(): name(""), type(LOG_FILTER_GENERAL), level(LOG_LEVEL_DISABLED) { } +Logger::Logger(): name(""), level(LOG_LEVEL_DISABLED) { } -void Logger::Create(std::string const& _name, LogFilterType _type, LogLevel _level) +void Logger::Create(std::string const& _name, LogLevel _level) { name = _name; - type = _type; level = _level; } @@ -38,11 +37,6 @@ std::string const& Logger::getName() const return name; } -LogFilterType Logger::getType() const -{ - return type; -} - LogLevel Logger::getLogLevel() const { return level; @@ -68,7 +62,7 @@ void Logger::setLogLevel(LogLevel _level) level = _level; } -void Logger::write(LogMessage& message) +void Logger::write(LogMessage& message) const { if (!level || level > message.level || message.text.empty()) { @@ -76,7 +70,7 @@ void Logger::write(LogMessage& message) return; } - for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it) + for (AppenderMap::const_iterator it = appenders.begin(); it != appenders.end(); ++it) if (it->second) it->second->write(message); } diff --git a/src/server/shared/Logging/Logger.h b/src/server/shared/Logging/Logger.h index 46436a8022e..e9d39830ce6 100644 --- a/src/server/shared/Logging/Logger.h +++ b/src/server/shared/Logging/Logger.h @@ -26,19 +26,17 @@ class Logger Logger(); ~Logger(); - void Create(std::string const& name, LogFilterType type, LogLevel level); + void Create(std::string const& name, LogLevel level); void addAppender(uint8 type, Appender *); void delAppender(uint8 type); std::string const& getName() const; - LogFilterType getType() const; LogLevel getLogLevel() const; void setLogLevel(LogLevel level); - void write(LogMessage& message); + void write(LogMessage& message) const; private: std::string name; - LogFilterType type; LogLevel level; AppenderMap appenders; }; diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 23db3330943..992ef80828c 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -2703,79 +2703,13 @@ UI.ShowQuestLevelsInDialogs = 0 Appender.Console=1,3,0 Appender.Server=2,2,0,Server.log,w -Appender.GM=2,2,0,GM.log +Appender.GM=2,2,15,gm/gm_%s.log Appender.DBErrors=2,2,0,DBErrors.log -Appender.Char=2,2,0,Char.log,w -Appender.RA=2,2,0,RA.log -Appender.Warden=2,4,0,Warden.log -Appender.Chat=2,2,0,Chat.log -Appender.CharDump=2,2,0,%s.log -Appender.Arenas=2,2,0,Arena.log -Appender.SQLDev=2,2,0,SQLDev.log -Appender.SQLDriver=2,2,0,SQLDriver.log - -# Appenders -# Description: List of Appenders to read from config -# (Using spaces as separator). -# Default: "Console Server GM DBErrors Char RA Warden Chat" - -Appenders=Console Server GM DBErrors Char RA Warden Chat # Logger config values: Given a logger "name" # Logger.name # Description: Defines 'What to log' -# Format: Type,LogLevel,AppenderList -# Type -# 0 - Default. Each type that has no config will -# rely on this one. Core will create this logger -# (disabled) if it's not configured -# 1 - Units that doesn't fit in other categories -# 2 - Pets -# 3 - Vehicles -# 4 - C++ AI, instance scripts, etc. -# 5 - DB AI, such as SAI, EAI, CreatureAI -# 6 - DB map scripts -# 7 - Network input/output, -# such as packet handlers and netcode logs -# 8 - Spellsystem and aurasystem -# 9 - Achievement system -# 10 - Condition system -# 11 - Pool system -# 12 - Auction house -# 13 - Arena's and battlegrounds -# 14 - Outdoor PVP -# 15 - Chat system -# 16 - LFG system -# 17 - Maps, instances (not scripts), -# grids, cells, visibility, etc. -# 18 - Player that doesn't fit in other categories. -# 19 - Player loading from DB -# (Player::_LoadXXX functions) -# 20 - Items -# 21 - Player skills (do not confuse with spells) -# 22 - Player chat logs -# 23 - loot -# 24 - guilds -# 25 - transports -# 26 - SQL. DB errors -# 27 - GM Commands -# 28 - Remote Access Commands -# 29 - Warden -# 30 - Authserver -# 31 - Worldserver -# 32 - Game Events -# 33 - Calendar -# 34 - Character (Exclusive to log login, logout, create, rename) -# 35 - Arenas -# 36 - SQL Driver -# 37 - SQL Dev -# 38 - Player Dump -# 39 - Battlefield -# 40 - Server Loading -# 41 - Opcodes (just id and name sent / received) -# 42 - SOAP -# 43 - RBAC (Role Based Access Control) -# 44 - Cheat (used to log cheat attempts) +# Format: LogLevel,AppenderList # # LogLevel # 0 - (Disabled) @@ -2790,28 +2724,52 @@ Appenders=Console Server GM DBErrors Char RA Warden Chat # (Using spaces as separator). # -Logger.Root=0,5,Console Server -Logger.Chat=22,2,Chat -Logger.DBErrors=26,5,Console Server DBErrors -Logger.GM=27,3,Console Server GM -Logger.RA=28,3,RA -Logger.Warden=29,4,Warden -Logger.WorldServer=31,3,Console Server -Logger.Character=34,3,Char -Logger.Arenas=35,3,Arenas -Logger.SQLDriver=36,5,SQLDriver -Logger.SQLDev=37,3,SQLDev -Logger.CharDump=38,3,CharDump -Logger.Load=40,3,Console Server -Logger.Opcodes=41,6,Console Server - -# -# Loggers -# Description: List of Loggers to read from config -# (Using spaces as separator). -# Default: "Root Chat DBErrors GM RA Warden Character Load" - -Loggers=Root Chat DBErrors GM RA Warden Character Load WorldServer Opcodes +Logger.root=5,Console Server +Logger.server=3,Console Server +Logger.commands.gm=3,Console GM +Logger.sql.sql=5,Console DBErrors + +#Logger.achievement=3,Console Server +#Logger.auctionHouse=3,Console Server +#Logger.bg.arena=3,Console Server +#Logger.bg.battlefield=3,Console Server +#Logger.bg.battleground=3,Console Server +#Logger.chat.log=3,Console Server +#Logger.calendar=3,Console Server +#Logger.chat.system=3,Console Server +#Logger.cheat=3,Console Server +#Logger.commands.ra=3,Console Server +#Logger.condition=3,Console Server +#Logger.entities.pet=3,Console Server +#Logger.entities.player.character=3,Console Server +#Logger.entities.player.dump=3,Console Server +#Logger.entities.player=3,Console Server +#Logger.entities.player.items=3,Console Server +#Logger.entities.player.loading=3,Console Server +#Logger.entities.player.skills=3,Console Server +#Logger.entities.transport=3,Console Server +#Logger.entities.unit=3,Console Server +#Logger.entities.vehicle=3,Console Server +#Logger.gameevent=3,Console Server +#Logger.guild=3,Console Server +#Logger.lfg=3,Console Server +#Logger.loot=3,Console Server +#Logger.maps.script=3,Console Server +#Logger.maps=3,Console Server +#Logger.misc=3,Console Server +#Logger.network=3,Console Server +#Logger.network.opcode=3,Console Server +#Logger.network.soap=3,Console Server +#Logger.outdoorpvp=3,Console Server +#Logger.pool=3,Console Server +#Logger.rbac=3,Console Server +#Logger.scripts=3,Console Server +#Logger.scripts.ai=3,Console Server +#Logger.server.authserver=3,Console Server +#Logger.spells=3,Console Server +#Logger.sql.dev=3,Console Server +#Logger.sql.driver=3,Console Server +#Logger.warden=3,Console Server # # Log.Async.Enable |