/* * LogManager.h * * Copyright (C) 2008 Matthias Schiffer * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along * with this program. If not, see . */ #ifndef MAD_CORE_LOGMANAGER_H_ #define MAD_CORE_LOGMANAGER_H_ #include #include "Configurable.h" #include "Logger.h" #include "RemoteLogger.h" #include #include #include #include namespace Mad { namespace Core { class Application; class ThreadManager; class LogManager : public Configurable { private: friend class Application; friend class ThreadManager; typedef LoggerBase::MessageCategory MessageCategory; typedef LoggerBase::MessageLevel MessageLevel; struct Message { MessageCategory category; MessageLevel level; time_t timestamp; std::string message; }; struct RemoteMessage { MessageCategory category; MessageLevel level; time_t timestamp; std::string message; std::string source; }; class ConsoleLogger : public Logger, public RemoteLogger { private: // For long messages, writing to cerr is not atomic // -> lock cerr to prevent mixing messages up boost::mutex cerrLock; protected: virtual void logMessage(MessageCategory category _UNUSED_PARAMETER_, MessageLevel level, time_t timestamp _UNUSED_PARAMETER_, const std::string &message); virtual void logMessage(MessageCategory category _UNUSED_PARAMETER_, MessageLevel, time_t timestamp _UNUSED_PARAMETER_, const std::string &message, const std::string &messageSource); public: ConsoleLogger() {} void logMessageDirect(MessageCategory category _UNUSED_PARAMETER_, MessageLevel level _UNUSED_PARAMETER_, time_t timestamp _UNUSED_PARAMETER_, const std::string &message); }; Application *application; boost::shared_ptr consoleLogger; std::set > loggers; std::set > remoteLoggers; bool configured, running; boost::mutex queueLock; boost::condition_variable queueCond; boost::mutex loggerLock; boost::mutex remoteLoggerLock; std::queue messageQueue; std::queue remoteMessageQueue; void loggerThread(); void stopLoggerThread() { queueLock.lock(); running = false; queueLock.unlock(); queueCond.notify_one(); } LogManager(Application *application0); ~LogManager(); protected: virtual bool handleConfigEntry(const ConfigEntry &entry, bool handled); virtual void configFinished(); public: void log(MessageCategory category, MessageLevel level, time_t timestamp, const std::string &message); void log(MessageCategory category, MessageLevel level, time_t timestamp, const std::string &message, const std::string &source); void registerLogger(boost::shared_ptr logger) { loggerLock.lock(); loggers.insert(logger); loggerLock.unlock(); } void unregisterLogger(boost::shared_ptr logger) { loggerLock.lock(); loggers.erase(logger); loggerLock.unlock(); } void registerLogger(boost::shared_ptr logger) { remoteLoggerLock.lock(); remoteLoggers.insert(logger); remoteLoggerLock.unlock(); } void unregisterLogger(boost::shared_ptr logger) { remoteLoggerLock.lock(); remoteLoggers.erase(logger); remoteLoggerLock.unlock(); } }; } } #endif /* MAD_CORE_LOGMANAGER_H_ */