diff options
Diffstat (limited to 'src/server/shared/Logging')
-rw-r--r-- | src/server/shared/Logging/Appender.h | 5 | ||||
-rw-r--r-- | src/server/shared/Logging/Log.cpp | 45 | ||||
-rw-r--r-- | src/server/shared/Logging/Log.h | 57 |
3 files changed, 62 insertions, 45 deletions
diff --git a/src/server/shared/Logging/Appender.h b/src/server/shared/Logging/Appender.h index 983f6a5ddbe..14fe52f0837 100644 --- a/src/server/shared/Logging/Appender.h +++ b/src/server/shared/Logging/Appender.h @@ -20,8 +20,9 @@ #include "Define.h" #include <time.h> +#include "Dynamic/UnorderedMap.h" + #include <string> -#include <map> enum LogFilterType { @@ -156,6 +157,6 @@ class Appender AppenderFlags flags; }; -typedef std::map<uint8, Appender*> AppenderMap; +typedef UNORDERED_MAP<uint8, Appender*> AppenderMap; #endif diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp index f0275f8c6b2..312a3463aef 100644 --- a/src/server/shared/Logging/Log.cpp +++ b/src/server/shared/Logging/Log.cpp @@ -58,13 +58,10 @@ std::string GetConfigStringDefault(std::string base, const char* name, const cha } // Returns default logger if the requested logger is not found -Logger* Log::GetLoggerByType(LogFilterType filter) +Logger* Log::GetLoggerByType(LogFilterType filterType) { - LoggerMap::iterator it = loggers.begin(); - while (it != loggers.end() && it->second.getType() != filter) - ++it; - - return it == loggers.end() ? &(loggers[0]) : &(it->second); + LoggerMap::iterator it = loggers.find(static_cast<uint8>(filterType)); + return it == loggers.end() ? &loggers[0] : &it->second; } Appender* Log::GetAppenderByName(std::string const& name) @@ -278,7 +275,10 @@ void Log::vlog(LogFilterType filter, LogLevel level, char const* str, va_list ar void Log::write(LogMessage* msg) { if (loggers.empty()) + { + delete msg; return; + } msg->text.append("\n"); Logger* logger = GetLoggerByType(msg->type); @@ -335,26 +335,8 @@ bool Log::SetLogLevel(std::string const& name, const char* newLevelc, bool isLog return true; } -bool Log::ShouldLog(LogFilterType type, LogLevel level) const -{ - LoggerMap::const_iterator it = loggers.find(uint8(type)); - if (it != loggers.end()) - { - LogLevel loggerLevel = it->second.getLogLevel(); - return loggerLevel && loggerLevel <= level; - } - - if (type != LOG_FILTER_GENERAL) - return ShouldLog(LOG_FILTER_GENERAL, level); - - return false; -} - void Log::outTrace(LogFilterType filter, const char * str, ...) { - if (!str || !ShouldLog(filter, LOG_LEVEL_TRACE)) - return; - va_list ap; va_start(ap, str); @@ -365,9 +347,6 @@ void Log::outTrace(LogFilterType filter, const char * str, ...) void Log::outDebug(LogFilterType filter, const char * str, ...) { - if (!str || !ShouldLog(filter, LOG_LEVEL_DEBUG)) - return; - va_list ap; va_start(ap, str); @@ -378,9 +357,6 @@ void Log::outDebug(LogFilterType filter, const char * str, ...) void Log::outInfo(LogFilterType filter, const char * str, ...) { - if (!str || !ShouldLog(filter, LOG_LEVEL_INFO)) - return; - va_list ap; va_start(ap, str); @@ -391,9 +367,6 @@ void Log::outInfo(LogFilterType filter, const char * str, ...) void Log::outWarn(LogFilterType filter, const char * str, ...) { - if (!str || !ShouldLog(filter, LOG_LEVEL_WARN)) - return; - va_list ap; va_start(ap, str); @@ -404,9 +377,6 @@ void Log::outWarn(LogFilterType filter, const char * str, ...) void Log::outError(LogFilterType filter, const char * str, ...) { - if (!str || !ShouldLog(filter, LOG_LEVEL_ERROR)) - return; - va_list ap; va_start(ap, str); @@ -417,9 +387,6 @@ void Log::outError(LogFilterType filter, const char * str, ...) void Log::outFatal(LogFilterType filter, const char * str, ...) { - if (!str || !ShouldLog(filter, LOG_LEVEL_FATAL)) - return; - va_list ap; va_start(ap, str); diff --git a/src/server/shared/Logging/Log.h b/src/server/shared/Logging/Log.h index 46aaea4bad1..d7612c76738 100644 --- a/src/server/shared/Logging/Log.h +++ b/src/server/shared/Logging/Log.h @@ -23,17 +23,16 @@ #include "Appender.h" #include "LogWorker.h" #include "Logger.h" - -#include <ace/Singleton.h> +#include "Dynamic/UnorderedMap.h" #include <string> -#include <set> +#include <ace/Singleton.h> class Log { friend class ACE_Singleton<Log, ACE_Thread_Mutex>; - typedef std::map<uint8, Logger> LoggerMap; + typedef UNORDERED_MAP<uint8, Logger> LoggerMap; private: Log(); @@ -80,6 +79,56 @@ class Log LogWorker* worker; }; +inline bool Log::ShouldLog(LogFilterType type, LogLevel level) const +{ + LoggerMap::const_iterator it = loggers.find(uint8(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 false; +} + #define sLog ACE_Singleton<Log, ACE_Thread_Mutex>::instance() +#if PLATFORM != PLATFORM_WINDOWS +# define TC_LOG_MESSAGE_BODY(level__, call__, filterType__, ...) \ + do { \ + if (sLog->ShouldLog(filterType__, level__)) \ + sLog->call__(filterType__, __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) \ + __pragma(warning(pop)) +#endif + +#define TC_LOG_TRACE(filterType__, ...) \ + TC_LOG_MESSAGE_BODY(LOG_LEVEL_TRACE, outTrace, filterType__, __VA_ARGS__) + +#define TC_LOG_DEBUG(filterType__, ...) \ + TC_LOG_MESSAGE_BODY(LOG_LEVEL_DEBUG, outDebug, filterType__, __VA_ARGS__) + +#define TC_LOG_INFO(filterType__, ...) \ + TC_LOG_MESSAGE_BODY(LOG_LEVEL_INFO, outInfo, filterType__, __VA_ARGS__) + +#define TC_LOG_WARN(filterType__, ...) \ + TC_LOG_MESSAGE_BODY(LOG_LEVEL_WARN, outWarn, filterType__, __VA_ARGS__) + +#define TC_LOG_ERROR(filterType__, ...) \ + TC_LOG_MESSAGE_BODY(LOG_LEVEL_ERROR, outError, filterType__, __VA_ARGS__) + +#define TC_LOG_FATAL(filterType__, ...) \ + TC_LOG_MESSAGE_BODY(LOG_LEVEL_FATAL, outFatal, filterType__, __VA_ARGS__) + #endif |