diff options
Diffstat (limited to 'src/server/shared/Logging')
| -rw-r--r-- | src/server/shared/Logging/Appender.cpp | 109 | ||||
| -rw-r--r-- | src/server/shared/Logging/Appender.h | 58 | ||||
| -rw-r--r-- | src/server/shared/Logging/AppenderConsole.cpp | 6 | ||||
| -rw-r--r-- | src/server/shared/Logging/AppenderDB.cpp | 26 | ||||
| -rw-r--r-- | src/server/shared/Logging/AppenderFile.cpp | 7 | ||||
| -rw-r--r-- | src/server/shared/Logging/Log.cpp | 212 | ||||
| -rw-r--r-- | src/server/shared/Logging/Log.h | 117 | ||||
| -rw-r--r-- | src/server/shared/Logging/LogOperation.h | 6 | ||||
| -rw-r--r-- | src/server/shared/Logging/Logger.cpp | 30 | ||||
| -rw-r--r-- | src/server/shared/Logging/Logger.h | 7 | 
10 files changed, 184 insertions, 394 deletions
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..437c301ea6b 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; @@ -126,7 +75,7 @@ struct LogMessage      ///@ Returns size of the log message content in bytes      uint32 Size() const      { -        return prefix.size() + text.size(); +        return static_cast<uint32>(prefix.size() + text.size());      }  }; @@ -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/AppenderConsole.cpp b/src/server/shared/Logging/AppenderConsole.cpp index a1212bd135b..78350029205 100644 --- a/src/server/shared/Logging/AppenderConsole.cpp +++ b/src/server/shared/Logging/AppenderConsole.cpp @@ -59,7 +59,7 @@ void AppenderConsole::InitColors(std::string const& str)  void AppenderConsole::SetColor(bool stdout_stream, ColorTypes color)  { -    #if PLATFORM == PLATFORM_WINDOWS +#if PLATFORM == PLATFORM_WINDOWS      static WORD WinColorFG[MaxColors] =      {          0,                                                  // BLACK @@ -87,7 +87,7 @@ void AppenderConsole::SetColor(bool stdout_stream, ColorTypes color)      HANDLE hConsole = GetStdHandle(stdout_stream ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE);      SetConsoleTextAttribute(hConsole, WinColorFG[color]); -    #else +#else      enum ANSITextAttr      {          TA_NORMAL                                = 0, @@ -156,7 +156,7 @@ void AppenderConsole::ResetColor(bool stdout_stream)  void AppenderConsole::_write(LogMessage const& message)  { -    bool stdout_stream = message.level == LOG_LEVEL_ERROR || message.level == LOG_LEVEL_FATAL; +    bool stdout_stream = !(message.level == LOG_LEVEL_ERROR || message.level == LOG_LEVEL_FATAL);      if (_colored)      { diff --git a/src/server/shared/Logging/AppenderDB.cpp b/src/server/shared/Logging/AppenderDB.cpp index 8b237277d79..204592720dc 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 "sql.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/AppenderFile.cpp b/src/server/shared/Logging/AppenderFile.cpp index 54458346bb9..d5410112b97 100644 --- a/src/server/shared/Logging/AppenderFile.cpp +++ b/src/server/shared/Logging/AppenderFile.cpp @@ -16,7 +16,10 @@   */  #include "AppenderFile.h" -#include "Common.h" + +#if PLATFORM == PLATFORM_WINDOWS +# include <Windows.h> +#endif  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), @@ -28,7 +31,7 @@ AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, co      fileSize(0)  {      dynamicName = std::string::npos != filename.find("%s"); -    backup = _flags & APPENDER_FLAGS_MAKE_FILE_BACKUP; +    backup = (_flags & APPENDER_FLAGS_MAKE_FILE_BACKUP) != 0;      logfile = !dynamicName ? OpenFile(_filename, _mode, mode == "w" && backup) : NULL;  } diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp index e6400176155..08200af3c19 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,38 +66,40 @@ 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(); + +    size_t 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;      }      AppenderFlags flags = APPENDER_FLAGS_NONE; -    AppenderType type = AppenderType(atoi(*iter)); -    LogLevel level = LogLevel(atoi(*(++iter))); +    AppenderType type = AppenderType(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); +        fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong Log Level %d for appender %s\n", level, name.c_str());          return;      }      if (size > 2) -        flags = AppenderFlags(atoi(*(++iter))); +        flags = AppenderFlags(atoi(*iter++));      switch (type)      { @@ -113,8 +108,8 @@ void Log::CreateAppenderFromConfig(const char* name)              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()); // DEBUG - RemoveMe +                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: @@ -124,14 +119,14 @@ 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;              } -            filename = *(++iter); +            filename = *iter++;              if (size > 4) -                mode = *(++iter); +                mode = *iter++;              if (flags & APPENDER_FLAGS_USE_TIMESTAMP)              { @@ -144,11 +139,11 @@ void Log::CreateAppenderFromConfig(const char* name)              uint64 maxFileSize = 0;              if (size > 5) -                maxFileSize = atoi(*(++iter)); +                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, 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,64 +153,54 @@ 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)); +    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);      std::string str; @@ -225,47 +210,57 @@ 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); @@ -274,14 +269,8 @@ void Log::vlog(LogFilterType filter, LogLevel level, char const* str, va_list ar  void Log::write(LogMessage* msg)  { -    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)); @@ -333,79 +322,20 @@ bool Log::SetLogLevel(std::string const& name, const char* newLevelc, bool isLog          appender->setLogLevel(newLevel);      } -    return true; -} - -void Log::outTrace(LogFilterType filter, const char * str, ...) -{ -    va_list ap; -    va_start(ap, str); - -    vlog(filter, LOG_LEVEL_TRACE, str, ap); - -    va_end(ap); -} - -void Log::outDebug(LogFilterType filter, const char * str, ...) -{ -    va_list ap; -    va_start(ap, str); - -    vlog(filter, LOG_LEVEL_DEBUG, str, ap); -    va_end(ap); -} - -void Log::outInfo(LogFilterType filter, const char * str, ...) -{ -    va_list ap; -    va_start(ap, str); - -    vlog(filter, LOG_LEVEL_INFO, str, ap); - -    va_end(ap); -} - -void Log::outWarn(LogFilterType filter, const char * str, ...) -{ -    va_list ap; -    va_start(ap, str); - -    vlog(filter, LOG_LEVEL_WARN, str, ap); - -    va_end(ap); -} - -void Log::outError(LogFilterType filter, const char * str, ...) -{ -    va_list ap; -    va_start(ap, str); - -    vlog(filter, LOG_LEVEL_ERROR, str, ap); - -    va_end(ap); -} - -void Log::outFatal(LogFilterType filter, const char * str, ...) -{ -    va_list ap; -    va_start(ap, str); - -    vlog(filter, LOG_LEVEL_FATAL, str, ap); - -    va_end(ap); +    return true;  }  void Log::outCharDump(char const* str, uint32 accountId, uint32 guid, char const* name)  { -    if (!str || !ShouldLog(LOG_FILTER_PLAYER_DUMP, LOG_LEVEL_INFO)) +    if (!str || !ShouldLog("entities.player.dump", LOG_LEVEL_INFO))          return;      std::ostringstream ss;      ss << "== START DUMP == (account: " << accountId << " guid: " << guid << " name: " << name         << ")\n" << str << "\n== END DUMP ==\n"; -    LogMessage* msg = new LogMessage(LOG_LEVEL_INFO, LOG_FILTER_PLAYER_DUMP, ss.str()); +    LogMessage* msg = new LogMessage(LOG_LEVEL_INFO, "entities.player.dump", ss.str());      std::ostringstream param;      param << guid << '_' << name; @@ -416,7 +346,7 @@ void Log::outCharDump(char const* str, uint32 accountId, uint32 guid, char const  void Log::outCommand(uint32 account, const char * str, ...)  { -    if (!str || !ShouldLog(LOG_FILTER_GMCOMMAND, LOG_LEVEL_INFO)) +    if (!str || !ShouldLog("commands.gm", LOG_LEVEL_INFO))          return;      va_list ap; @@ -425,7 +355,7 @@ void Log::outCommand(uint32 account, const char * str, ...)      vsnprintf(text, MAX_QUERY_LEN, str, ap);      va_end(ap); -    LogMessage* msg = new LogMessage(LOG_LEVEL_INFO, LOG_FILTER_GMCOMMAND, text); +    LogMessage* msg = new LogMessage(LOG_LEVEL_INFO, "commands.gm", text);      std::ostringstream ss;      ss << account; @@ -446,6 +376,7 @@ void Log::Close()      delete worker;      worker = NULL;      loggers.clear(); +    cachedLoggers.clear();      for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it)      {          delete it->second; @@ -466,6 +397,7 @@ void Log::LoadFromConfig()      if (!m_logsDir.empty())          if ((m_logsDir.at(m_logsDir.length() - 1) != '/') && (m_logsDir.at(m_logsDir.length() - 1) != '\\'))              m_logsDir.push_back('/'); +      ReadAppendersFromConfig();      ReadLoggersFromConfig();  } diff --git a/src/server/shared/Logging/Log.h b/src/server/shared/Logging/Log.h index e35e4f3ab7f..0eb54546aab 100644 --- a/src/server/shared/Logging/Log.h +++ b/src/server/shared/Logging/Log.h @@ -21,18 +21,21 @@  #include "Define.h"  #include "Appender.h" -#include "LogWorker.h"  #include "Logger.h" +#include "LogWorker.h"  #include "Dynamic/UnorderedMap.h"  #include <string>  #include <ace/Singleton.h> +#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; +    typedef UNORDERED_MAP<std::string, Logger const*> CachedLoggerContainer;      private:          Log(); @@ -41,36 +44,32 @@ class Log      public:          void LoadFromConfig();          void Close(); -        bool ShouldLog(LogFilterType type, LogLevel level) const; +        bool ShouldLog(std::string const& type, LogLevel level);          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 outMessage(std::string const& f, LogLevel level, char const* str, ...) ATTR_PRINTF(4, 5);          void outCommand(uint32 account, const char * str, ...) ATTR_PRINTF(3, 4);          void outCharDump(char const* str, uint32 account_id, uint32 guid, char const* name); -        static std::string GetTimestampStr();          void SetRealmId(uint32 id);      private: -        void vlog(LogFilterType f, LogLevel level, char const* str, va_list argptr); +        static std::string GetTimestampStr(); +        void vlog(std::string const& f, LogLevel level, char const* str, va_list argptr);          void write(LogMessage* msg); -        Logger* GetLoggerByType(LogFilterType filter); +        Logger const* GetLoggerByType(std::string const& type);          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();          AppenderMap appenders;          LoggerMap loggers; +        CachedLoggerContainer cachedLoggers;          uint8 AppenderId;          std::string m_logsDir; @@ -79,56 +78,94 @@ class Log          LogWorker* worker;  }; -inline bool Log::ShouldLog(LogFilterType type, LogLevel level) const +inline Logger const* Log::GetLoggerByType(std::string const& originalType)  { -    LoggerMap::const_iterator it = loggers.find(uint8(type)); -    if (it != loggers.end()) +    // Check if already cached +    CachedLoggerContainer::const_iterator itCached = cachedLoggers.find(originalType); +    if (itCached != cachedLoggers.end()) +        return itCached->second; + +    Logger const* logger = NULL; +    std::string type(originalType); + +    do      { -        LogLevel logLevel = it->second.getLogLevel(); -        return logLevel != LOG_LEVEL_DISABLED && logLevel <= level; +        // Search for the logger "type.subtype" +        LoggerMap::const_iterator it = loggers.find(type); +        if (it == loggers.end()) +        { +            // Search for the logger "type", if our logger contains '.', otherwise search for LOGGER_ROOT +            size_t found = type.find_last_of("."); +            type = found != std::string::npos ? type.substr(0, found) : LOGGER_ROOT; +        } +        else +            logger = &(it->second);      } +    while (!logger); + +    cachedLoggers[type] = logger; +    return logger; +} -    if (type != LOG_FILTER_GENERAL) -        return ShouldLog(LOG_FILTER_GENERAL, level); -    else +inline bool Log::ShouldLog(std::string const& type, LogLevel level) +{ +    // 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; +} + +inline void Log::outMessage(std::string const& filter, LogLevel level, const char * str, ...) +{ +    va_list ap; +    va_start(ap, str); + +    vlog(filter, level, str, ap); + +    va_end(ap);  }  #define sLog ACE_Singleton<Log, ACE_Thread_Mutex>::instance() -#if COMPILER != COMPILER_MICROSOFT -#define TC_LOG_MESSAGE_BODY(level__, call__, filterType__, ...)     \ -        do {                                                        \ -            if (sLog->ShouldLog(filterType__, level__))             \ -                sLog->call__(filterType__, __VA_ARGS__);            \ +#if PLATFORM != PLATFORM_WINDOWS +#define TC_LOG_MESSAGE_BODY(filterType__, level__, ...)                 \ +        do {                                                            \ +            if (sLog->ShouldLog(filterType__, level__))                 \ +                sLog->outMessage(filterType__, level__, __VA_ARGS__);   \          } while (0)  #else -#define TC_LOG_MESSAGE_BODY(level__, call__, filterType__, ...)     \ -        __pragma(warning(push))                                     \ -        __pragma(warning(disable:4127))                             \ -        do {                                                        \ -            if (sLog->ShouldLog(filterType__, level__))             \ -                sLog->call__(filterType__, __VA_ARGS__);            \ -        } while (0)                                                 \ +#define TC_LOG_MESSAGE_BODY(filterType__, level__, ...)                 \ +        __pragma(warning(push))                                         \ +        __pragma(warning(disable:4127))                                 \ +        do {                                                            \ +            if (sLog->ShouldLog(filterType__, level__))                 \ +                sLog->outMessage(filterType__, level__, __VA_ARGS__);   \ +        } while (0)                                                     \          __pragma(warning(pop))  #endif  #define TC_LOG_TRACE(filterType__, ...) \ -    TC_LOG_MESSAGE_BODY(LOG_LEVEL_TRACE, outTrace, filterType__, __VA_ARGS__) +    TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_TRACE, __VA_ARGS__)  #define TC_LOG_DEBUG(filterType__, ...) \ -    TC_LOG_MESSAGE_BODY(LOG_LEVEL_DEBUG, outDebug, filterType__, __VA_ARGS__) +    TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_DEBUG, __VA_ARGS__)  #define TC_LOG_INFO(filterType__, ...)  \ -    TC_LOG_MESSAGE_BODY(LOG_LEVEL_INFO, outInfo, filterType__, __VA_ARGS__) +    TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_INFO, __VA_ARGS__)  #define TC_LOG_WARN(filterType__, ...)  \ -    TC_LOG_MESSAGE_BODY(LOG_LEVEL_WARN, outWarn, filterType__, __VA_ARGS__) +    TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_WARN, __VA_ARGS__)  #define TC_LOG_ERROR(filterType__, ...) \ -    TC_LOG_MESSAGE_BODY(LOG_LEVEL_ERROR, outError, filterType__, __VA_ARGS__) +    TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_ERROR, __VA_ARGS__)  #define TC_LOG_FATAL(filterType__, ...) \ -    TC_LOG_MESSAGE_BODY(LOG_LEVEL_FATAL, outFatal, filterType__, __VA_ARGS__) +    TC_LOG_MESSAGE_BODY(filterType__, LOG_LEVEL_FATAL, __VA_ARGS__)  #endif 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..6fff993e2ae 100644 --- a/src/server/shared/Logging/Logger.cpp +++ b/src/server/shared/Logging/Logger.cpp @@ -17,32 +17,19 @@  #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;  } -Logger::~Logger() -{ -    for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it) -        it->second = NULL; -    appenders.clear(); -} -  std::string const& Logger::getName() const  {      return name;  } -LogFilterType Logger::getType() const -{ -    return type; -} -  LogLevel Logger::getLogLevel() const  {      return level; @@ -55,12 +42,7 @@ void Logger::addAppender(uint8 id, Appender* appender)  void Logger::delAppender(uint8 id)  { -    AppenderMap::iterator it = appenders.find(id); -    if (it != appenders.end()) -    { -        it->second = NULL; -        appenders.erase(it); -    } +    appenders.erase(id);  }  void Logger::setLogLevel(LogLevel _level) @@ -68,15 +50,15 @@ 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())      { -        //fprintf(stderr, "Logger::write: Logger %s, Level %u. Msg %s Level %u WRONG LEVEL MASK OR EMPTY MSG\n", getName().c_str(), messge.level, message.text.c_str(), .message.level); // DEBUG - RemoveMe +        //fprintf(stderr, "Logger::write: Logger %s, Level %u. Msg %s Level %u WRONG LEVEL MASK OR EMPTY MSG\n", getName().c_str(), getLogLevel(), message.text.c_str(), message.level);          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..24727ce1016 100644 --- a/src/server/shared/Logging/Logger.h +++ b/src/server/shared/Logging/Logger.h @@ -24,21 +24,18 @@ class Logger  {      public:          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;  };  | 
