[9924] Implement .server log filter and .server log level comamnds.

* .server log filter comamnd let temporary (until config reload or restart)
  set log filters state. Or look at filters state.
* .server log level renamed from .server set loglevel but now let look at log level also.
This commit is contained in:
VladimirMangos 2010-05-18 11:58:21 +04:00
parent ffd2cf874d
commit b6d7365ac9
12 changed files with 140 additions and 48 deletions

View file

@ -24,7 +24,7 @@ CREATE TABLE `db_version` (
`version` varchar(120) default NULL,
`creature_ai_version` varchar(120) default NULL,
`cache_id` int(10) default '0',
`required_9899_01_mangos_spell_bonus_data` bit(1) default NULL
`required_9924_02_mangos_command` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
--
@ -754,11 +754,12 @@ INSERT INTO `command` VALUES
('server idleshutdown cancel',3,'Syntax: .server idleshutdown cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
('server idlerestart',3,'Syntax: .server idlerestart #delay\r\n\r\nRestart the server after #delay seconds if no active connections are present (no players). Use #exist_code or 2 as program exist code.'),
('server idlerestart cancel',3,'Syntax: .server idlerestart cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
('server log filter',4,'Syntax: .server log filter [($filtername|all) (on|off)]\r\n\r\nShow or set server log filters. If used "all" then all filters will be set to on/off state.'),
('server log level',4,'Syntax: .server log level [#level]\r\n\r\nShow or set server log level (0 - errors only, 1 - basic, 2 - detail, 3 - debug).'),
('server motd',0,'Syntax: .server motd\r\n\r\nShow server Message of the day.'),
('server plimit',3,'Syntax: .server plimit [#num|-1|-2|-3|reset|player|moderator|gamemaster|administrator]\r\n\r\nWithout arg show current player amount and security level limitations for login to server, with arg set player linit ($num > 0) or securiti limitation ($num < 0 or security leme name. With `reset` sets player limit to the one in the config file'),
('server restart',3,'Syntax: .server restart #delay\r\n\r\nRestart the server after #delay seconds. Use #exist_code or 2 as program exist code.'),
('server restart cancel',3,'Syntax: .server restart cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
('server set loglevel',4,'Syntax: .server set loglevel #level\r\n\r\nSet server log level (0 - errors only, 1 - basic, 2 - detail, 3 - debug).'),
('server set motd',3,'Syntax: .server set motd $MOTD\r\n\r\nSet server Message of the day.'),
('server shutdown',3,'Syntax: .server shutdown #delay [#exit_code]\r\n\r\nShut the server down after #delay seconds. Use #exit_code or 0 as program exit code.'),
('server shutdown cancel',3,'Syntax: .server shutdown cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
@ -3635,6 +3636,8 @@ INSERT INTO `mangos_string` VALUES
(1024, 'Character \'%s\' (GUID: %u Account %u) can\'t be restored: account character list full!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1025, 'Character \'%s\' (GUID: %u Account %u) can\'t be restored: new name already used!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1026, 'GUID: %u Name: %s Account: %s (%u) Date: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1027, 'Log filters state:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1028, 'All log filters set to: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1100,'Account %s (Id: %u) have up to %u expansion allowed now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1101,'Message of the day changed to:\r\n%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1102,'Message sent to %s: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),

View file

@ -0,0 +1,6 @@
ALTER TABLE db_version CHANGE COLUMN required_9899_01_mangos_spell_bonus_data required_9924_01_mangos_mangos_string bit;
DELETE FROM mangos_string WHERE entry IN (1027,1028);
INSERT INTO mangos_string VALUES
(1027, 'Log filters state:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1028, 'All log filters set to: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

View file

@ -0,0 +1,6 @@
ALTER TABLE db_version CHANGE COLUMN required_9924_01_mangos_mangos_string required_9924_02_mangos_command bit;
DELETE FROM command WHERE name IN('server set loglevel','server log level','server log filter');
INSERT INTO command (name, security, help) VALUES
('server log filter',4,'Syntax: .server log filter [($filtername|all) (on|off)]\r\n\r\nShow or set server log filters. If used "all" then all filters will be set to on/off state.'),
('server log level',4,'Syntax: .server log level [#level]\r\n\r\nShow or set server log level (0 - errors only, 1 - basic, 2 - detail, 3 - debug).');

View file

@ -65,6 +65,8 @@ pkgdata_DATA = \
9891_01_mangos_creature_movement.sql \
9891_02_mangos_creature_movement_scripts.sql \
9899_01_mangos_spell_bonus_data.sql \
9924_01_mangos_mangos_string.sql \
9924_02_mangos_command.sql \
README
## Additional files to include when running 'make dist'
@ -110,4 +112,6 @@ EXTRA_DIST = \
9891_01_mangos_creature_movement.sql \
9891_02_mangos_creature_movement_scripts.sql \
9899_01_mangos_spell_bonus_data.sql \
9924_01_mangos_mangos_string.sql \
9924_02_mangos_command.sql \
README

View file

@ -549,9 +549,15 @@ ChatCommand * ChatHandler::getCommandTable()
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand serverLogCommandTable[] =
{
{ "filter", SEC_CONSOLE, true, &ChatHandler::HandleServerLogFilterCommand, "", NULL },
{ "level", SEC_CONSOLE, true, &ChatHandler::HandleServerLogLevelCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand serverSetCommandTable[] =
{
{ "loglevel", SEC_CONSOLE, true, &ChatHandler::HandleServerSetLogLevelCommand, "", NULL },
{ "motd", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerSetMotdCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
@ -563,6 +569,7 @@ ChatCommand * ChatHandler::getCommandTable()
{ "idlerestart", SEC_ADMINISTRATOR, true, NULL, "", serverIdleRestartCommandTable },
{ "idleshutdown", SEC_ADMINISTRATOR, true, NULL, "", serverShutdownCommandTable },
{ "info", SEC_PLAYER, true, &ChatHandler::HandleServerInfoCommand, "", NULL },
{ "log", SEC_CONSOLE, true, NULL, "", serverLogCommandTable },
{ "motd", SEC_PLAYER, true, &ChatHandler::HandleServerMotdCommand, "", NULL },
{ "plimit", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerPLimitCommand, "", NULL },
{ "restart", SEC_ADMINISTRATOR, true, NULL, "", serverRestartCommandTable },
@ -611,29 +618,29 @@ ChatCommand * ChatHandler::getCommandTable()
static ChatCommand commandTable[] =
{
{ "account", SEC_PLAYER, true, NULL, "", accountCommandTable },
{ "gm", SEC_MODERATOR, true, NULL, "", gmCommandTable },
{ "npc", SEC_MODERATOR, false, NULL, "", npcCommandTable },
{ "go", SEC_MODERATOR, false, NULL, "", goCommandTable },
{ "learn", SEC_MODERATOR, false, NULL, "", learnCommandTable },
{ "modify", SEC_MODERATOR, false, NULL, "", modifyCommandTable },
{ "debug", SEC_MODERATOR, true, NULL, "", debugCommandTable },
{ "tele", SEC_MODERATOR, true, NULL, "", teleCommandTable },
{ "cast", SEC_ADMINISTRATOR, false, NULL, "", castCommandTable },
{ "character", SEC_GAMEMASTER, true, NULL, "", characterCommandTable},
{ "debug", SEC_MODERATOR, true, NULL, "", debugCommandTable },
{ "event", SEC_GAMEMASTER, false, NULL, "", eventCommandTable },
{ "gobject", SEC_GAMEMASTER, false, NULL, "", gobjectCommandTable },
{ "gm", SEC_MODERATOR, true, NULL, "", gmCommandTable },
{ "honor", SEC_GAMEMASTER, false, NULL, "", honorCommandTable },
{ "wp", SEC_GAMEMASTER, false, NULL, "", wpCommandTable },
{ "titles", SEC_GAMEMASTER, false, NULL, "", titlesCommandTable },
{ "quest", SEC_ADMINISTRATOR, false, NULL, "", questCommandTable },
{ "reload", SEC_ADMINISTRATOR, true, NULL, "", reloadCommandTable },
{ "go", SEC_MODERATOR, false, NULL, "", goCommandTable },
{ "gobject", SEC_GAMEMASTER, false, NULL, "", gobjectCommandTable },
{ "guild", SEC_ADMINISTRATOR, true, NULL, "", guildCommandTable },
{ "instance", SEC_ADMINISTRATOR, true, NULL, "", instanceCommandTable },
{ "learn", SEC_MODERATOR, false, NULL, "", learnCommandTable },
{ "list", SEC_ADMINISTRATOR, true, NULL, "", listCommandTable },
{ "lookup", SEC_ADMINISTRATOR, true, NULL, "", lookupCommandTable },
{ "modify", SEC_MODERATOR, false, NULL, "", modifyCommandTable },
{ "npc", SEC_MODERATOR, false, NULL, "", npcCommandTable },
{ "pdump", SEC_ADMINISTRATOR, true, NULL, "", pdumpCommandTable },
{ "guild", SEC_ADMINISTRATOR, true, NULL, "", guildCommandTable },
{ "cast", SEC_ADMINISTRATOR, false, NULL, "", castCommandTable },
{ "quest", SEC_ADMINISTRATOR, false, NULL, "", questCommandTable },
{ "reload", SEC_ADMINISTRATOR, true, NULL, "", reloadCommandTable },
{ "reset", SEC_ADMINISTRATOR, true, NULL, "", resetCommandTable },
{ "instance", SEC_ADMINISTRATOR, true, NULL, "", instanceCommandTable },
{ "server", SEC_ADMINISTRATOR, true, NULL, "", serverCommandTable },
{ "tele", SEC_MODERATOR, true, NULL, "", teleCommandTable },
{ "titles", SEC_GAMEMASTER, false, NULL, "", titlesCommandTable },
{ "wp", SEC_GAMEMASTER, false, NULL, "", wpCommandTable },
{ "aura", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAuraCommand, "", NULL },
{ "unaura", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnAuraCommand, "", NULL },

View file

@ -425,10 +425,11 @@ class ChatHandler
bool HandleServerIdleRestartCommand(const char* args);
bool HandleServerIdleShutDownCommand(const char* args);
bool HandleServerInfoCommand(const char* args);
bool HandleServerLogFilterCommand(const char* args);
bool HandleServerLogLevelCommand(const char* args);
bool HandleServerMotdCommand(const char* args);
bool HandleServerPLimitCommand(const char* args);
bool HandleServerRestartCommand(const char* args);
bool HandleServerSetLogLevelCommand(const char* args);
bool HandleServerSetMotdCommand(const char* args);
bool HandleServerShutDownCommand(const char* args);
bool HandleServerShutDownCancelCommand(const char* args);

View file

@ -792,7 +792,9 @@ enum MangosStrings
LANG_CHARACTER_DELETED_SKIP_FULL = 1024,
LANG_CHARACTER_DELETED_SKIP_NAME = 1025,
LANG_CHARACTER_DELETED_LIST_LINE_CHAT = 1026,
// Room for more level 4 1027-1099 not used
LANG_LOG_FILTERS_STATE_HEADER = 1027,
LANG_ALL_LOG_FILTERS_SET_TO_S = 1028,
// Room for more level 4 1029-1099 not used
// Level 3 (continue)
LANG_ACCOUNT_SETADDON = 1100,

View file

@ -531,17 +531,69 @@ bool ChatHandler::HandleAccountCreateCommand(const char* args)
return true;
}
/// Set the level of logging
bool ChatHandler::HandleServerSetLogLevelCommand(const char *args)
/// Set the filters of logging
bool ChatHandler::HandleServerLogFilterCommand(const char* args)
{
if(!*args)
{
uint32 logfiler = sLog.getLogFilter();
SendSysMessage(LANG_LOG_FILTERS_STATE_HEADER);
for(int i = 0; i < LOG_FILTER_COUNT; ++i)
PSendSysMessage(" %-20s = %s",logFilterData[i].name,(logfiler & (1 << i)) !=0 ? GetMangosString(LANG_ON) : GetMangosString(LANG_OFF));
return true;
}
char *filtername = strtok((char*)args, " ");
if (!filtername)
return false;
char *NewLevel = strtok((char*)args, " ");
if (!NewLevel)
char *value_str = strtok(NULL, " ");
if (!value_str)
return false;
sLog.SetLogLevel(NewLevel);
bool value;
if (strncmp(value_str, "on", 3) == 0)
value = true;
else if (strncmp(value_str, "off", 4) == 0)
value = false;
else
{
SendSysMessage(LANG_USE_BOL);
SetSentErrorMessage(true);
return false;
}
if (strncmp(filtername, "all", 4) == 0)
{
sLog.SetLogFilter(LogFilters(0xFFFFFFFF),value);
PSendSysMessage(LANG_ALL_LOG_FILTERS_SET_TO_S, value ? GetMangosString(LANG_ON) : GetMangosString(LANG_OFF));
return true;
}
for(int i = 0; i < LOG_FILTER_COUNT; ++i)
{
if (!strncmp(filtername,logFilterData[i].name,strlen(filtername)))
{
sLog.SetLogFilter(LogFilters(1 << i),value);
PSendSysMessage(" %-20s = %s",logFilterData[i].name,value ? GetMangosString(LANG_ON) : GetMangosString(LANG_OFF));
return true;
}
}
return false;
}
/// Set the level of logging
bool ChatHandler::HandleServerLogLevelCommand(const char *args)
{
if(!*args)
{
PSendSysMessage("Log level: %u");
return true;
}
sLog.SetLogLevel((char*)args);
return true;
}

View file

@ -32,6 +32,20 @@
INSTANTIATE_SINGLETON_1( Log );
LogFilterData logFilterData[LOG_FILTER_COUNT] =
{
{ "transport_moves", "LogFilter_TransportMoves", true },
{ "creature_moves", "LogFilter_CreatureMoves", true },
{ "visibility_changes", "LogFilter_VisibilityChanges", true },
{ "achievement_updates", "LogFilter_AchievementUpdates", true },
{ "weather", "LogFilter_Weather", true },
{ "player_stats", "LogFilter_PlayerStats", false },
{ "sql_text", "LogFilter_SQLText", false },
{ "player_moves", "LogFilter_PlayerMoves", false },
{ "periodic_effects", "LogFilter_PeriodicAffects", false },
{ "ai_and_movegens", "LogFilter_AIAndMovegens", false },
};
enum LogType
{
LogNormal = 0,
@ -250,26 +264,10 @@ void Log::Initialize()
InitColors(sConfig.GetStringDefault("LogColors", ""));
m_logFilter = 0;
if (sConfig.GetBoolDefault("LogFilter_TransportMoves", true))
m_logFilter |= LOG_FILTER_TRANSPORT_MOVES;
if (sConfig.GetBoolDefault("LogFilter_CreatureMoves", true))
m_logFilter |= LOG_FILTER_CREATURE_MOVES;
if (sConfig.GetBoolDefault("LogFilter_VisibilityChanges", true))
m_logFilter |= LOG_FILTER_VISIBILITY_CHANGES;
if (sConfig.GetBoolDefault("LogFilter_AchievementUpdates", true))
m_logFilter |= LOG_FILTER_ACHIEVEMENT_UPDATES;
if (sConfig.GetBoolDefault("LogFilter_Weather", true))
m_logFilter |= LOG_FILTER_WEATHER;
if (sConfig.GetBoolDefault("LogFilter_SQLText", false))
m_logFilter |= LOG_FILTER_SQL_TEXT;
if (sConfig.GetBoolDefault("LogFilter_PlayerMoves", false))
m_logFilter |= LOG_FILTER_PLAYER_MOVES;
if (sConfig.GetBoolDefault("LogFilter_PeriodicAffects", false))
m_logFilter |= LOG_FILTER_PERIODIC_AFFECTS;
if (sConfig.GetBoolDefault("LogFilter_AIAndMovegens", false))
m_logFilter |= LOG_FILTER_AI_AND_MOVEGENSS;
for(int i = 0; i < LOG_FILTER_COUNT; ++i)
if (logFilterData[i].name)
if (sConfig.GetBoolDefault(logFilterData[i].configName, logFilterData[i].defaultState))
m_logFilter |= (1 << i);
// Char log settings
m_charLog_Dump = sConfig.GetBoolDefault("CharLogDump", false);

View file

@ -33,7 +33,7 @@ enum LogLevel
LOG_LVL_DEBUG = 3
};
// bitmask
// bitmask (not forgot update logFilterData content)
enum LogFilters
{
LOG_FILTER_TRANSPORT_MOVES = 0x0001, // any related to transport moves
@ -48,6 +48,17 @@ enum LogFilters
LOG_FILTER_AI_AND_MOVEGENSS = 0x0200, // DoT/HoT apply trace
};
#define LOG_FILTER_COUNT 10
struct LogFilterData
{
char const* name;
char const* configName;
bool defaultState;
};
extern LogFilterData logFilterData[LOG_FILTER_COUNT];
enum Color
{
BLACK,
@ -129,6 +140,7 @@ class Log : public MaNGOS::Singleton<Log, MaNGOS::ClassLevelLockable<Log, ACE_Th
// any log level
void outCharDump( const char * str, uint32 account_id, uint32 guid, const char * name );
void outRALog( const char * str, ... ) ATTR_PRINTF(2,3);
uint32 GetLogLevel() const { return m_logLevel; }
void SetLogLevel(char * Level);
void SetLogFileLevel(char * Level);
void SetColor(bool stdout_stream, Color color);
@ -137,6 +149,7 @@ class Log : public MaNGOS::Singleton<Log, MaNGOS::ClassLevelLockable<Log, ACE_Th
static void outTimestamp(FILE* file);
static std::string GetTimestampStr();
uint32 getLogFilter() const { return m_logFilter; }
void SetLogFilter(LogFilters filter, bool on) { if (on) m_logFilter |= filter; else m_logFilter &= ~filter; }
bool HasLogLevelOrHigher(LogLevel loglvl) const { return m_logLevel >= loglvl || (m_logFileLevel >= loglvl && logfile); }
bool IsOutCharDump() const { return m_charLog_Dump; }
bool IsIncludeTime() const { return m_includeTime; }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "9923"
#define REVISION_NR "9924"
#endif // __REVISION_NR_H__

View file

@ -1,6 +1,6 @@
#ifndef __REVISION_SQL_H__
#define __REVISION_SQL_H__
#define REVISION_DB_CHARACTERS "required_9849_01_characters_saved_variables"
#define REVISION_DB_MANGOS "required_9899_01_mangos_spell_bonus_data"
#define REVISION_DB_MANGOS "required_9924_02_mangos_command"
#define REVISION_DB_REALMD "required_9748_01_realmd_realmlist"
#endif // __REVISION_SQL_H__