I3MUP1+-+Exercise+9.1

=Exercise 9.1 - Logging=

Exercise 1:
Vi har valgt at tage alle levels med, så man i det mindste kan vælge hvilke man vil have med senere hen. Det er jo et OSApi som eventuelt skal bruges andre steder, og der er det ikke til at sige hvilke log levels der vil være brugbare.

Exercise 2:
Ved at undersøge den allerede implementerede log, ses det i log.hpp at ved et kald som OSAPI_LOG_INF("info besked"), bliver funktionen log i singleton klassen LogSystem kaldt. log funktionen tager parametrene __FILE__, __LINE__, __FUNCTION__, levelet og strengen med og putter det hele i en besked kø.

Beskedkøen tilhøre LogSystem, som er en tråd, og bliver håndteret i handleLog. handleLog kalder så endelig funktionen log i IlogOutput klassen, men da det er en abstakt klasse bliver den log kald som IlogOutput i virkeligheden er.

Hvad der er godt ved denne log er blandt andet at man på run-time kan skifte hvor man vil logge til. En anden ting er at man let kan tilføje sin egen lognings type hvis det ønskes.

Exercise 3:
For at få viden om sysloggen som vi skal skrive til, kan 'man' siden med fordel læses: man syslog

Da vi ønsker at brugeren af OSAPI'et skal have mulighed for at tilføje en en start streng, bruges openlog, op kaldes i constructoren, så samtlige logninger får den start besked. desuden er der et flag som kan sættes der gør at den åbner til loggen med det samme og ikke venter til syslog bliver kaldt.

code format="cpp" Syslog::Syslog(const char *ident) {	facility_ = LOG_USER; openlog(ident, LOG_NDELAY, facility_); }

Syslog::~Syslog {	closelog; }

void Syslog::log(	Level             lvl,                        const char*        fileName,                        int                lineNo,                        const char*        functionName,                        Time               timeStamp,                            const std::string& logString) {	std::stringstream logMsg; logMsg	<< LevelStr[lvl] << " ("		<< fileName << ":"		<< lineNo << " - "		<< functionName << ") " << logString << std::endl;

int priority = facility_; switch(lvl) {		case Emergency: priority |= LOG_EMERG; break; case Alert: priority |= LOG_ALERT; break; case Critical: priority |= LOG_CRIT; break; case Error: priority |= LOG_ERR; break; case Warning: priority |= LOG_WARNING; break; case Notice: priority |= LOG_NOTICE; break; case Informational: priority |= LOG_INFO; break; case Debug: priority |= LOG_DEBUG; break; }

// conversion of logMsg to const char * syslog(priority, "%s", logMsg.str.c_str); } code