50 lines
1.5 KiB
C++
50 lines
1.5 KiB
C++
#include "logger.hpp"
|
|
#include <mutex>
|
|
#include <unistd.h>
|
|
#include <sys/time.h>
|
|
#include <ctime>
|
|
#include <iomanip>
|
|
|
|
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<std::mutex> 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<sc::io::trgb&>(*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) << "] ";
|
|
}
|