aboutsummaryrefslogtreecommitdiffstats
path: root/logging.h
diff options
context:
space:
mode:
authorAntony Woods <acron1@gmail.com>2014-05-23 08:22:12 +0100
committerAntony Woods <acron1@gmail.com>2014-05-23 08:22:12 +0100
commit639bacf0241346d8fa81ab2d256f90651c9b3ba7 (patch)
tree4c2d1eee324d9a2992bf1bbaf2c93fa8441e93f0 /logging.h
parent1ae0387a255c7ec891179e3880579368b6cc588d (diff)
downloadcrow-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.h147
1 files changed, 86 insertions, 61 deletions
diff --git a/logging.h b/logging.h
index dc610f0..576931c 100644
--- a/logging.h
+++ b/logging.h
@@ -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)