/* * Logger.h * * Copyright (C) 2008 Johannes Thorn * * 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_LOGGER_H_ #define MAD_CORE_LOGGER_H_ #include "String.h" #include #include namespace Mad { namespace Core { class LogManager; class Logger { public: friend class LogManager; enum MessageLevel { LOG_CRITICAL = 1, LOG_ERROR, LOG_WARNING, LOG_DEFAULT, LOG_VERBOSE, LOG_DEBUG }; enum MessageCategory { LOG_SYSTEM, LOG_NETWORK, LOG_DAEMON, LOG_USER, LOG_DISK, LOG_PROGRAM, LOG_GENERAL }; private: std::bitset<16> categories; MessageLevel level; std::bitset<16> remoteCategories; MessageLevel remoteLevel; bool remote; protected: Logger() : level(LOG_DEFAULT), remoteLevel(LOG_DEFAULT) {setAllCategories(); setAllRemoteCategories(); remote = false;} virtual ~Logger() {} void log(MessageCategory category, MessageLevel level, boost::posix_time::ptime timestamp, const Core::String &message, const Core::String &source) { if((source.isEmpty() && getLevel() >= level && isCategorySet(category)) || (!source.isEmpty() && remote && getRemoteLevel() >= level && isRemoteCategorySet(category))) logMessage(category, level, timestamp, message, source); } virtual void logMessage(MessageCategory category, MessageLevel level, boost::posix_time::ptime timestamp, const Core::String &message, const Core::String &source) = 0; public: void setCategory(MessageCategory newCategory) { categories.set(newCategory); } void unsetCategory(MessageCategory oldCategory) { categories.reset(oldCategory); } void setAllCategories() { categories.set(); } void unsetAllCategories() { categories.reset(); } bool isCategorySet(MessageCategory category) const { return categories.test(category); } void setRemoteCategory(MessageCategory newCategory) { remote = true; remoteCategories.set(newCategory); } void unsetRemoteCategory(MessageCategory oldCategory) { remote = true; remoteCategories.reset(oldCategory); } void setAllRemoteCategories() { remote = true; remoteCategories.set(); } void unsetAllRemoteCategories() { remote = true; remoteCategories.reset(); } bool isRemoteCategorySet(MessageCategory category) const { return remoteCategories.test(category); } MessageLevel getLevel() const { return level; } void setLevel(MessageLevel newLevel) { level = newLevel; } MessageLevel getRemoteLevel() const { return remoteLevel; } void setRemoteLevel(MessageLevel newLevel) { remote = true; remoteLevel = newLevel; } }; } } #endif /* MAD_CORE_LOGGER_H_ */