diff options
author | Antony Woods <acron1@gmail.com> | 2014-05-23 08:22:12 +0100 |
---|---|---|
committer | Antony Woods <acron1@gmail.com> | 2014-05-23 08:22:12 +0100 |
commit | 639bacf0241346d8fa81ab2d256f90651c9b3ba7 (patch) | |
tree | 4c2d1eee324d9a2992bf1bbaf2c93fa8441e93f0 /logging.h | |
parent | 1ae0387a255c7ec891179e3880579368b6cc588d (diff) | |
download | crow-639bacf0241346d8fa81ab2d256f90651c9b3ba7.tar.gz crow-639bacf0241346d8fa81ab2d256f90651c9b3ba7.zip |
Added log handlers via the ILogHandler interface. At the moment these are sti pretty trivial but should still allow you to add handlers for network, file etc.
Diffstat (limited to 'logging.h')
-rw-r--r-- | logging.h | 147 |
1 files changed, 86 insertions, 61 deletions
@@ -8,75 +8,100 @@ using namespace std; -string timeStamp() +namespace crow { - char date[32]; - time_t t = time(0); - strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", gmtime(&t)); - return string(date); -} + enum class LogLevel + { + CRITICAL, + ERROR, + WARNING, + INFO, + DEBUG + }; + + class ILogHandler { + public: + virtual void log(string message, LogLevel level) = 0; + }; + + class CerrLogHandler : public ILogHandler { + public: + void log(string message, LogLevel level) override { + cerr << message; + } + }; + + class logger { + + private: + // + static string timeStamp() + { + char date[32]; + time_t t = time(0); + strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", gmtime(&t)); + return string(date); + } + + public: -class logger { + // + static LogLevel currentLevel; + static std::shared_ptr<ILogHandler> currentHandler; - public: + logger(string prefix, LogLevel level) : m_prefix(prefix), m_level(level) { - // - enum class Level - { - CRITICAL, - ERROR, - WARNING, - INFO, - DEBUG - }; + } + ~logger() { + #ifdef CROW_ENABLE_LOGGING + if(m_level <= currentLevel) { + ostringstream str; + str << "(" << timeStamp() << ") [" << m_prefix << "] " << m_stringStream.str() << endl; + currentHandler->log(str.str(), m_level); + } + #endif + } - // - static Level currentLevel; + // + template <typename T> + logger& operator<<(T const &value) { - logger(string prefix, logger::Level level) : m_prefix(prefix), m_level(level) { + #ifdef CROW_ENABLE_LOGGING + if(m_level <= currentLevel) { + m_stringStream << value; + } + #endif + return *this; + } - } - ~logger() { -#ifdef CROW_ENABLE_LOGGING - if(m_level <= currentLevel) { - cerr << "(" << timeStamp() << ") [" << m_prefix << "] " << m_stringStream.str() << endl; + // + static void setLogLevel(LogLevel level) { + currentLevel = level; } -#endif - } - - // - template <typename T> - logger& operator<<(T const &value) { - -#ifdef CROW_ENABLE_LOGGING - if(m_level <= currentLevel) { - m_stringStream << value; - } -#endif - return *this; - } - - // - static void setLogLevel(logger::Level level) { - currentLevel = level; - } - - private: - - // - ostringstream m_stringStream; - string m_prefix; - Level m_level; -}; - -// -logger::Level logger::currentLevel = (Level)CROW_LOG_LEVEL; - -#define CROW_LOG_CRITICAL logger("CRITICAL", logger::Level::CRITICAL) -#define CROW_LOG_ERROR logger("ERROR ", logger::Level::ERROR) -#define CROW_LOG_WARNING logger("WARNING ", logger::Level::WARNING) -#define CROW_LOG_INFO logger("INFO ", logger::Level::INFO) -#define CROW_LOG_DEBUG logger("DEBUG ", logger::Level::DEBUG) + + static void setHandler(std::shared_ptr<ILogHandler> handler) { + currentHandler = handler; + } + + private: + + // + ostringstream m_stringStream; + string m_prefix; + LogLevel m_level; + }; + + // + LogLevel logger::currentLevel = (LogLevel)CROW_LOG_LEVEL; + std::shared_ptr<ILogHandler> logger::currentHandler = std::make_shared<CerrLogHandler>(); + +} + +#define CROW_LOG_CRITICAL logger("CRITICAL", crow::LogLevel::CRITICAL) +#define CROW_LOG_ERROR logger("ERROR ", crow::LogLevel::ERROR) +#define CROW_LOG_WARNING logger("WARNING ", crow::LogLevel::WARNING) +#define CROW_LOG_INFO logger("INFO ", crow::LogLevel::INFO) +#define CROW_LOG_DEBUG logger("DEBUG ", crow::LogLevel::DEBUG) |