feat(Core/Logging): rework logging (#4692)

* feat(Core/Logging): rework logging

* correct level for sql.sql

* del unused config options

* Correct build

* correct after merge

* whitespace

20:29:37 1. 'Player.cpp'. Replace (1)
20:29:37 2. 'ObjectMgr.cpp'. Replace (3)

* 1

* correct logging

* correct affter merge

* 1

* 2

* LOG_LEVEL_WARN

* #include "AppenderDB.h"

* 3

* 4

* 5

* 1. 'WorldSocket.cpp'. Replace (1)

* 6

* 1
This commit is contained in:
Kargatum
2021-04-17 16:20:07 +07:00
committed by GitHub
parent b2861be1cd
commit 4af4cbd3d9
246 changed files with 7413 additions and 6807 deletions

View File

@@ -23,11 +23,11 @@ void ACSoapRunnable::run()
soap.send_timeout = 5;
if (!soap_valid_socket(soap_bind(&soap, _host.c_str(), _port, 100)))
{
sLog->outError("ACSoap: couldn't bind to %s:%d", _host.c_str(), _port);
LOG_ERROR("server", "ACSoap: couldn't bind to %s:%d", _host.c_str(), _port);
exit(-1);
}
sLog->outString("ACSoap: bound to http://%s:%d", _host.c_str(), _port);
LOG_INFO("server", "ACSoap: bound to http://%s:%d", _host.c_str(), _port);
while (!World::IsStopped())
{
@@ -35,7 +35,7 @@ void ACSoapRunnable::run()
continue; // ran into an accept timeout
#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
sLog->outDebug(LOG_FILTER_NETWORKIO, "ACSoap: accepted connection from IP=%d.%d.%d.%d", (int)(soap.ip >> 24) & 0xFF, (int)(soap.ip >> 16) & 0xFF, (int)(soap.ip >> 8) & 0xFF, (int)soap.ip & 0xFF);
LOG_DEBUG("network", "ACSoap: accepted connection from IP=%d.%d.%d.%d", (int)(soap.ip >> 24) & 0xFF, (int)(soap.ip >> 16) & 0xFF, (int)(soap.ip >> 8) & 0xFF, (int)soap.ip & 0xFF);
#endif
struct soap* thread_soap = soap_copy(&soap);// make a safe copy
@@ -72,7 +72,7 @@ int ns1__executeCommand(soap* soap, char* command, char** result)
if (!soap->userid || !soap->passwd)
{
#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
sLog->outDebug(LOG_FILTER_NETWORKIO, "ACSoap: Client didn't provide login information");
LOG_DEBUG("network", "ACSoap: Client didn't provide login information");
#endif
return 401;
}
@@ -81,7 +81,7 @@ int ns1__executeCommand(soap* soap, char* command, char** result)
if (!accountId)
{
#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
sLog->outDebug(LOG_FILTER_NETWORKIO, "ACSoap: Client used invalid username '%s'", soap->userid);
LOG_DEBUG("network", "ACSoap: Client used invalid username '%s'", soap->userid);
#endif
return 401;
}
@@ -89,7 +89,7 @@ int ns1__executeCommand(soap* soap, char* command, char** result)
if (!AccountMgr::CheckPassword(accountId, soap->passwd))
{
#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
sLog->outDebug(LOG_FILTER_NETWORKIO, "ACSoap: invalid password for account '%s'", soap->userid);
LOG_DEBUG("network", "ACSoap: invalid password for account '%s'", soap->userid);
#endif
return 401;
}
@@ -97,7 +97,7 @@ int ns1__executeCommand(soap* soap, char* command, char** result)
if (AccountMgr::GetSecurity(accountId) < SEC_ADMINISTRATOR)
{
#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
sLog->outDebug(LOG_FILTER_NETWORKIO, "ACSoap: %s's gmlevel is too low", soap->userid);
LOG_DEBUG("network", "ACSoap: %s's gmlevel is too low", soap->userid);
#endif
return 403;
}
@@ -106,7 +106,7 @@ int ns1__executeCommand(soap* soap, char* command, char** result)
return soap_sender_fault(soap, "Command can not be empty", "The supplied command was an empty string");
#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
sLog->outDebug(LOG_FILTER_NETWORKIO, "ACSoap: got command '%s'", command);
LOG_DEBUG("network", "ACSoap: got command '%s'", command);
#endif
SOAPCommand connection;
@@ -122,7 +122,7 @@ int ns1__executeCommand(soap* soap, char* command, char** result)
int acc = connection.pendingCommands.acquire();
if (acc)
{
sLog->outError("ACSoap: Error while acquiring lock, acc = %i, errno = %u", acc, errno);
LOG_ERROR("server", "ACSoap: Error while acquiring lock, acc = %i, errno = %u", acc, errno);
}
// alright, command finished

View File

@@ -8,6 +8,7 @@
/// @{
/// \file
#include "AppenderDB.h"
#include "Common.h"
#include "Configuration/Config.h"
#include "Database/DatabaseEnv.h"
@@ -35,10 +36,6 @@ char serviceDescription[] = "AzerothCore World of Warcraft emulator world servic
int m_ServiceStatus = -1;
#endif
WorldDatabaseWorkerPool WorldDatabase; ///< Accessor to the world database
CharacterDatabaseWorkerPool CharacterDatabase; ///< Accessor to the character database
LoginDatabaseWorkerPool LoginDatabase; ///< Accessor to the realm/login database
uint32 realmID; ///< Id of the realm
/// Print out the usage string for this program on the console.
@@ -122,9 +119,12 @@ extern int main(int argc, char** argv)
if (!sConfigMgr->LoadAppConfigs())
return 1;
sLog->outString("Using configuration file %s.", configFile.c_str());
sLog->outString("Using SSL version: %s (library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION));
sLog->outString("Using ACE version: %s", ACE_VERSION);
sLog->RegisterAppender<AppenderDB>();
sLog->Initialize();
LOG_INFO("server.worldserver", "Using configuration file %s.", configFile.c_str());
LOG_INFO("server.worldserver", "Using SSL version: %s (library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION));
LOG_INFO("server.worldserver", "Using ACE version: %s", ACE_VERSION);
///- and run the 'Master'
/// @todo Why do we need this 'Master'? Can't all of this be in the Main as for Realmd?

View File

@@ -48,22 +48,18 @@ void HandleSignal(int sigNum)
{
switch (sigNum)
{
case SIGINT:
World::StopNow(RESTART_EXIT_CODE);
break;
case SIGTERM:
case SIGINT:
World::StopNow(RESTART_EXIT_CODE);
break;
case SIGTERM:
#if AC_PLATFORM == AC_PLATFORM_WINDOWS
case SIGBREAK:
if (m_ServiceStatus != 1)
case SIGBREAK:
if (m_ServiceStatus != 1)
#endif
World::StopNow(SHUTDOWN_EXIT_CODE);
break;
/*case SIGSEGV:
sLog->outString("ZOMG! SIGSEGV handled!");
World::StopNow(SHUTDOWN_EXIT_CODE);
break;*/
default:
break;
World::StopNow(SHUTDOWN_EXIT_CODE);
break;
default:
break;
}
}
@@ -82,7 +78,7 @@ public:
if (!_delayTime)
return;
sLog->outString("Starting up anti-freeze thread (%u seconds max stuck time)...", _delayTime / 1000);
LOG_INFO("server", "Starting up anti-freeze thread (%u seconds max stuck time)...", _delayTime / 1000);
while (!World::IsStopped())
{
uint32 curtime = getMSTime();
@@ -93,13 +89,13 @@ public:
}
else if (getMSTimeDiff(_lastChange, curtime) > _delayTime)
{
sLog->outString("World Thread hangs, kicking out server!");
LOG_INFO("server", "World Thread hangs, kicking out server!");
ABORT();
}
acore::Thread::Sleep(1000);
}
sLog->outString("Anti-freeze thread exiting without problems.");
LOG_INFO("server", "Anti-freeze thread exiting without problems.");
}
};
@@ -116,33 +112,33 @@ int Master::Run()
BigNumber seed1;
seed1.SetRand(16 * 8);
sLog->outString("%s (worldserver-daemon)", GitRevision::GetFullVersion());
sLog->outString("<Ctrl-C> to stop.\n");
LOG_INFO("server", "%s (worldserver-daemon)", GitRevision::GetFullVersion());
LOG_INFO("server", "<Ctrl-C> to stop.\n");
sLog->outString(" █████╗ ███████╗███████╗██████╗ ██████╗ ████████╗██╗ ██╗");
sLog->outString(" ██╔══██╗╚══███╔╝██╔════╝██╔══██╗██╔═══██╗╚══██╔══╝██║ ██║");
sLog->outString(" ███████║ ███╔╝ █████╗ ██████╔╝██║ ██║ ██║ ███████║");
sLog->outString(" ██╔══██║ ███╔╝ ██╔══╝ ██╔══██╗██║ ██║ ██║ ██╔══██║");
sLog->outString(" ██║ ██║███████╗███████╗██║ ██║╚██████╔╝ ██║ ██║ ██║");
sLog->outString(" ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝");
sLog->outString(" ██████╗ ██████╗ ██████╗ ███████╗");
sLog->outString(" ██╔════╝██╔═══██╗██╔══██╗██╔═══╝");
sLog->outString(" ██║ ██║ ██║██████╔╝█████╗");
sLog->outString(" ██║ ██║ ██║██╔══██╗██╔══╝");
sLog->outString(" ╚██████╗╚██████╔╝██║ ██║███████╗");
sLog->outString(" ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝\n");
LOG_INFO("server", " █████╗ ███████╗███████╗██████╗ ██████╗ ████████╗██╗ ██╗");
LOG_INFO("server", " ██╔══██╗╚══███╔╝██╔════╝██╔══██╗██╔═══██╗╚══██╔══╝██║ ██║");
LOG_INFO("server", " ███████║ ███╔╝ █████╗ ██████╔╝██║ ██║ ██║ ███████║");
LOG_INFO("server", " ██╔══██║ ███╔╝ ██╔══╝ ██╔══██╗██║ ██║ ██║ ██╔══██║");
LOG_INFO("server", " ██║ ██║███████╗███████╗██║ ██║╚██████╔╝ ██║ ██║ ██║");
LOG_INFO("server", " ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝");
LOG_INFO("server", " ██████╗ ██████╗ ██████╗ ███████╗");
LOG_INFO("server", " ██╔════╝██╔═══██╗██╔══██╗██╔═══╝");
LOG_INFO("server", " ██║ ██║ ██║██████╔╝█████╗");
LOG_INFO("server", " ██║ ██║ ██║██╔══██╗██╔══╝");
LOG_INFO("server", " ╚██████╗╚██████╔╝██║ ██║███████╗");
LOG_INFO("server", " ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝\n");
sLog->outString(" AzerothCore 3.3.5a - www.azerothcore.org\n");
LOG_INFO("server", " AzerothCore 3.3.5a - www.azerothcore.org\n");
/// worldserver PID file creation
std::string pidFile = sConfigMgr->GetOption<std::string>("PidFile", "");
if (!pidFile.empty())
{
if (uint32 pid = CreatePIDFile(pidFile))
sLog->outError("Daemon PID: %u\n", pid); // outError for red color in console
LOG_ERROR("server", "Daemon PID: %u\n", pid); // outError for red color in console
else
{
sLog->outError("Cannot create PID file %s (possible error: permission)\n", pidFile.c_str());
LOG_ERROR("server", "Cannot create PID file %s (possible error: permission)\n", pidFile.c_str());
return 1;
}
}
@@ -214,20 +210,20 @@ int Master::Run()
ULONG_PTR currentAffinity = affinity & appAff; // remove non accessible processors
if (!currentAffinity)
sLog->outError("Processors marked in UseProcessors bitmask (hex) %x are not accessible for the worldserver. Accessible processors bitmask (hex): %x", affinity, appAff);
LOG_ERROR("server", "Processors marked in UseProcessors bitmask (hex) %x are not accessible for the worldserver. Accessible processors bitmask (hex): %x", affinity, appAff);
else if (SetProcessAffinityMask(hProcess, currentAffinity))
sLog->outString("Using processors (bitmask, hex): %x", currentAffinity);
LOG_INFO("server", "Using processors (bitmask, hex): %x", currentAffinity);
else
sLog->outError("Can't set used processors (hex): %x", currentAffinity);
LOG_ERROR("server", "Can't set used processors (hex): %x", currentAffinity);
}
}
if (highPriority)
{
if (SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS))
sLog->outString("worldserver process priority class set to HIGH");
LOG_INFO("server", "worldserver process priority class set to HIGH");
else
sLog->outError("Can't set worldserver process priority class.");
LOG_ERROR("server", "Can't set worldserver process priority class.");
}
#else // Linux
@@ -242,21 +238,21 @@ int Master::Run()
CPU_SET(i, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask))
sLog->outError("Can't set used processors (hex): %x, error: %s", affinity, strerror(errno));
LOG_ERROR("server", "Can't set used processors (hex): %x, error: %s", affinity, strerror(errno));
else
{
CPU_ZERO(&mask);
sched_getaffinity(0, sizeof(mask), &mask);
sLog->outString("Using processors (bitmask, hex): %lx", *(__cpu_mask*)(&mask));
LOG_INFO("server", "Using processors (bitmask, hex): %lx", *(__cpu_mask*)(&mask));
}
}
if (highPriority)
{
if (setpriority(PRIO_PROCESS, 0, PROCESS_HIGH_PRIORITY))
sLog->outError("Can't set worldserver process priority class, error: %s", strerror(errno));
LOG_ERROR("server", "Can't set worldserver process priority class, error: %s", strerror(errno));
else
sLog->outString("worldserver process priority class set to %i", getpriority(PRIO_PROCESS, 0));
LOG_INFO("server", "worldserver process priority class set to %i", getpriority(PRIO_PROCESS, 0));
}
#endif
@@ -285,7 +281,7 @@ int Master::Run()
std::string bindIp = sConfigMgr->GetOption<std::string>("BindIP", "0.0.0.0");
if (sWorldSocketMgr->StartNetwork(worldPort, bindIp.c_str()) == -1)
{
sLog->outError("Failed to start network");
LOG_ERROR("server", "Failed to start network");
World::StopNow(ERROR_EXIT_CODE);
// go down and shutdown the server
}
@@ -293,7 +289,7 @@ int Master::Run()
// set server online (allow connecting now)
LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag & ~%u, population = 0 WHERE id = '%u'", REALM_FLAG_INVALID, realmID);
sLog->outString("%s (worldserver-daemon) ready...", GitRevision::GetFullVersion());
LOG_INFO("server", "%s (worldserver-daemon) ready...", GitRevision::GetFullVersion());
// when the main thread closes the singletons get unloaded
// since worldrunnable uses them, it will crash if unloaded after master
@@ -322,7 +318,7 @@ int Master::Run()
_StopDB();
sLog->outString("Halting process...");
LOG_INFO("server", "Halting process...");
if (cliThread)
{
@@ -388,8 +384,6 @@ bool Master::_StartDB()
{
MySQL::Library_Init();
sLog->SetLogDB(false);
// Load databases
DatabaseLoader loader;
loader
@@ -404,7 +398,7 @@ bool Master::_StartDB()
realmID = sConfigMgr->GetOption<int32>("RealmID", 0);
if (!realmID)
{
sLog->outError("Realm ID not defined in configuration file");
LOG_ERROR("server", "Realm ID not defined in configuration file");
return false;
}
else if (realmID > 255)
@@ -414,13 +408,11 @@ bool Master::_StartDB()
* with a size of uint8 we can "only" store up to 255 realms
* anything further the client will behave anormaly
*/
sLog->outError("Realm ID must range from 1 to 255");
LOG_ERROR("server", "Realm ID must range from 1 to 255");
return false;
}
sLog->outString("Realm running as realm ID %d", realmID);
///- Initialize the DB logging system
sLog->SetRealmID(realmID);
LOG_INFO("server", "Realm running as realm ID %d", realmID);
///- Clean the database before starting
ClearOnlineAccounts();
@@ -430,7 +422,7 @@ bool Master::_StartDB()
sWorld->LoadDBVersion();
sLog->outString("Using World DB: %s", sWorld->GetDBVersion());
LOG_INFO("server", "Using World DB: %s", sWorld->GetDBVersion());
return true;
}

View File

@@ -54,11 +54,11 @@ void RARunnable::run()
if (acceptor.open(listenAddress, m_Reactor) == -1)
{
sLog->outError("Trinity RA can not bind to port %d on %s (possible error: port already in use)", raPort, stringIp.c_str());
LOG_ERROR("server", "Trinity RA can not bind to port %d on %s (possible error: port already in use)", raPort, stringIp.c_str());
return;
}
sLog->outString("Starting Trinity RA on port %d on %s", raPort, stringIp.c_str());
LOG_INFO("server", "Starting Trinity RA on port %d on %s", raPort, stringIp.c_str());
while (!World::IsStopped())
{
@@ -68,6 +68,6 @@ void RARunnable::run()
}
#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS)
sLog->outStaticDebug("Trinity RA thread exiting");
LOG_DEBUG("server", "Trinity RA thread exiting");
#endif
}

View File

@@ -33,18 +33,18 @@ int RASocket::open(void*)
if (peer().get_remote_addr(remoteAddress) == -1)
{
sLog->outError("RASocket::open: peer().get_remote_addr error is %s", ACE_OS::strerror(errno));
LOG_ERROR("server", "RASocket::open: peer().get_remote_addr error is %s", ACE_OS::strerror(errno));
return -1;
}
sLog->outRemote("Incoming connection from %s", remoteAddress.get_host_addr());
LOG_INFO("network", "Incoming connection from %s", remoteAddress.get_host_addr());
return activate();
}
int RASocket::handle_close(ACE_HANDLE /*handle*/, ACE_Reactor_Mask /*mask*/)
{
sLog->outRemote("Closing connection");
LOG_INFO("network", "Closing connection");
peer().close_reader();
wait();
// While the above wait() will wait for the ::svc() to finish, it will not wait for the async event
@@ -120,7 +120,7 @@ int RASocket::recv_line(std::string& out_line)
if (recv_line(message_block) == -1)
{
sLog->outRemote("Recv error %s", ACE_OS::strerror(errno));
LOG_INFO("network", "Recv error %s", ACE_OS::strerror(errno));
return -1;
}
@@ -134,7 +134,7 @@ int RASocket::process_command(const std::string& command)
if (command.length() == 0)
return 0;
sLog->outRemote("Got command: %s", command.c_str());
LOG_INFO("network", "Got command: %s", command.c_str());
// handle quit, exit and logout commands to terminate connection
if (command == "quit" || command == "exit" || command == "logout")
@@ -184,7 +184,7 @@ int RASocket::check_access_level(const std::string& user)
if (!result)
{
sLog->outRemote("User %s does not exist in database", user.c_str());
LOG_INFO("network", "User %s does not exist in database", user.c_str());
return -1;
}
@@ -192,12 +192,12 @@ int RASocket::check_access_level(const std::string& user)
if (fields[1].GetUInt8() < _minLevel)
{
sLog->outRemote("User %s has no privilege to login", user.c_str());
LOG_INFO("network", "User %s has no privilege to login", user.c_str());
return -1;
}
else if (fields[2].GetInt32() != -1)
{
sLog->outRemote("User %s has to be assigned on all realms (with RealmID = '-1')", user.c_str());
LOG_INFO("network", "User %s has to be assigned on all realms (with RealmID = '-1')", user.c_str());
return -1;
}
@@ -225,7 +225,7 @@ int RASocket::check_password(const std::string& user, const std::string& pass)
return 0;
}
sLog->outRemote("Wrong password for user: %s", user.c_str());
LOG_INFO("commands.ra", "Wrong password for user: %s", user.c_str());
return -1;
}
@@ -245,7 +245,7 @@ int RASocket::authenticate()
if (recv_line(pass) == -1)
return -1;
sLog->outRemote("Login attempt for user: %s", user.c_str());
LOG_INFO("network", "Login attempt for user: %s", user.c_str());
if (check_access_level(user) == -1)
return -1;
@@ -253,7 +253,7 @@ int RASocket::authenticate()
if (check_password(user, pass) == -1)
return -1;
sLog->outRemote("User login: %s", user.c_str());
LOG_INFO("network", "User login: %s", user.c_str());
return 0;
}
@@ -286,7 +286,7 @@ int RASocket::subnegotiate()
if (n >= 1024)
{
sLog->outRemote("RASocket::subnegotiate: allocated buffer 1024 bytes was too small for negotiation packet, size: %u", uint32(n));
LOG_INFO("network", "RASocket::subnegotiate: allocated buffer 1024 bytes was too small for negotiation packet, size: %u", uint32(n));
return -1;
}
@@ -320,7 +320,7 @@ int RASocket::subnegotiate()
uint8 param = buf[++i];
ss << uint32(param);
sLog->outRemote(ss.str().c_str());
LOG_INFO("network", ss.str().c_str());
}
++i;
}
@@ -386,7 +386,7 @@ void RASocket::zprint(void* callbackArg, const char* szText)
ACE_Time_Value tv = ACE_Time_Value::zero;
if (socket->putq(mb, &tv) == -1)
{
sLog->outRemote("Failed to enqueue message, queue is full or closed. Error is %s", ACE_OS::strerror(errno));
LOG_INFO("network", "Failed to enqueue message, queue is full or closed. Error is %s", ACE_OS::strerror(errno));
mb->release();
}
}
@@ -407,7 +407,7 @@ void RASocket::commandFinished(void* callbackArg, bool /*success*/)
if (socket->putq(mb->duplicate()) == -1)
{
// getting here is bad, command can't be marked as complete
//sLog->outDebug(LOG_FILTER_REMOTECOMMAND, "Failed to enqueue command end message. Error is %s", ACE_OS::strerror(errno));
//LOG_DEBUG("misc", "Failed to enqueue command end message. Error is %s", ACE_OS::strerror(errno));
}
mb->release();

View File

@@ -64,8 +64,6 @@ void WorldRunnable::run()
#endif
}
sLog->SetLogDB(false);
sScriptMgr->OnShutdown();
sWorld->KickAll(); // save and kick all players
@@ -87,7 +85,7 @@ void WorldRunnable::run()
void AuctionListingRunnable::run()
{
sLog->outString("Starting up Auction House Listing thread...");
LOG_INFO("server", "Starting up Auction House Listing thread...");
while (!World::IsStopped())
{
if (AsyncAuctionListingMgr::IsAuctionListingAllowed())
@@ -125,5 +123,5 @@ void AuctionListingRunnable::run()
}
acore::Thread::Sleep(1);
}
sLog->outString("Auction House Listing thread exiting without problems.");
LOG_INFO("server", "Auction House Listing thread exiting without problems.");
}

View File

@@ -449,246 +449,6 @@ SetAllCreaturesWithWaypointMovementActive = 0
PidFile = ""
#
# LogLevel
# Description: Server console level of logging
# Default: 1 - (Basic)
# 0 - (Minimum)
# 2 - (Detail)
# 3 - (Full/Debug)
LogLevel = 1
#
# LogFile
# Description: Log file for main server log.
# Default: "Server.log" - (Enabled)
# "" - (Disabled)
LogFile = "Server.log"
#
# LogTimestamp
# Description: Append timestamp to the server log file name.
# Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
# Default: 0 - (Disabled)
# 1 - (Enabled)
LogTimestamp = 0
#
# LogFileLevel
# Description: Server file level of logging
# Default: 0 - (Minimum)
# 1 - (Basic)
# 2 - (Detail)
# 3 - (Full/Debug)
LogFileLevel = 0
#
# Debug Log Mask
# Description: Bitmask that determines which debug log output (level 3)
# will be logged.
# Possible flags:
# 1 - Anything related to units that doesn't fit in other
# categories.
# 2 - Anything related to pets.
# 4 - Anything related to vehicles.
# 8 - Anything related to C++ AI, instance scripts, etc.
# 16 - Anything related to DB AI, such as SAI, EAI, CreatureAI
# 32 - Anything related to DB map scripts
# 64 - Anything related to network input/output,
# such as packet handlers and netcode logs
# 128 - Anything related to the spellsystem and aurasystem
# 256 - Anything related to the achievement system
# 512 - Anything related to the condition system
# 1024 - Anything related to the pool system
# 2048 - Anything related to the auction house
# 4096 - Anything related to arena's and battlegrounds
# 8192 - Anything related to outdoor PVP
# 16384 - Anything related to the chat system
# 32768 - Anything related to the LFG system
# 65536 - Anything related to maps, instances (not scripts),
# grids, cells, visibility, etc.
# 131072 - Anything related to player loading from DB
# (Player::_LoadXXX functions)
# 262144 - Anything related to items
# 524288 - Anything related to player skills
# (do not confuse with spells)
# 1048576 - Anything related to loot
# 2097152 - Anything related to guilds
# 4194304 - Anything related to transports
# 8388608 - Anything related to Warden anti cheat
# 67108864 - Whenever KickPlayer() or CloseSocket() are called
#
# Simply add the values together to create a bitmask.
# For more info see enum DebugLogFilters in Log.h
#
# Default: 0 (nothing)
DebugLogMask = 0
#
# PacketLogFile
# Description: Binary packet logging file for the world server.
# Filename extension must be .bin to be parsable with WowPacketParser.
# Example: "World.bin" - (Enabled)
# Default: "" - (Disabled)
PacketLogFile = ""
#
# DBErrorLogFile
# Description: Log file for database errors.
# Default: "DBErrors.log" - (Enabled)
# "" - (Disabled)
DBErrorLogFile = "DBErrors.log"
#
# CharLogFile
# Description: Log file for character operations
# Default: "Char.log" - (Enabled)
# "" - (Disabled)
CharLogFile = "Char.log"
#
# CharLogTimestamp
# Description: Append timestamp to the character log file name.
# Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
# Default: 0 - (Disabled)
# 1 - (Enabled)
CharLogTimestamp = 0
#
# CharLogDump
# Description: Write a character dump in the CharLogFile before deleting it.
# For restoration, copy character data from log file starting from
# line == START DUMP == to line == END DUMP == (exclusive)
# and load it using the "pdump load" command.
# Default: 0 - (Disabled)
# 1 - (Enabled)
CharLogDump = 0
#
# CharLogDump.Separate
# Description: Write character dump to separate files files rather than adding it to the
# CharLogFile.
# Default: 0 - (Disabled)
# 1 - (Enabled)
CharLogDump.Separate = 0
#
# CharLogDump.SeparateDir
# Description: Write dump files into the sub folder within the log folder.
# Example: "chardumps" - (Enabled)
# Default: "" - (Disabled)
CharLogDump.SeparateDir = ""
#
# GmLogFile
# Description: Log file for gamemaster commands.
# Default: "GM.log" - (Enabled)
# "" - (Disabled)
GmLogFile = "GM.log"
#
# GmLogTimestamp
# Description: Append timestamp to the gamemaster log file name.
# Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
# Default: 0 - (Disabled)
# 1 - (Enabled)
GmLogTimestamp = 0
#
# GmLogPerAccount
# Description: Create a log file per gamemaster account.
# Important: Logs not created if GmLogFile is not set.
# Default: 0 - (Disabled)
# 1 - (Enabled)
GmLogPerAccount = 0
#
# RaLogFile
# Description: Log file for Remote Access commands.
# Default: "RA.log" - (Enabled)
# "" - (Disabled)
RaLogFile = "RA.log"
#
# ArenaLogFile
# Description: Log file for arena fights and arena team creations.
# Example: "Arena.log" - (Enabled)
# Default: "" - (Disabled)
ArenaLogFile = ""
#
# ArenaLog.ExtendedInfo
# Description: Include extended info to ArenaLogFile for each player after rated arena
# matches (guid, name, team, IP, healing/damage done, killing blows).
# Default: 0 - (Disabled)
# 1 - (Enabled)
ArenaLog.ExtendedInfo = 0
#
# SQLDeveloperLogFile
# Description: Log file for core-generated SQL queries/dumps
# Example: "SQLDev.log" - (Enabled)
# Default: "" - (Disabled)
SQLDeveloperLogFile = ""
#
# SQLDriverLogFile
# Description: Log file for SQL driver events.
# Example: "WorldSQLDriver.log" - (Enabled)
# Default: "" - (Disabled)
SQLDriverLogFile = ""
#
# SQLDriverQueryLogging
# Description: Log SQL queries to the SQLDriverLogFile and console.
# Default: 0 - (Disabled, Query errors only)
# 1 - (Enabled, Full query logging - may have performance impact)
SQLDriverQueryLogging = 0
#
# LogColors
# Description: Colors for log messages (Format: "normal basic detail debug").
# Colors: 0 - Black
# 1 - Red
# 2 - Green
# 3 - Brown
# 4 - Blue
# 5 - Magenta
# 6 - Cyan
# 7 - Grey
# 8 - Yellow
# 9 - Lred
# 10 - Lgreen
# 11 - Lblue
# 12 - Lmagenta
# 13 - Lcyan
# 14 - White
# Example: "13 11 9 5" - (Enabled)
# Default: "" - (Disabled)
LogColors = ""
#
# EnableLogDB
# Description: Write log messages to database (LogDatabaseInfo).
@@ -696,146 +456,6 @@ LogColors = ""
# 1 - (Enabled)
EnableLogDB = 0
#
# DBLogLevel
# Description: Log level of databases logging.
# Default: 2 - (Detail)
# 0 - (Minimum)
# 1 - (Basic)
# 3 - (Full/Debug)
DBLogLevel = 2
#
# LogDB.Char
# Description: Log character operations to database.
# Default: 0 - (Disabled)
# 1 - (Enabled)
LogDB.Char = 0
#
# LogDB.GM
# Description: Log gamemaster commands to database.
# Default: 0 - (Disabled)
# 1 - (Enabled)
LogDB.GM = 0
#
# LogDB.RA
# Description: Log remote access events to database.
# Default: 0 - (Disabled)
# 1 - (Enabled)
LogDB.RA = 0
#
# LogDB.World
# Description: Log world server packets to database.
# Default: 0 - (Disabled)
# 1 - (Enabled, May have performance impact)
LogDB.World = 0
#
# LogDB.Chat
# Description: Log chat messages to database.
# Default: 0 - (Disabled)
# 1 - (Enabled)
LogDB.Chat = 0
# ChatLogFile
# Description: Log file for chat logs.
# Default: "Chat.log" - (Enabled)
# "" - (Disabled)
ChatLogFile = "Chat.log"
# ChatLogTimestamp
# Description: Append timestamp to the chat log file name.
# Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
# Default: 0 - (Disabled)
# 1 - (Enabled)
ChatLogTimestamp = 0
#
# ChatLogs.Channel
# Description: Log custom channel chat.
# Default: 0 - (Disabled)
# 1 - (Enabled)
ChatLogs.Channel = 0
#
# ChatLogs.Whisper
# Description: Log whispers between players.
# Default: 0 - (Disabled)
# 1 - (Enabled)
ChatLogs.Whisper = 0
#
# ChatLogs.SysChan
# Description: Log system channel messages.
# Default: 0 - (Disabled)
# 1 - (Enabled)
ChatLogs.SysChan = 0
#
# ChatLogs.Party
# Description: Log party chat.
# Default: 0 - (Disabled)
# 1 - (Enabled)
ChatLogs.Party = 0
#
# ChatLogs.Raid
# Description: Log raid chat.
# Default: 0 - (Disabled)
# 1 - (Enabled)
ChatLogs.Raid = 0
#
# ChatLogs.Guild
# Description: Log guild chat.
# Default: 0 - (Disabled)
# 1 - (Enabled)
ChatLogs.Guild = 0
#
# ChatLogs.Public
# Description: Log public chat (say/yell/emote).
# Default: 0 - (Disabled)
# 1 - (Enabled)
ChatLogs.Public = 0
#
# WARNING: enabling this might cause issues to your addon channel
# ChatLogs.Addon
# Description: Log addon messages.
# Default: 0 - (Disabled)
# 1 - (Enabled)
ChatLogs.Addon = 0
#
# ChatLogs.BattleGround
# Description: Log battleground chat.
# Default: 0 - (Disabled)
# 1 - (Enabled)
ChatLogs.BattleGround = 0
#
###################################################################################################
###################################################################################################
@@ -1618,15 +1238,6 @@ Warden.NumLuaChecks = 1
Warden.NumOtherChecks = 7
#
# Warden.LogFile
# Description: Client check fails will be logged here.
# Default: "" - (Disabled)
# "Warden.log" - (Enabled)
#
Warden.LogFile = ""
#
# Warden.ClientResponseDelay
# Description: Time (in seconds) before client is getting disconnecting for not responding.
@@ -3706,6 +3317,168 @@ FFAPvPTimer = 30
#
###################################################################################################
###################################################################################################
# LOGGING SYSTEM SETTINGS
#
# Appender config values: Given an appender "name"
# Appender.name
# Description: Defines 'where to log'.
# Format: Type,LogLevel,Flags,optional1,optional2,optional3
#
# Type
# 0 - (None)
# 1 - (Console)
# 2 - (File)
# 3 - (DB)
#
# LogLevel
# 0 - (Disabled)
# 1 - (Fatal)
# 2 - (Error)
# 3 - (Warning)
# 4 - (Info)
# 5 - (Debug)
# 6 - (Trace)
#
# Flags:
# 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)
#
# Colors (read as optional1 if Type = Console)
# Format: "fatal error warn info debug trace"
# 0 - BLACK
# 1 - RED
# 2 - GREEN
# 3 - BROWN
# 4 - BLUE
# 5 - MAGENTA
# 6 - CYAN
# 7 - GREY
# 8 - YELLOW
# 9 - LRED
# 10 - LGREEN
# 11 - LBLUE
# 12 - LMAGENTA
# 13 - LCYAN
# 14 - WHITE
# Example: "1 9 3 6 5 8"
#
# File: Name of the file (read as optional1 if Type = File)
# Allows to use one "%s" to create dynamic files
#
# Mode: Mode to open the file (read as optional2 if Type = File)
# a - (Append)
# w - (Overwrite)
#
# MaxFileSize: Maximum file size of the log file before creating a new log file
# (read as optional3 if Type = File)
# Size is measured in bytes expressed in a 64-bit unsigned integer.
# Maximum value is 4294967295 (4 GB). Leave blank for no limit.
# NOTE: Does not work with dynamic filenames.
# Example: 536870912 (512 MB)
#
Appender.Console=1,4,0,"1 9 3 6 5 8"
Appender.Server=2,5,0,Server.log,w
Appender.GM=2,5,15,gm_%s.log
Appender.DBErrors=2,5,0,DBErrors.log
# Logger config values: Given a logger "name"
# Logger.name
# Description: Defines 'What to log'
# Format: LogLevel,AppenderList
#
# LogLevel
# 0 - (Disabled)
# 1 - (Fatal)
# 2 - (Error)
# 3 - (Warning)
# 4 - (Info)
# 5 - (Debug)
# 6 - (Trace)
#
# AppenderList: List of appenders linked to logger
# (Using spaces as separator).
#
Logger.root=2,Console Server
Logger.server=4,Console Server
Logger.commands.gm=4,Console GM
Logger.scripts.hotswap=4,Console Server
Logger.sql.sql=2,Console DBErrors
Logger.sql.updates=4,Console Server
Logger.mmaps=4,Server
#Logger.achievement=4,Console Server
#Logger.addon=4,Console Server
#Logger.ahbot=4,Console Server
#Logger.auctionHouse=4,Console Server
#Logger.bg.arena=4,Console Server
#Logger.bg.battlefield=4,Console Server
#Logger.bg.battleground=4,Console Server
#Logger.bg.reportpvpafk=4,Console Server
#Logger.chat.log=4,Console Server
#Logger.calendar=4,Console Server
#Logger.chat.system=4,Console Server
#Logger.cheat=4,Console Server
#Logger.commands.ra=4,Console Server
#Logger.condition=4,Console Server
#Logger.entities.faction=4,Console Server
#Logger.entities.gameobject=4,Console Server
#Logger.entities.pet=4,Console Server
#Logger.entities.player=4,Console Server
#Logger.entities.player.character=4,Console Server
#Logger.entities.player.dump=4,Console Server
#Logger.entities.player.items=4,Console Server
#Logger.entities.player.loading=4,Console Server
#Logger.entities.player.skills=4,Console Server
#Logger.entities.transport=4,Console Server
#Logger.entities.unit=4,Console Server
#Logger.entities.unit.ai=4,Console Server
#Logger.entities.vehicle=4,Console Server
#Logger.gameevent=4,Console Server
#Logger.guild=4,Console Server
#Logger.lfg=4,Console Server
#Logger.loot=4,Console Server
#Logger.maps.script=4,Console Server
#Logger.maps=4,Console Server
#Logger.misc=4,Console Server
#Logger.mmaps.tiles=4,Console Server
#Logger.movement.flightpath=4,Console Server
#Logger.movement.motionmaster=4,Console Server
#Logger.movement.splinechain=4,Console Server
#Logger.network=4,Console Server
#Logger.network.kick=4,Console Server
#Logger.network.opcode=4,Console Server
#Logger.network.soap=4,Console Server
#Logger.outdoorpvp=4,Console Server
#Logger.pool=4,Console Server
#Logger.rbac=4,Console Server
#Logger.scripts=4,Console Server
#Logger.scripts.ai=4,Console Server
#Logger.scripts.ai.escortai=4,Console Server
#Logger.scripts.ai.followerai=4,Console Server
#Logger.scripts.ai.petai=4,Console Server
#Logger.scripts.ai.sai=4,Console Server
#Logger.scripts.cos=4,Console Server
#Logger.server.authserver=4,Console Server
#Logger.spells=4,Console Server
#Logger.spells.aura.effect=4,Console Server
#Logger.spells.aura.effect.nospell=4,Console Server
#Logger.spells.effect=4,Console Server
#Logger.spells.effect.nospell=4,Console Server
#Logger.sql.dev=4,Console Server
#Logger.sql.driver=4,Console Server
#Logger.warden=4,Console Server
#Logger.vehicles=4,Console Server
###################################################################################################
###################################################################################################
# PACKET SPOOF PROTECTION SETTINGS
#