diff --git a/examples/c++/logger.cxx b/examples/c++/logger.cxx new file mode 100644 index 00000000..61cdd02c --- /dev/null +++ b/examples/c++/logger.cxx @@ -0,0 +1,17 @@ +#include "upm_logger.hpp" + +using namespace upm; + +int main() +{ + + UPM_LOGGER::getLogLevel() = LOG_ERROR; + + UPM_LOGGER().get(LOG_WARNING) << "a loop with 4 iterations"; + + for (int i = 0; i < 4; ++i) { + UPM_LOGGER().get(LOG_DEBUG) << "i = " << i; + } + + return 0; +} \ No newline at end of file diff --git a/include/upm_logger.hpp b/include/upm_logger.hpp new file mode 100644 index 00000000..f0a44519 --- /dev/null +++ b/include/upm_logger.hpp @@ -0,0 +1,84 @@ +#pragma once + +#include +#include +#include +#include + +namespace upm { + + enum UpmLogLevel { + LOG_ERROR, + LOG_WARNING, + LOG_INFO, + LOG_DEBUG, + NA + }; + + static const std::string logLevelNames[] = { + "ERROR", + "WARNING", + "INFO", + "DEBUG", + "" + }; + + class UPM_LOGGER { + public: + UPM_LOGGER(); + virtual ~UPM_LOGGER(); + std::ostringstream& get(UpmLogLevel level = LOG_INFO); + static UpmLogLevel& getLogLevel(); + protected: + std::ostringstream os; + private: + UPM_LOGGER(const UPM_LOGGER&); + UPM_LOGGER& operator=(const UPM_LOGGER&); + private: + UpmLogLevel logLevel; + + public: + static const std::string& getLogLevelName(UpmLogLevel level) + { + if (level < LOG_ERROR || level >= NA) { + return NULL; + } + + return logLevelNames[level]; + } + }; + + UPM_LOGGER::UPM_LOGGER() {} + + + UpmLogLevel& UPM_LOGGER::getLogLevel() + { + static UpmLogLevel reportingLevel = LOG_DEBUG; + return reportingLevel; + } + + std::ostringstream& UPM_LOGGER::get(UpmLogLevel level) + { + using namespace std::chrono; + + os << "- " << duration_cast + (system_clock::now().time_since_epoch()).count(); + os << " " << getLogLevelName(level) << ": "; + os << std::string(level > LOG_DEBUG ? level - LOG_DEBUG : 0, '\t'); + logLevel = level; + + return os; + } + + UPM_LOGGER::~UPM_LOGGER() + { + if (logLevel >= UPM_LOGGER::getLogLevel()) { + os << std::endl; + fprintf(stderr, "%s", os.str().c_str()); + fflush(stderr); + } + } + +} + +