Просмотр исходного кода

Merge pull request #509 from fodinabor/LogToFile

Implemented the option to log to a file
Ivan Safrin 11 лет назад
Родитель
Сommit
713fe0793b

+ 20 - 0
Core/Contents/Include/PolyLogger.h

@@ -63,5 +63,25 @@ namespace Polycode {
 			* @param str The c-string to log
 			*/
 			static void logw(const char *str);
+
+			void setLogToFile(bool val);
+			bool getLogToFile();
+
+			/**
+			* @return The file that is logged to
+			*/
+			FILE *getLogFile();
+
+			/**
+			* @return The logger instance
+			*/
+			static Logger *getInstance();
+
+	protected:
+		FILE *logFile;
+		bool logToFile;
+
+	private:
+		static Logger *overrideInstance;
 	};
 }

+ 1 - 1
Core/Contents/Source/PolyCoreServices.cpp

@@ -122,7 +122,7 @@ void CoreServices::setupBasicListeners() {
 }
 
 CoreServices::CoreServices() : EventDispatcher() {
-	logger = new Logger();
+	logger = Logger::getInstance();
 	resourceManager = new ResourceManager();	
 	config = new Config();
 	materialManager = new MaterialManager();	

+ 47 - 2
Core/Contents/Source/PolyLogger.cpp

@@ -24,13 +24,17 @@
 #ifdef _MSC_VER
 #include <windows.h>
 #endif
+#include "PolyLogger.h"
 #include <stdio.h>
 #include <stdarg.h>
 #include <string>
 #include <iostream>
+#include <time.h>
 
 using namespace Polycode;
 
+Logger* Logger::overrideInstance = NULL;
+
 LoggerEvent::LoggerEvent(String message) : Event() {
 	this->message = message;
 }
@@ -41,11 +45,12 @@ LoggerEvent::~LoggerEvent() {
 
 
 Logger::Logger() : EventDispatcher() {
-
+	logToFile = false;
+	logFile = fopen("poly.log", "w");
 }
 
 Logger::~Logger() {
-
+	fclose(logFile);
 }
 
 void Logger::logBroadcast(String message) {
@@ -62,6 +67,12 @@ void Logger::log(const char *format, ...) {
 	va_start(args, format);
 	vfprintf(stderr, format, args);
 	va_end(args);
+	
+	if (Logger::getInstance()->getLogToFile()){
+		va_start(args, format);
+		vfprintf(Logger::getInstance()->getLogFile(), format, args);
+		va_end(args);
+	}
 
 #ifdef _MSC_VER
 #ifdef _DEBUG
@@ -84,3 +95,37 @@ void Logger::log(const char *format, ...) {
 #endif
 
 }
+
+void Logger::setLogToFile(bool val){
+	if (!logToFile && val){
+		time_t t = time(NULL);
+		char mbstr[100];
+		if (strftime(mbstr, sizeof(mbstr), "%y_%m_%d.log", localtime(&t))) {
+			//if (logFile)
+			//	fclose(logFile);
+			logFile = fopen((const char*)mbstr, "w");
+		} else {
+			logFile = fopen("poly.log", "w");
+		}
+	}
+
+	logToFile = val;
+}
+
+bool Logger::getLogToFile(){
+	return logToFile;
+}
+
+FILE *Logger::getLogFile(){
+	return logFile;
+}
+
+Logger *Logger::getInstance(){
+	if (overrideInstance) {
+		return overrideInstance;
+	}
+
+	overrideInstance = new Logger;
+	//Logger::log("Creating new logger instance...\n");
+	return overrideInstance;
+}