#include "logger.hpp" #include #include #include #include #include using namespace sc; std::mutex logger::_mtx; logger::logger(const std::string& name, loglevel level) : _level(level), _name(name) {} void logger::msg(loglevel level, const sc::io::trgb* color, const char* file, int line, const char* func) { if (level >= _level) { std::lock_guard lock {_mtx}; if (_topcall) { write_prefix(level, color, file, line, func); } else { _topcall = true; } std::cerr << std::endl; if (color) { std::cerr << sc::io::reset; } } } void logger::write_prefix(loglevel level, const sc::io::trgb* color, const char* file, int line, const char* func) { // retrieve accurate time for milliseconds display struct timeval secs; (void)::gettimeofday(&secs, nullptr); // create a date/time stamp char dtstamp[20]; std::strftime(dtstamp, 20, "%F %T", std::localtime(&secs.tv_sec)); if (color) { sc::io::rgbf col {sc::io::rgbf(const_cast(*color))}; std::cerr << col; } std::cerr << dtstamp << "." << std::setfill('0') << std::setw(6) << secs.tv_usec << " "; std::cerr << _name << "[" << ::getpid() << "] "; std::cerr << file << ":" << line << " " << func << "() "; std::cerr << '[' << loglevel_desc(level) << "] "; }