Core/Logging: Try to simplify configuration of loggers and appenders

Changed multiple lines to a simple format:
- Logger.name=Type,LogLevel,Flags,AppenderList
- Appender.name=Type,LogLevel,Flags,optional1,optional2
  * Type = File: optional1 = File name, optiona2 = Mode
  * Type = Console: optional1 = Colors

Created a default set of loggers and appenders.
- Root logger defaults to Error, that means you will see nothing on console by default (not even loading)
- You need to add the loggers to Loggers options if you want to enable them, otherwise Root logger will be used for all types

Restored outSQLDriver (LOG_FILTER_SQL_DRIVER), outSQLDev (LOG_FILTER_SQL_DEV), outArena (LOG_FILTER_ARENA) and outChar (LOG_FILTER_CHARACTER) functionality by creating new types (LOG_FILTER_CHARACTER is a rename of LOG_FILTER_DELETE.

Note: You need to update your config file... again (yeah sorry... trying to make it simpler)
This commit is contained in:
Spp
2012-08-06 12:10:33 +02:00
parent 5746b688fa
commit 97c4b92eb0
12 changed files with 400 additions and 356 deletions

View File

@@ -19,7 +19,7 @@
#include "Log.h"
#include "Common.h"
#include "Config.h"
#include "Util.h"
#include "AppenderConsole.h"
#include "AppenderFile.h"
#include "AppenderDB.h"
@@ -82,30 +82,66 @@ void Log::CreateAppenderFromConfig(const char* name)
if (!name || *name == '\0')
return;
std::string base = "Appender.";
base.append(name);
base.push_back('.');
// 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 = ConfigMgr::GetStringDefault(options.c_str(), "");
Tokens tokens(options, ',');
Tokens::iterator iter = tokens.begin();
LogLevel level = LogLevel(GetConfigIntDefault(base, "Level", 0));
AppenderType type = AppenderType(GetConfigIntDefault(base, "Type", 0));
if (tokens.size() < 2)
{
fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong configuration for appender %s. Config line: %s\n", name, options.c_str());
return;
}
switch(type)
AppenderFlags flags = APPENDER_FLAGS_NONE;
AppenderType type = AppenderType(atoi(*iter));
++iter;
LogLevel level = LogLevel(atoi(*iter));
if (level > LOG_LEVEL_FATAL)
{
fprintf(stderr, "Log::CreateAppenderFromConfig: Wrong Log Level %u for appender %s\n", level, name);
return;
}
if (++iter != tokens.end())
flags = AppenderFlags(atoi(*iter));
switch (type)
{
case APPENDER_CONSOLE:
{
AppenderFlags flags = AppenderFlags(GetConfigIntDefault(base, "Flags", APPENDER_FLAGS_PREFIX_LOGLEVEL | APPENDER_FLAGS_PREFIX_LOGFILTERTYPE));
if (flags == APPENDER_FLAGS_NONE)
flags = AppenderFlags(APPENDER_FLAGS_PREFIX_LOGLEVEL | APPENDER_FLAGS_PREFIX_LOGFILTERTYPE);
AppenderConsole* appender = new AppenderConsole(NextAppenderId(), name, level, flags);
appenders[appender->getId()] = appender;
appender->InitColors(GetConfigStringDefault(base, "Colors", ""));
if (++iter != tokens.end())
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
break;
}
case APPENDER_FILE:
{
std::string filename = GetConfigStringDefault(base, "File", "");
std::string mode = GetConfigStringDefault(base, "Mode", "a");
AppenderFlags flags = AppenderFlags(GetConfigIntDefault(base, "Flags", APPENDER_FLAGS_PREFIX_TIMESTAMP | APPENDER_FLAGS_PREFIX_LOGLEVEL | APPENDER_FLAGS_PREFIX_LOGFILTERTYPE));
std::string filename;
std::string mode = "a";
if (++iter == tokens.end())
{
fprintf(stderr, "Log::CreateAppenderFromConfig: Missing file name for appender %s\n", name);
return;
}
if (flags == APPENDER_FLAGS_NONE)
flags = AppenderFlags(APPENDER_FLAGS_PREFIX_LOGLEVEL | APPENDER_FLAGS_PREFIX_LOGFILTERTYPE | APPENDER_FLAGS_PREFIX_TIMESTAMP);
filename = *iter;
if (++iter != tokens.end())
mode = *iter;
if (flags & APPENDER_FLAGS_USE_TIMESTAMP)
{
@@ -121,13 +157,14 @@ void Log::CreateAppenderFromConfig(const char* name)
//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
break;
}
case APPENDER_DB: // TODO Set realm!
case APPENDER_DB:
{
uint8 id = NextAppenderId();
appenders[id] = new AppenderDB(id, name, level, realm);
break;
}
default:
fprintf(stderr, "Log::CreateAppenderFromConfig: Unknown type %u for appender %s\n", type, name);
break;
}
}
@@ -137,29 +174,49 @@ void Log::CreateLoggerFromConfig(const char* name)
if (!name || *name == '\0')
return;
std::string base = "Logger.";
base.append(name);
base.push_back('.');
LogLevel level = LOG_LEVEL_DISABLED;
int32 type = -1;
LogLevel level = LogLevel(GetConfigIntDefault(base, "Level", 0));
int32 type = GetConfigIntDefault(base, "Type", -1);
std::string options = "Logger.";
options.append(name);
options = ConfigMgr::GetStringDefault(options.c_str(), "");
if (type < 0)
Tokens tokens(options, ',');
Tokens::iterator iter = tokens.begin();
if (tokens.size() != 3)
{
fprintf(stderr, "Log::CreateLoggerFromConfig: Missing entry %sType in config. Logger ignored\n", name);
fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong configuration for logger %s. Config line: %s\n", name, options.c_str());
return;
}
type = atoi(*iter);
if (type > MaxLogFilter)
{
fprintf(stderr, "Log::CreateLoggerFromConfig: Wrong type %u for logger %s\n", type, name);
return;
}
Logger& logger = loggers[type];
if (!logger.getName().empty())
fprintf(stderr, "Error while configuring Logger %s. Replacing (name: %s, Type: %u, Level: %u) with (name: %s, Type: %u, Level: %u)\n",
name, logger.getName().c_str(), logger.getType(), logger.getLogLevel(), name, type, level);
{
fprintf(stderr, "Error while configuring Logger %s. Already defined\n", name);
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);
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
std::istringstream ss(GetConfigStringDefault(base, "Appenders", ""));
++iter;
std::istringstream ss(*iter);
std::string str;
ss >> str;