#ifndef LOGGER_HPP #define LOGGER_HPP #include #include #define CC(COLOR) CC_##COLOR #define CC_RESET "\033[0m" #define CC_BLACK "\e[0;30m" #define CC_RED "\e[0;31m" #define CC_GREEN "\e[0;32m" #define CC_YELLOW "\e[0;33m" #define CC_BLUE "\e[0;34m" #define CC_PURPLE "\e[0;35m" #define CC_CYAN "\e[0;36m" #define CC_WHITE "\e[0;37m" namespace Plains { namespace Core { using std::string; using std::ofstream; //using std::ostream; //using std::streambuf; class Logger { public: enum Level { DEBUG, INFO, WARN, FATAL }; Logger(Level logLevel); ~Logger(); void setLogLevel(Level level); void log(Level lvl, const char* msg); void log(Level lvl, const string& msg); static const char commit = 0; class Sink { private: bool _lineIsPrefixed; Logger& _parent; const Logger::Level _level; const char* _colorCode; void prefixLine(bool resetToFalse = false); public: Sink(const Level level, Logger& parent); void ln (const string& msg); void ln (const char* msg); Sink& operator<<(const char character); Sink& operator<<(const string& msg); Sink& operator<<(const char* msg); Sink& operator<<(const int msg); Sink& operator<<(const long msg); Sink& operator<<(const unsigned long msg); }; Sink debug, info, warn, fatal; private: enum Level _logLevel; ofstream* _output; static string genTimeStamp(); }; }} #endif