Improved logging, fixed minor bug.

This commit is contained in:
Naim A 2013-08-16 17:06:09 +03:00
parent 145751c953
commit 7e9ecdb099
5 changed files with 93 additions and 12 deletions

View file

@ -18,15 +18,85 @@
*/ */
#include "logging.h" #include "logging.h"
#include <fstream>
#include <ostream>
#include <string>
using namespace std;
namespace UDPT { 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) void Logger::log(enum LogLevel lvl, string msg)
{ {
logfile << time (NULL) << ": (" << ((char)lvl) << "): "; const char letters[] = "EWID";
logfile << msg << "\n"; if (lvl <= this->loglevel)
{
(*logfile) << time (NULL) << ": ("
<< ((char)letters[lvl]) << "): "
<< msg << "\n";
}
} }
}; };

View file

@ -32,17 +32,25 @@ namespace UDPT {
public: public:
enum LogLevel { enum LogLevel {
LL_ERROR = 'E', LL_ERROR = 0,
LL_WARNING = 'W', LL_WARNING = 1,
LL_INFO = 'I', LL_INFO = 2,
LL_DEBUG = 'D' LL_DEBUG = 3
}; };
Logger (Settings *s);
Logger (Settings *s, ostream &os); Logger (Settings *s, ostream &os);
virtual ~Logger ();
void log (enum LogLevel, string msg); void log (enum LogLevel, string msg);
private: private:
ostream &logfile; ostream *logfile;
enum LogLevel loglevel;
bool closeStreamOnDestroy;
static void setStream (Logger *logger, ostream &s);
}; };
}; };

View file

@ -26,6 +26,7 @@
#include "http/httpserver.hpp" #include "http/httpserver.hpp"
#include "http/webapp.hpp" #include "http/webapp.hpp"
#include <cstdlib> // atoi #include <cstdlib> // atoi
#include <csignal> // signal
using namespace std; using namespace std;
using namespace UDPT; 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; 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); usi = new UDPTracker (settings);
HTTPServer *apiSrv = NULL; HTTPServer *apiSrv = NULL;

View file

@ -354,6 +354,7 @@ void _settings_clean_string (char **str)
{ {
string addr = v.substr(s, (e - s) + 1); string addr = v.substr(s, (e - s) + 1);
SOCKADDR_IN saddr; SOCKADDR_IN saddr;
memset(&saddr, 0, sizeof (SOCKADDR_IN));
saddr.sin_family = AF_INET; saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = 0L; saddr.sin_addr.s_addr = 0L;
saddr.sin_port = (6969); saddr.sin_port = (6969);

View file

@ -110,6 +110,7 @@ namespace UDPT
enum UDPTracker::StartStatus UDPTracker::start () enum UDPTracker::StartStatus UDPTracker::start ()
{ {
stringstream ss;
SOCKET sock; SOCKET sock;
int r, // saves results int r, // saves results
i, // loop index i, // loop index
@ -123,6 +124,7 @@ namespace UDPT
yup = 1; yup = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&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)); r = bind (sock, (SOCKADDR*)&this->localEndpoint, sizeof(SOCKADDR_IN));
if (r == SOCKET_ERROR) if (r == SOCKET_ERROR)
@ -142,7 +144,7 @@ namespace UDPT
this->isRunning = true; this->isRunning = true;
stringstream ss; ss.clear();
ss << "Starting maintenance thread (1/" << ((int)this->thread_count) << ")"; ss << "Starting maintenance thread (1/" << ((int)this->thread_count) << ")";
logger->log(Logger::LL_INFO, ss.str()); logger->log(Logger::LL_INFO, ss.str());
@ -155,10 +157,9 @@ namespace UDPT
for (i = 1;i < this->thread_count; i++) for (i = 1;i < this->thread_count; i++)
{ {
stringstream ss; ss.clear();
ss << "Starting thread (" << (i + 1) << "/" << ((int)this->thread_count) << ")"; ss << "Starting thread (" << (i + 1) << "/" << ((int)this->thread_count) << ")";
logger->log(Logger::LL_INFO, ss.str()); logger->log(Logger::LL_INFO, ss.str());
ss.clear();
#ifdef WIN32 #ifdef WIN32
this->threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)_thread_start, (LPVOID)this, 0, NULL); this->threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)_thread_start, (LPVOID)this, 0, NULL);