#include "Logger.h" #include using namespace Upp; Logger::Logger(LoggingLevel level, const String& tag) : level(level) , tag(tag) { } Logger::~Logger() { Log(); } void Logger::Log() { StringStream ss; String output = outputStream.GetResult(); if (output.IsEmpty()) return; ss << GetCurrentTime(); ss << " " << level; if (!tag.IsEmpty()) { ss << "/" << tag; } ss << " " << output; VppLog() << ss.GetResult() << EOL; } String Logger::GetCurrentTime() { using namespace std::chrono; using days = duration>::type>; auto tp = system_clock::now().time_since_epoch(); tp += minutes(GetTimeZone()); auto d = duration_cast(tp); tp -= d; auto h = duration_cast(tp); tp -= h; auto m = duration_cast(tp); tp -= m; auto s = duration_cast(tp); tp -= s; auto ms = duration_cast(tp); return Format("%02d:%02d:%02d:%03d", (int)h.count(), (int)m.count(), (int)s.count(), (int)ms.count()); } Stream& Upp::operator<<(Stream& s, Logger::LoggingLevel level) { switch(level) { case (Logger::LoggingLevel::DEBUG): return s << "DEBUG"; case (Logger::LoggingLevel::INFO): return s << "INFO "; case (Logger::LoggingLevel::WARN): return s << "WARN "; case (Logger::LoggingLevel::ERROR_LEVEL): return s << "ERROR"; case (Logger::LoggingLevel::NONE): return s << "NONE "; } return s; }