summaryrefslogtreecommitdiffstats
path: root/src/Common/Logger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/Logger.cpp')
-rw-r--r--src/Common/Logger.cpp53
1 files changed, 44 insertions, 9 deletions
diff --git a/src/Common/Logger.cpp b/src/Common/Logger.cpp
index 27c98ba..51a320f 100644
--- a/src/Common/Logger.cpp
+++ b/src/Common/Logger.cpp
@@ -20,6 +20,8 @@
#include "Logger.h"
#include "ConfigEntry.h"
#include "ConfigManager.h"
+#include "Backends/ConsoleLogger.h"
+#include "Backends/FileLogger.h"
#include <cstdlib>
@@ -27,21 +29,49 @@ namespace Mad {
namespace Common {
std::auto_ptr<Logger::ConfigHelper> Logger::configHelper;
-std::list<Logger*> Logger::loggers;
-
+std::set<Logger*> Logger::loggers;
+std::auto_ptr<std::queue<Logger::Message> > Logger::messageQueue(new std::queue<Message>);
bool Logger::ConfigHelper::handleConfigEntry(const ConfigEntry &entry, bool handled) {
if(handled)
return false;
- if(entry[0].getKey().matches("Logger") && entry[1].empty()) {
- logf(WARNING, "Unknown logger '%s'.", entry[0][0].c_str());
- return true;
+ if(entry[0].getKey().matches("Logger")) {
+ if(entry[0][0].matches("Console")) {
+ if(entry[1].empty()) {
+ loggers.insert(new Backends::ConsoleLogger());
+ return true;
+ }
+ }
+ else if(entry[1].empty()) {
+ logf(WARNING, "Unknown logger '%s'.", entry[0][0].c_str());
+ return true;
+ }
}
return false;
}
+void Logger::ConfigHelper::configFinished() {
+ std::auto_ptr<std::queue<Message> > queue = messageQueue;
+
+ if(loggers.empty())
+ loggers.insert(new Backends::ConsoleLogger());
+
+ while(!queue->empty()) {
+ const Message &message = queue->front();
+ log(message.category, message.level, message.timestamp, message.message);
+ queue->pop();
+ }
+}
+
+Logger::ConfigHelper::~ConfigHelper() {
+ // TODO delete all those loggers...
+
+ //while(!loggers.empty())
+ // delete (*loggers.begin());
+}
+
void Logger::logfv(MessageCategory category, MessageLevel level, const char *format, va_list ap) {
int size = 100;
char *buf = (char*)std::malloc(size);
@@ -70,11 +100,16 @@ void Logger::logfv(MessageCategory category, MessageLevel level, const char *for
}
-void Logger::log(MessageCategory category, MessageLevel level, const std::string &message) {
- time_t messageTimestamp = std::time(NULL);
- for(std::list<Logger*>::iterator logger = loggers.begin(); logger != loggers.end(); ++logger) {
+void Logger::log(MessageCategory category, MessageLevel level, time_t timestamp, const std::string &message) {
+ if(messageQueue.get()) { // Queue message if loggers aren't configured yet
+ Message m = {category, level, timestamp, message};
+ messageQueue->push(m);
+ return;
+ }
+
+ for(std::set<Logger*>::iterator logger = loggers.begin(); logger != loggers.end(); ++logger) {
if((*logger)->getLevel() >= level && (*logger)->isCategorySet(category))
- (*logger)->logMessage(category, level, messageTimestamp, message);
+ (*logger)->logMessage(category, level, timestamp, message);
}
}