aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Logging
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/shared/Logging')
-rw-r--r--src/server/shared/Logging/Appender.h5
-rw-r--r--src/server/shared/Logging/Log.cpp45
-rw-r--r--src/server/shared/Logging/Log.h57
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