Eine einfache Logging-Klasse in C++

Ich schreibe gerade an einigen DLLs für Gamestudio und hatte da das Problem, dass es nicht einfach ist diese zu Debuggen. Dafür habe ich hier eine einfache Logging-Klasse geschrieben die als Singleton agiert, er muss also nicht explizit initialisiert sondern einfach nur aufgerufen werden. Das geht so:

Logger::getInstance()->log("Skins: %i", 1);

Es ist also möglich, beliebig lange Argumentelisten zu verarbeiten. Das Log wird in der Datei “Log.txt” im Verzeichnis der Anwendung gespeichert.

Den Quelltext findet ihr hinter dem More-Tag. Viel Spaß damit!

Logger.cpp

#include "Logger.h"
#include <stdarg.h>
 
Logger *Logger::theInstance = NULL;
 
Logger::Logger()
{
	logFile = fopen("Log.txt", "wt");
}
 
Logger::~Logger()
{
	if (logFile)
	{
		fflush(logFile);
		fclose(logFile);
		logFile = NULL;
	}
}
 
Logger* Logger::getInstance()
{
	if (theInstance == NULL)
	{
		theInstance = new Logger();
	}
	return theInstance;
}
 
void Logger::release()
{
	if (theInstance != NULL)
	{
		delete theInstance;
	}
	theInstance = NULL;
}
 
bool Logger::log(char* _log, ...)
{
	char acText[1024];
	va_list VAList;
 
	va_start(VAList, _log);
	vsprintf(acText, _log, VAList);
	va_end(VAList);
 
	fprintf(Logger::logFile, "%s (Line %d): %s \n",  __FILE__, __LINE__, acText);
 
	return true;
}

Logger.h

#pragma once
 
#include <cstdio>
 
class Logger {
	private:
		Logger();
		~Logger();
 
		FILE* logFile;
 
		static Logger *theInstance;
	public:
		static Logger *getInstance();
		static void release();
		bool log(char* _log, ...);
};

Leave a Reply

Your email address will not be published. Required fields are marked *