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"
This commit is contained in:
1 parent
d26bb8517c
commit
8aa9745c4c
12 files changed
+243
-394
No files matched your search
@@ -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)
|
||||
if (tokens.size() != 2)
|
||||
{
|
||||
fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong config option Logger.%s=%s\n", name, options.c_str());
|
||||
fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong config option Logger.%s=%s\n", name.c_str(), options.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
type = uint8(atoi(*iter));
|
||||
if (type > MaxLogFilter)
|
||||
{
|
||||
fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong type %u for logger %s\n", type, name);
|
||||
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);
|
||||
|
||||
Reference in new issue
Block a user