diff --git a/src/logging.cpp b/src/logging.cpp index 384154a..80ef946 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -18,15 +18,85 @@ */ #include "logging.h" +#include +#include +#include + +using namespace std; namespace UDPT { - Logger::Logger(Settings *s, ostream &os) : logfile (os) + + Logger::Logger(Settings *s) + : logfile (&std::cout) { + Settings::SettingClass *sc; + string filename = "stdout"; + string level = "error"; + + closeStreamOnDestroy = false; + + sc = s->getClass("logging"); + if (sc != NULL) + { + string::size_type i; + + filename = sc->get("filename"); + level = sc->get("level"); + + for (i = 0;i < level.length(); i++) + { + if (level[i] >= 'A' && level[i] <= 'Z') + level[i] = 'a' + (level[i] - 'A'); + } + } + + if (level == "debug" || level == "d") + this->loglevel = LL_DEBUG; + else if (level == "warning" || level == "w") + this->loglevel = LL_WARNING; + else if (level == "info" || level == "i") + this->loglevel = LL_INFO; + else + this->loglevel = LL_ERROR; + + if (filename.compare("stdout") != 0 && filename.length() > 0) + { + fstream fs; + fs.open(filename.c_str(), ios::binary | ios::out | ios::app); + if (!fs.is_open()) + { + this->log(LL_ERROR, "Failed to open log file."); + return; + } + this->logfile = &fs; + closeStreamOnDestroy = true; + } + } + + Logger::Logger(Settings *s, ostream &os) + : logfile (&os), loglevel (LL_ERROR) + { + closeStreamOnDestroy = false; + } + + Logger::~Logger() + { + fstream *f = (fstream*)this->logfile; + f->flush(); + if (closeStreamOnDestroy) + { + f->close(); + } } void Logger::log(enum LogLevel lvl, string msg) { - logfile << time (NULL) << ": (" << ((char)lvl) << "): "; - logfile << msg << "\n"; + const char letters[] = "EWID"; + if (lvl <= this->loglevel) + { + (*logfile) << time (NULL) << ": (" + << ((char)letters[lvl]) << "): " + << msg << "\n"; + } } }; diff --git a/src/logging.h b/src/logging.h index fe9362d..7d382ee 100644 --- a/src/logging.h +++ b/src/logging.h @@ -32,17 +32,25 @@ namespace UDPT { public: enum LogLevel { - LL_ERROR = 'E', - LL_WARNING = 'W', - LL_INFO = 'I', - LL_DEBUG = 'D' + LL_ERROR = 0, + LL_WARNING = 1, + LL_INFO = 2, + LL_DEBUG = 3 }; + Logger (Settings *s); + Logger (Settings *s, ostream &os); + virtual ~Logger (); + void log (enum LogLevel, string msg); private: - ostream &logfile; + ostream *logfile; + enum LogLevel loglevel; + bool closeStreamOnDestroy; + + static void setStream (Logger *logger, ostream &s); }; }; diff --git a/src/main.cpp b/src/main.cpp index 2338548..b2fb64d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,6 +26,7 @@ #include "http/httpserver.hpp" #include "http/webapp.hpp" #include // atoi +#include // signal using namespace std; using namespace UDPT; @@ -171,7 +172,7 @@ int main(int argc, char *argv[]) cerr << "Failed to read from '" << config_file.c_str() << "'. Using default settings." << endl; } - logger = new Logger (settings, cout); + logger = new Logger (settings); usi = new UDPTracker (settings); HTTPServer *apiSrv = NULL; diff --git a/src/settings.cpp b/src/settings.cpp index a6efac2..ab7120f 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -354,6 +354,7 @@ void _settings_clean_string (char **str) { string addr = v.substr(s, (e - s) + 1); SOCKADDR_IN saddr; + memset(&saddr, 0, sizeof (SOCKADDR_IN)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = 0L; saddr.sin_port = (6969); diff --git a/src/udpTracker.cpp b/src/udpTracker.cpp index f137074..df4e62f 100644 --- a/src/udpTracker.cpp +++ b/src/udpTracker.cpp @@ -110,6 +110,7 @@ namespace UDPT enum UDPTracker::StartStatus UDPTracker::start () { + stringstream ss; SOCKET sock; int r, // saves results i, // loop index @@ -123,6 +124,7 @@ namespace UDPT yup = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&yup, 1); + this->localEndpoint.sin_family = AF_INET; r = bind (sock, (SOCKADDR*)&this->localEndpoint, sizeof(SOCKADDR_IN)); if (r == SOCKET_ERROR) @@ -142,7 +144,7 @@ namespace UDPT this->isRunning = true; - stringstream ss; + ss.clear(); ss << "Starting maintenance thread (1/" << ((int)this->thread_count) << ")"; logger->log(Logger::LL_INFO, ss.str()); @@ -155,10 +157,9 @@ namespace UDPT for (i = 1;i < this->thread_count; i++) { - stringstream ss; + ss.clear(); ss << "Starting thread (" << (i + 1) << "/" << ((int)this->thread_count) << ")"; logger->log(Logger::LL_INFO, ss.str()); - ss.clear(); #ifdef WIN32 this->threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)_thread_start, (LPVOID)this, 0, NULL);