Mangiare Senza Glutine disponibile su App Store

Per altre informazioni scrivi a fabriziocaldarelli@negusweb.it

Sistema di logging per applicazioni

Da Programmazione Software.

Per risolvere il problema del logging su file delle attività di un'applicazione ho creato questa semplice classe che sfrutta il pattern Singleton che mette a disposizione un solo metodo per la scrittura e 3 metodi per l'impostazione di parametri di configurazione.

Metodo in Output: Log (con un overload);
Metodi in Input: setDebugLevel, setPathFileLog, setFileOpenMode

I tre metodi in input consentono rispettivamente di impostare il livello di debug predefinito, il percorso del file di log e la modalità di apertura del file di log.

Il metodo in output nella forma più generale ha questa firma:

void Log(int lDebug,char *format,...);

Il parametro lDebug serve a specificare il livello di debug delle informazioni da registrare. Se questo livello di debug è superiore a quello fornito in fase di inizializzazione alla classe, allora non viene registrato.

Di seguito i sorgenti CLogger.h, CLogger.cpp ed il main.cpp che ne mostra l'utilizzo.

CLogger.h

/*
 * CLogger.h
 */
 
#ifndef CLOGGER_H_
#define CLOGGER_H_
 
#include <stdio.h>
#include <stdarg.h>
#include <string>
#include <iostream>
#include <fstream>
#include <time.h>
 
using namespace std;
 
class CLogger {
 
public:
	int getDebugLevel();
	void setDebugLevel(int value);
	string getPathFileLog();
	void setPathFileLog(string value);
	void setFileOpenMode(ios_base::openmode value);
 
public:
	static CLogger* getSingleton();
 
public:
	void Log(int lDebug,char *format,...);
	void Log( int levelDebug,const string& strLog);
 
public:
	virtual ~CLogger();
 
private:
	CLogger();
 
private:
	char* DataOraCorrente(char* bufferOutput);
 
private:
	static CLogger* instance;
 
private:
	int debugLevel;
	string pathFileLog;
	ios_base::openmode fileOpenMode;
 
};
 
#endif /* CLOGGER_H_ */


CLogger.cpp

/*
 * CLogger.cpp
 */
 
#include "Logger/CLogger.h"
 
CLogger* CLogger::instance = NULL;
 
CLogger* CLogger::getSingleton() { if (instance==NULL) instance = new CLogger(); return instance; }
 
CLogger::CLogger() {
	this->fileOpenMode = ios_base::app;
}
 
CLogger::~CLogger() {
	// TODO Auto-generated destructor stub
}
 
void CLogger::Log( int levelDebug,const string& strLog) {
	Log(levelDebug, "%s", strLog.c_str());
}
 
/*
 * Il Buffer in ingresso ed in uscita è lo stesso ... tranne che ne viene modificato
 * il contenuto
 */
char* CLogger::DataOraCorrente(char* bufferOutput)
{
	  time_t rawtime;
	  struct tm * timeinfo;
 
	  time ( &rawtime );
	  timeinfo = localtime ( &rawtime );
 
	  strftime (bufferOutput,20,"%d/%m/%Y %H:%M:%S",timeinfo);
	  return bufferOutput;
}
 
void CLogger::Log( int levelDebug, char *format, ... ) {
   va_list vl;
   ofstream outputFile;
   char chPtrOut[1024];
   char dataoraCorrenteBuffer[20];
 
   va_start( vl, format );
   vsprintf(chPtrOut,format, vl);
 
   outputFile.open(this->pathFileLog.c_str(), ios_base::app);
   outputFile << DataOraCorrente(dataoraCorrenteBuffer) << " - " << chPtrOut << endl;
   outputFile.close();
 
   va_end( vl );
}
 
int CLogger::getDebugLevel() { return this->debugLevel; }
void CLogger::setDebugLevel(int value) { this->debugLevel = value; }
string CLogger::getPathFileLog() { return this->pathFileLog; }
void CLogger::setPathFileLog(string value) { this->pathFileLog = value; }
void CLogger::setFileOpenMode(ios_base::openmode value)
{
	this->fileOpenMode = value;
	if (value == ios_base::trunc)
	{
		remove(this->pathFileLog.c_str());
	}
}


main.cpp

/*
 * main.cpp
 */
 
#include "CLogger.h"
 
using namespace std;
 
int main(int argc, char **argv)
{
	string pathApplicazione = argv[0];
	pathApplicazione = pathApplicazione.substr(0,pathApplicazione.find_last_of("/"));
 
	// Crea il singleton del logger
	CLogger::getSingleton();
	CLogger::getSingleton()->setPathFileLog(pathApplicazione+"/blue4promo.log");
	CLogger::getSingleton()->setDebugLevel(3);
	//CLogger::getSingleton()->setFileOpenMode(ios_base::trunc);
 
        CLogger::getSingleton()->Log(1, "Questo è l'uso della firma di Log() con solo due parametri");
        CLogger::getSingleton()->Log(1, "%s", "Questo è l'uso della firma di Log() nella forma completa");
 
	return 0;
}

Allegati