Core/Logging: Add option to remove timestamp, Log Level and Log Filter Type from logged msgs

- Appender config option .Timestamp and .Backup became obsolete
- New Appender config option .Flags added

Appender Console prefixes Log Level and Log Filter Type to the logged text as default
Appender File prefixes Timestamp, Log Level and Log Filter Type to the logged text as default
This commit is contained in:
Spp
2012-08-05 15:38:25 +02:00
parent 0b98656b28
commit 3f42094b9c
11 changed files with 100 additions and 47 deletions

View File

@@ -206,16 +206,15 @@ LoginDatabase.WorkerThreads = 1
# Default: a - (Append)
# w - (Overwrite)
#
# Appender.name.Backup
# Description: Make a backup of existing file before overwrite
# (Only used with Mode = w)
# Default: 0 - false
# 1 - true
#
# Appender.name.Timestamp
# Description: Append timestamp to the log file name.
# Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
# (Only used with Type = 2)
# Appender.name.Flags
# Description:
# Default: Console = 6, File = 7, DB = 0
# 0 - None
# 1 - Prefix Timestamp to the text
# 2 - Prefix Log Level to the text
# 4 - Prefix Log Filter type to the text
# 8 - Append timestamp to the log file name. Format: YYYY-MM-DD_HH-MM-SS (Only used with Type = 2)
# 16 - Make a backup of existing file before overwrite (Only used with Mode = w)
#
# Logger config values: Given a logger "name" the following options
# can be read:

View File

@@ -1006,7 +1006,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
SendNotification(LANG_GM_ON);
std::string IP_str = GetRemoteAddress();
sLog->outDebug(LOG_FILTER_PLAYER, "Account: %d (IP: %s) Login Character:[%s] (GUID: %u) Level: %d",
sLog->outInfo(LOG_FILTER_PLAYER_LOADING, "Account: %d (IP: %s) Login Character:[%s] (GUID: %u) Level: %d",
GetAccountId(), IP_str.c_str(), pCurrChar->GetName(), pCurrChar->GetGUIDLow(), pCurrChar->getLevel());
if (!pCurrChar->IsStandState() && !pCurrChar->HasUnitState(UNIT_STATE_STUNNED))

View File

@@ -534,7 +534,7 @@ void WorldSession::LogoutPlayer(bool Save)
// e.g if he got disconnected during a transfer to another map
// calls to GetMap in this case may cause crashes
_player->CleanupsBeforeDelete();
sLog->outDebug(LOG_FILTER_PLAYER, "Account: %d (IP: %s) Logout Character:[%s] (GUID: %u) Level: %d", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName(), _player->GetGUIDLow(), _player->getLevel());
sLog->outInfo(LOG_FILTER_PLAYER_LOADING, "Account: %d (IP: %s) Logout Character:[%s] (GUID: %u) Level: %d", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName(), _player->GetGUIDLow(), _player->getLevel());
if (Map* _map = _player->FindMap())
_map->RemovePlayerFromMap(_player, true);

View File

@@ -31,8 +31,8 @@ std::string LogMessage::getTimeStr()
return getTimeStr(mtime);
}
Appender::Appender(uint8 _id, std::string const& _name, AppenderType _type /* = APPENDER_NONE*/, LogLevel _level /* = LOG_LEVEL_DISABLED */):
id(_id), name(_name), type(_type), level(_level)
Appender::Appender(uint8 _id, std::string const& _name, AppenderType _type /* = APPENDER_NONE*/, LogLevel _level /* = LOG_LEVEL_DISABLED */, AppenderFlags _flags /* = APPENDER_FLAGS_NONE */):
id(_id), name(_name), type(_type), level(_level), flags(_flags)
{
}
@@ -60,6 +60,11 @@ LogLevel Appender::getLogLevel() const
return level;
}
AppenderFlags Appender::getFlags() const
{
return flags;
}
void Appender::setLogLevel(LogLevel _level)
{
level = _level;
@@ -67,9 +72,40 @@ void Appender::setLogLevel(LogLevel _level)
void Appender::write(LogMessage& message)
{
if (level && level <= message.level)
_write(message);
//else fprintf(stderr, "Appender::write: Appender %s, Level %s. Msg %s Level %s Type %s WRONG LEVEL MASK\n", getName().c_str(), getLogLevelString(level), message.text.c_str(), getLogLevelString(message.level), getLogFilterTypeString(message.type)); // DEBUG - RemoveMe
if (!level || level > message.level)
{
//fprintf(stderr, "Appender::write: Appender %s, Level %s. Msg %s Level %s Type %s WRONG LEVEL MASK\n", getName().c_str(), getLogLevelString(level), message.text.c_str(), getLogLevelString(message.level), getLogFilterTypeString(message.type)); // DEBUG - RemoveMe
return;
}
message.prefix.clear();
if (flags & APPENDER_FLAGS_PREFIX_TIMESTAMP)
message.prefix.append(message.getTimeStr().c_str());
if (flags & APPENDER_FLAGS_PREFIX_LOGLEVEL)
{
if (!message.prefix.empty())
message.prefix.push_back(' ');
char text[MAX_QUERY_LEN];
snprintf(text, MAX_QUERY_LEN, "%-5s", Appender::getLogLevelString(message.level));
message.prefix.append(text);
}
if (flags & APPENDER_FLAGS_PREFIX_LOGFILTERTYPE)
{
if (!message.prefix.empty())
message.prefix.push_back(' ');
char text[MAX_QUERY_LEN];
snprintf(text, MAX_QUERY_LEN, "[%-15s]", Appender::getLogFilterTypeString(message.type));
message.prefix.append(text);
}
if (!message.prefix.empty())
message.prefix.push_back(' ');
_write(message);
}
const char* Appender::getLogLevelString(LogLevel level)
@@ -163,6 +199,8 @@ char const* Appender::getLogFilterTypeString(LogFilterType type)
return "WORLDSERVER";
case LOG_FILTER_GAMEEVENTS:
return "GAMEEVENTS";
case LOG_FILTER_CALENDAR:
return "CALENDAR";
default:
break;
}

View File

@@ -85,9 +85,23 @@ enum AppenderType
APPENDER_DB,
};
enum AppenderFlags
{
APPENDER_FLAGS_NONE = 0x00,
APPENDER_FLAGS_PREFIX_TIMESTAMP = 0x01,
APPENDER_FLAGS_PREFIX_LOGLEVEL = 0x02,
APPENDER_FLAGS_PREFIX_LOGFILTERTYPE = 0x04,
APPENDER_FLAGS_USE_TIMESTAMP = 0x08, // only used by FileAppender
APPENDER_FLAGS_MAKE_FILE_BACKUP = 0x10 // only used by FileAppender
};
struct LogMessage
{
LogMessage(LogLevel _level, LogFilterType _type, std::string _text): level(_level), type(_type), text(_text)
LogMessage(LogLevel _level, LogFilterType _type, std::string _text)
: level(_level)
, type(_type)
, text(_text)
, param1(0)
{
mtime = time(NULL);
}
@@ -98,6 +112,7 @@ struct LogMessage
LogLevel level;
LogFilterType type;
std::string text;
std::string prefix;
uint32 param1;
time_t mtime;
};
@@ -105,13 +120,14 @@ struct LogMessage
class Appender
{
public:
Appender(uint8 _id, std::string const& name, AppenderType type = APPENDER_NONE, LogLevel level = LOG_LEVEL_DISABLED);
Appender(uint8 _id, std::string const& name, AppenderType type = APPENDER_NONE, LogLevel level = LOG_LEVEL_DISABLED, AppenderFlags flags = APPENDER_FLAGS_NONE);
virtual ~Appender();
uint8 getId() const;
std::string const& getName() const;
AppenderType getType() const;
LogLevel getLogLevel() const;
AppenderFlags getFlags() const;
void setLogLevel(LogLevel);
void write(LogMessage& message);
@@ -125,6 +141,7 @@ class Appender
std::string name;
AppenderType type;
LogLevel level;
AppenderFlags flags;
};
typedef std::map<uint8, Appender*> AppenderMap;

View File

@@ -21,9 +21,11 @@
#include <sstream>
AppenderConsole::AppenderConsole(uint8 id, std::string const& name, LogLevel level):
Appender(id, name, APPENDER_CONSOLE, level), _colored(false), _colors()
AppenderConsole::AppenderConsole(uint8 id, std::string const& name, LogLevel level, AppenderFlags flags):
Appender(id, name, APPENDER_CONSOLE, level, flags), _colored(false)
{
for (uint8 i = 0; i < MaxLogLevels; ++i)
_colors[i] = ColorTypes(MaxColors);
}
void AppenderConsole::InitColors(std::string const& str)
@@ -183,9 +185,9 @@ void AppenderConsole::_write(LogMessage& message)
}
SetColor(stdout_stream, _colors[index]);
utf8printf(stdout_stream ? stdout : stderr, "%s %-5s [%-15s] %s", message.getTimeStr().c_str(), Appender::getLogLevelString(message.level), Appender::getLogFilterTypeString(message.type), message.text.c_str());
utf8printf(stdout_stream ? stdout : stderr, "%s%s", message.prefix.c_str(), message.text.c_str());
ResetColor(stdout_stream);
}
else
utf8printf(stdout_stream ? stdout : stderr, "%s %-5s [%-15s] %s", message.getTimeStr().c_str(), Appender::getLogLevelString(message.level), Appender::getLogFilterTypeString(message.type), message.text.c_str());
utf8printf(stdout_stream ? stdout : stderr, "%s%s", message.prefix.c_str(), message.text.c_str());
}

View File

@@ -45,7 +45,7 @@ const uint8 MaxColors = uint8(WHITE) + 1;
class AppenderConsole: public Appender
{
public:
AppenderConsole(uint8 _id, std::string const& name, LogLevel level);
AppenderConsole(uint8 _id, std::string const& name, LogLevel level, AppenderFlags flags);
void InitColors(const std::string& init_str);
private:

View File

@@ -18,16 +18,16 @@
#include "AppenderFile.h"
#include "Common.h"
AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, const char* _filename, const char* _logDir, const char* _mode, bool _backup)
: Appender(id, name, APPENDER_FILE, level)
AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, const char* _filename, const char* _logDir, const char* _mode, AppenderFlags _flags)
: Appender(id, name, APPENDER_FILE, level, _flags)
, filename(_filename)
, logDir(_logDir)
, mode(_mode)
, backup(_backup)
{
dynamicName = std::string::npos != filename.find("%u");
backup = _flags & APPENDER_FLAGS_MAKE_FILE_BACKUP;
if (!dynamicName)
logfile = OpenFile(_filename, _mode, _backup);
logfile = OpenFile(_filename, _mode, backup);
}
AppenderFile::~AppenderFile()
@@ -50,8 +50,7 @@ void AppenderFile::_write(LogMessage& message)
if (logfile)
{
fprintf(logfile, "%s %-5s [%-15s] %s", message.getTimeStr().c_str(), Appender::getLogLevelString(message.level), Appender::getLogFilterTypeString(message.type), message.text.c_str());
fprintf(logfile, "%s%s", message.prefix.c_str(), message.text.c_str());
fflush(logfile);
if (dynamicName)

View File

@@ -23,7 +23,7 @@
class AppenderFile: public Appender
{
public:
AppenderFile(uint8 _id, std::string const& _name, LogLevel level, const char* filename, const char* logDir, const char* mode, bool backup);
AppenderFile(uint8 _id, std::string const& _name, LogLevel level, const char* filename, const char* logDir, const char* mode, AppenderFlags flags);
~AppenderFile();
FILE* OpenFile(std::string const& _name, std::string const& _mode, bool _backup);

View File

@@ -103,7 +103,8 @@ void Log::CreateAppenderFromConfig(const char* name)
{
case APPENDER_CONSOLE:
{
AppenderConsole* appender = new AppenderConsole(NextAppenderId(), name, level);
AppenderFlags flags = AppenderFlags(GetConfigIntDefault(base, "Flags", 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", ""));
@@ -114,10 +115,9 @@ void Log::CreateAppenderFromConfig(const char* name)
{
std::string filename = GetConfigStringDefault(base, "File", "");
std::string mode = GetConfigStringDefault(base, "Mode", "a");
std::string timestamp = GetConfigStringDefault(base, "Timestamp", "");
bool backup = GetConfigIntDefault(base, "Backup", 0);
AppenderFlags flags = AppenderFlags(GetConfigIntDefault(base, "Flags", APPENDER_FLAGS_PREFIX_TIMESTAMP | APPENDER_FLAGS_PREFIX_LOGLEVEL | APPENDER_FLAGS_PREFIX_LOGFILTERTYPE));
if (!timestamp.empty())
if (flags & APPENDER_FLAGS_USE_TIMESTAMP)
{
size_t dot_pos = filename.find_last_of(".");
if (dot_pos != filename.npos)
@@ -127,7 +127,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(), backup);
appenders[id] = new AppenderFile(id, name, level, filename.c_str(), m_logsDir.c_str(), mode.c_str(), flags);
//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;
}
@@ -228,7 +228,6 @@ void Log::EnableDBAppenders()
for (AppenderMap::iterator it = appenders.begin(); it != appenders.end(); ++it)
if (it->second && it->second->getType() == APPENDER_DB)
((AppenderDB *)it->second)->setEnable(true);
}
void Log::log(LogFilterType filter, LogLevel level, char const* str, ...)

View File

@@ -2637,16 +2637,15 @@ PlayerDump.DisallowOverwrite = 1
# Default: a - (Append)
# w - (Overwrite)
#
# Appender.name.Backup
# Description: Make a backup of existing file before overwrite
# (Only used with Mode = w)
# Default: 0 - false
# 1 - true
#
# Appender.name.Timestamp
# Description: Append timestamp to the log file name.
# Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
# (Only used with Type = 2)
# Appender.name.Flags
# Description:
# Default: Console = 6, File = 7, DB = 0
# 0 - None
# 1 - Prefix Timestamp to the text
# 2 - Prefix Log Level to the text
# 4 - Prefix Log Filter type to the text
# 8 - Append timestamp to the log file name. Format: YYYY-MM-DD_HH-MM-SS (Only used with Type = 2)
# 16 - Make a backup of existing file before overwrite (Only used with Mode = w)
#
# Logger config values: Given a logger "name" the following options
# can be read: