/* * 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 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 General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef MAD_COMMON_LOGMANAGER_H_ #define MAD_COMMON_LOGMANAGER_H_ #include #include "Configurable.h" #include "Logger.h" #include "RemoteLogger.h" #include #include #include #include namespace Mad { namespace Net { class ThreadManager; } namespace Common { class LogManager : public Configurable { private: friend class Net::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); }; static LogManager logManager; ConsoleLogger 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() : configured(false), running(false) {} 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(Logger *logger) { loggerLock.lock(); loggers.insert(logger); loggerLock.unlock(); } void unregisterLogger(Logger *logger) { loggerLock.lock(); loggers.erase(logger); loggerLock.unlock(); } void registerLogger(RemoteLogger *logger) { remoteLoggerLock.lock(); remoteLoggers.insert(logger); remoteLoggerLock.unlock(); } void unregisterLogger(RemoteLogger *logger) { remoteLoggerLock.lock(); remoteLoggers.erase(logger); remoteLoggerLock.unlock(); } static LogManager *get() { return &logManager; } }; } } #endif /* MAD_COMMON_LOGMANAGER_H_ */