From b58831e5eec4d0595099b8e9c2979b157fe37041 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 25 Oct 2008 15:50:08 +0200 Subject: ConsoleLogger kann jetzt ?ber Konfigurationsdateien aktiviert werden --- src/Common/Logger.cpp | 53 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 9 deletions(-) (limited to 'src/Common/Logger.cpp') 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 @@ -27,21 +29,49 @@ namespace Mad { namespace Common { std::auto_ptr Logger::configHelper; -std::list Logger::loggers; - +std::set Logger::loggers; +std::auto_ptr > Logger::messageQueue(new std::queue); 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 > 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::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::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); } } -- cgit v1.2.3