From 55923469796d720ea7f583269750808e5202db96 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Mon, 23 Jun 2014 00:07:12 -0400 Subject: [PATCH 1/9] added server log filtering added log filtering based on configuration file setting 0 = log everything 1 = log nothing 2 = chat logging only --- servatrice/src/server_logger.cpp | 40 ++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index 3eac4f36..bfd979fd 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #ifdef Q_OS_UNIX # include @@ -44,13 +45,44 @@ void ServerLogger::logMessage(QString message, void *caller) if (!logFile) return; - bufferMutex.lock(); QString callerString; if (caller) callerString = QString::number((qulonglong) caller, 16) + " "; - buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); - bufferMutex.unlock(); - + + //filter out all log entries based on loglevel value in configuration file + QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); + int found = 0; int capture = 0; int loglevel = 0; + loglevel = settings->value("server/loglevel").toInt(); + switch (loglevel) + { + case 1: + break; + + case 2: + + // filter message log data + found = message.indexOf("Adding room: ID=", Qt::CaseInsensitive); if (found != -1){ capture = 1; } + found = message.indexOf("Starting status update clock", Qt::CaseInsensitive); if (found != -1){ capture = 1; } + found = message.indexOf("Starting server on port", Qt::CaseInsensitive); if (found != -1){ capture = 1; } + found = message.indexOf("Server listening.", Qt::CaseInsensitive); if (found != -1){ capture = 1; } + found = message.indexOf("Server::loginUser:", Qt::CaseInsensitive); if (found != -1){ capture = 1; } + found = message.indexOf("Server::removeClient:", Qt::CaseInsensitive); if (found != -1){ capture = 1; } + found = message.indexOf("Command_Login.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } + found = message.indexOf("Command_RoomSay.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } + found = message.indexOf("Command_Message.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } + found = message.indexOf("Command_GameSay.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } + if (capture != 0){ + bufferMutex.lock(); + buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); + bufferMutex.unlock(); + } + break; + + default: + bufferMutex.lock(); + buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); + bufferMutex.unlock(); + } emit sigFlushBuffer(); } From 236e0a419730b77954c063bc54fc01fe77ae0ef7 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Mon, 23 Jun 2014 00:09:21 -0400 Subject: [PATCH 2/9] added loglevel variable added log filtering variable --- servatrice/servatrice.ini.example | 1 + 1 file changed, 1 insertion(+) diff --git a/servatrice/servatrice.ini.example b/servatrice/servatrice.ini.example index bce91360..5c5e2488 100644 --- a/servatrice/servatrice.ini.example +++ b/servatrice/servatrice.ini.example @@ -5,6 +5,7 @@ logfile=server.log name="My Cockatrice server" id=1 number_pools=1 +loglevel=0 [servernetwork] active=0 From 46ceeadbbd142f5e8c1373dce38a071a4714731c Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Mon, 23 Jun 2014 03:41:46 -0400 Subject: [PATCH 3/9] updated code structure cleaned code structure up for clarity --- servatrice/src/server_logger.cpp | 48 +++++++++++++++++++------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index bfd979fd..07648035 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -5,11 +5,13 @@ #include #include #include +#include #ifdef Q_OS_UNIX # include # include # include #endif +using namespace std; ServerLogger::ServerLogger(bool _logToConsole, QObject *parent) : QObject(parent), logToConsole(_logToConsole), flushRunning(false) @@ -51,37 +53,45 @@ void ServerLogger::logMessage(QString message, void *caller) //filter out all log entries based on loglevel value in configuration file QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); - int found = 0; int capture = 0; int loglevel = 0; + int found = 0; int capture = 0; int loglevel = 0; list lst_str; loglevel = settings->value("server/loglevel").toInt(); + + switch (loglevel) { case 1: + capture = 0; break; case 2: - // filter message log data - found = message.indexOf("Adding room: ID=", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Starting status update clock", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Starting server on port", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Server listening.", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Server::loginUser:", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Server::removeClient:", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Command_Login.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Command_RoomSay.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Command_Message.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Command_GameSay.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - if (capture != 0){ - bufferMutex.lock(); - buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); - bufferMutex.unlock(); + lst_str.push_back("Adding room: ID="); + lst_str.push_back("Starting status update clock"); + lst_str.push_back("Starting server on port"); + lst_str.push_back("Server listening."); + lst_str.push_back("Server::loginUser:"); + lst_str.push_back("Server::removeClient:"); + lst_str.push_back("Command_Login.ext"); + lst_str.push_back("Command_RoomSay.ext"); + lst_str.push_back("Command_Message.ext"); + lst_str.push_back("Command_GameSay.ext"); + for (list::iterator i = lst_str.begin(); i != lst_str.end(); i++) + { + if(message.indexOf((*i).c_str(), Qt::CaseInsensitive) != -1) { + capture = 1; + break; + } } break; default: - bufferMutex.lock(); - buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); - bufferMutex.unlock(); + capture = 1; + } + + if (capture != 0){ + bufferMutex.lock(); + buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); + bufferMutex.unlock(); } emit sigFlushBuffer(); } From ec00bdebed8e7ef839f147dcce2ffc75202b6535 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Mon, 23 Jun 2014 09:18:49 -0400 Subject: [PATCH 4/9] verbose incrementation removed un-used variables changed switch case to increase verbose level as loglevel increases captured unset loglevel to default to highest verbose log level --- servatrice/src/server_logger.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index 07648035..a5c33bc8 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -53,9 +53,10 @@ void ServerLogger::logMessage(QString message, void *caller) //filter out all log entries based on loglevel value in configuration file QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); - int found = 0; int capture = 0; int loglevel = 0; list lst_str; - loglevel = settings->value("server/loglevel").toInt(); - + int capture = 0; list lst_str; + int loglevel = settings->value("server/loglevel").toInt(); + if (!loglevel) + loglevel = 999; switch (loglevel) { From 91a96643f03395242acf2bf3ab30d40aa832c967 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Thu, 26 Jun 2014 00:38:43 -0400 Subject: [PATCH 5/9] updated filtering code rewrote filtering code to allow for user input code only filters on single string at the moment (still needs updated). --- servatrice/src/server_logger.cpp | 55 +++++++++----------------------- 1 file changed, 15 insertions(+), 40 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index a5c33bc8..1fff3f8b 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -5,13 +5,11 @@ #include #include #include -#include #ifdef Q_OS_UNIX # include # include # include #endif -using namespace std; ServerLogger::ServerLogger(bool _logToConsole, QObject *parent) : QObject(parent), logToConsole(_logToConsole), flushRunning(false) @@ -53,48 +51,25 @@ void ServerLogger::logMessage(QString message, void *caller) //filter out all log entries based on loglevel value in configuration file QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); - int capture = 0; list lst_str; - int loglevel = settings->value("server/loglevel").toInt(); - if (!loglevel) - loglevel = 999; + bool shouldWeWriteLog = settings->value("server/writelog").toBool(); + //allowedLogStatements << "Adding room: ID=" << "Starting status update clock" << "Starting server on port" << + // "Server listening." << "Server::loginUser:" << "Server::removeClient:" << "Command_Login.ext" << + // "Command_RoomSay.ext" << "Command_Message.ext" << "Command_GameSay.ext"; - switch (loglevel) - { - case 1: - capture = 0; - break; + if (shouldWeWriteLog){ + QString logFilters = settings->value("server/logfilters").toString(); + bool shouldWeSkipLine = false; + if (!logFilters.trimmed().isEmpty()) + shouldWeSkipLine = !message.contains(logFilters); + + if (shouldWeSkipLine) + return; - case 2: - // filter message log data - lst_str.push_back("Adding room: ID="); - lst_str.push_back("Starting status update clock"); - lst_str.push_back("Starting server on port"); - lst_str.push_back("Server listening."); - lst_str.push_back("Server::loginUser:"); - lst_str.push_back("Server::removeClient:"); - lst_str.push_back("Command_Login.ext"); - lst_str.push_back("Command_RoomSay.ext"); - lst_str.push_back("Command_Message.ext"); - lst_str.push_back("Command_GameSay.ext"); - for (list::iterator i = lst_str.begin(); i != lst_str.end(); i++) - { - if(message.indexOf((*i).c_str(), Qt::CaseInsensitive) != -1) { - capture = 1; - break; - } - } - break; - - default: - capture = 1; - } - - if (capture != 0){ bufferMutex.lock(); - buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); - bufferMutex.unlock(); + buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); + bufferMutex.unlock(); + emit sigFlushBuffer(); } - emit sigFlushBuffer(); } void ServerLogger::flushBuffer() From 977cf7340ab50d471e47a7d1d11bcfa004938b1f Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Thu, 26 Jun 2014 00:40:21 -0400 Subject: [PATCH 6/9] settings update/addition updated settings name (loglevel) to a more descriptive name (writelog) added logfilters setting to allow user defined filters. --- servatrice/servatrice.ini.example | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/servatrice/servatrice.ini.example b/servatrice/servatrice.ini.example index 5c5e2488..c50ff9f1 100644 --- a/servatrice/servatrice.ini.example +++ b/servatrice/servatrice.ini.example @@ -5,7 +5,8 @@ logfile=server.log name="My Cockatrice server" id=1 number_pools=1 -loglevel=0 +writelog=1 +logfilters="" [servernetwork] active=0 From 365de1fdd059ad93688953dfe2ece88d66ff9d5b Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Thu, 26 Jun 2014 14:38:57 -0400 Subject: [PATCH 7/9] added multiple filter capabilities changed the single qstring log filtering to qstringlist to allow multiple filtering capabilities --- servatrice/src/server_logger.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index 1fff3f8b..0264c2fd 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -49,19 +49,25 @@ void ServerLogger::logMessage(QString message, void *caller) if (caller) callerString = QString::number((qulonglong) caller, 16) + " "; - //filter out all log entries based on loglevel value in configuration file + //filter out all log entries based on values in configuration file QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); bool shouldWeWriteLog = settings->value("server/writelog").toBool(); - //allowedLogStatements << "Adding room: ID=" << "Starting status update clock" << "Starting server on port" << - // "Server listening." << "Server::loginUser:" << "Server::removeClient:" << "Command_Login.ext" << - // "Command_RoomSay.ext" << "Command_Message.ext" << "Command_GameSay.ext"; if (shouldWeWriteLog){ QString logFilters = settings->value("server/logfilters").toString(); + QStringList listlogFilters = logFilters.split(",", QString::SkipEmptyParts); bool shouldWeSkipLine = false; - if (!logFilters.trimmed().isEmpty()) - shouldWeSkipLine = !message.contains(logFilters); - + if (!logFilters.trimmed().isEmpty()){ + shouldWeSkipLine = true; + foreach(QString logFilter, listlogFilters){ + if (message.contains(logFilter, Qt::CaseInsensitive)){ + shouldWeSkipLine = false; + break; + } + } + } + + if (shouldWeSkipLine) return; From b83fe95b058d9b898881ce1f3a7940b6bf52b6bd Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Thu, 26 Jun 2014 14:46:22 -0400 Subject: [PATCH 8/9] removed extra un-needed empty line. removed extra un-needed empty line. --- servatrice/src/server_logger.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index 0264c2fd..9566ba17 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -67,7 +67,6 @@ void ServerLogger::logMessage(QString message, void *caller) } } - if (shouldWeSkipLine) return; From f685bd2abe58013b03da0a87a3b6b5fd2dc2847b Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Fri, 27 Jun 2014 18:18:03 -0400 Subject: [PATCH 9/9] formatting 4 space indent + code flow rewrite for easier readability. --- servatrice/src/server_logger.cpp | 165 ++++++++++++++++--------------- 1 file changed, 83 insertions(+), 82 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index 9566ba17..2dbbc5e5 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -12,121 +12,122 @@ #endif ServerLogger::ServerLogger(bool _logToConsole, QObject *parent) - : QObject(parent), logToConsole(_logToConsole), flushRunning(false) + : QObject(parent), logToConsole(_logToConsole), flushRunning(false) { } ServerLogger::~ServerLogger() { - flushBuffer(); - // This does not work with the destroyed() signal as this destructor is called after the main event loop is done. - thread()->quit(); + flushBuffer(); + // This does not work with the destroyed() signal as this destructor is called after the main event loop is done. + thread()->quit(); } void ServerLogger::startLog(const QString &logFileName) { - if (!logFileName.isEmpty()) { - logFile = new QFile("server.log", this); - logFile->open(QIODevice::Append); + if (!logFileName.isEmpty()) { + logFile = new QFile("server.log", this); + logFile->open(QIODevice::Append); #ifdef Q_OS_UNIX - ::socketpair(AF_UNIX, SOCK_STREAM, 0, sigHupFD); + ::socketpair(AF_UNIX, SOCK_STREAM, 0, sigHupFD); - snHup = new QSocketNotifier(sigHupFD[1], QSocketNotifier::Read, this); - connect(snHup, SIGNAL(activated(int)), this, SLOT(handleSigHup())); + snHup = new QSocketNotifier(sigHupFD[1], QSocketNotifier::Read, this); + connect(snHup, SIGNAL(activated(int)), this, SLOT(handleSigHup())); #endif - } else - logFile = 0; - - connect(this, SIGNAL(sigFlushBuffer()), this, SLOT(flushBuffer()), Qt::QueuedConnection); + } else + logFile = 0; + + connect(this, SIGNAL(sigFlushBuffer()), this, SLOT(flushBuffer()), Qt::QueuedConnection); } void ServerLogger::logMessage(QString message, void *caller) { - if (!logFile) - return; - - QString callerString; - if (caller) - callerString = QString::number((qulonglong) caller, 16) + " "; - - //filter out all log entries based on values in configuration file - QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); - bool shouldWeWriteLog = settings->value("server/writelog").toBool(); - - if (shouldWeWriteLog){ - QString logFilters = settings->value("server/logfilters").toString(); - QStringList listlogFilters = logFilters.split(",", QString::SkipEmptyParts); - bool shouldWeSkipLine = false; - if (!logFilters.trimmed().isEmpty()){ - shouldWeSkipLine = true; - foreach(QString logFilter, listlogFilters){ - if (message.contains(logFilter, Qt::CaseInsensitive)){ - shouldWeSkipLine = false; - break; - } - } - } + if (!logFile) + return; + + QString callerString; + if (caller) + callerString = QString::number((qulonglong) caller, 16) + " "; + + //filter out all log entries based on values in configuration file + QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); + bool shouldWeWriteLog = settings->value("server/writelog").toBool(); + QString logFilters = settings->value("server/logfilters").toString(); + QStringList listlogFilters = logFilters.split(",", QString::SkipEmptyParts); + bool shouldWeSkipLine = false; + + if (!shouldWeWriteLog) + return; - if (shouldWeSkipLine) - return; + if (!logFilters.trimmed().isEmpty()){ + shouldWeSkipLine = true; + foreach(QString logFilter, listlogFilters){ + if (message.contains(logFilter, Qt::CaseInsensitive)){ + shouldWeSkipLine = false; + break; + } + } + } - bufferMutex.lock(); - buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); - bufferMutex.unlock(); - emit sigFlushBuffer(); - } + if (shouldWeSkipLine) + return; + + bufferMutex.lock(); + buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); + bufferMutex.unlock(); + emit sigFlushBuffer(); } void ServerLogger::flushBuffer() { - if (flushRunning) - return; - - flushRunning = true; - QTextStream stream(logFile); - forever { - bufferMutex.lock(); - if (buffer.isEmpty()) { - bufferMutex.unlock(); - flushRunning = false; - return; - } - QString message = buffer.takeFirst(); - bufferMutex.unlock(); - - stream << message << "\n"; - stream.flush(); - - if (logToConsole) - std::cout << message.toStdString() << std::endl; - } + if (flushRunning) + return; + + flushRunning = true; + QTextStream stream(logFile); + forever { + bufferMutex.lock(); + if (buffer.isEmpty()) { + bufferMutex.unlock(); + flushRunning = false; + return; + } + QString message = buffer.takeFirst(); + bufferMutex.unlock(); + + stream << message << "\n"; + stream.flush(); + + if (logToConsole) + std::cout << message.toStdString() << std::endl; + } } void ServerLogger::hupSignalHandler(int /*unused*/) { #ifdef Q_OS_UNIX - if (!logFile) - return; - - char a = 1; - ::write(sigHupFD[0], &a, sizeof(a)); + if (!logFile) + return; + + char a = 1; + ::write(sigHupFD[0], &a, sizeof(a)); #endif } void ServerLogger::handleSigHup() { #ifdef Q_OS_UNIX - if (!logFile) - return; - - snHup->setEnabled(false); - char tmp; - ::read(sigHupFD[1], &tmp, sizeof(tmp)); - - logFile->close(); - logFile->open(QIODevice::Append); - - snHup->setEnabled(true); + if (!logFile) + return; + + snHup->setEnabled(false); + char tmp; + ::read(sigHupFD[1], &tmp, sizeof(tmp)); + + logFile->close(); + logFile->open(QIODevice::Append); + + snHup->setEnabled(true); #endif }