c00c2c71ac
* scratch adding histogram to image views Histograms should come from some sort of histogram service. This is currently just a POC. * custom logger implementation w/o spdlog * missing cmake file * fix tests * use operator<< over direct stream exposure * rm print header * add threading test + refactor towards interface libraries omits the need for =target_include_directories= calls /everywhere/ * rm print header * rm constexpr * templated thread_pool * fix doxyfile * default enable doc building * czi reader refactor * rm erroneous include expression * clang-format * single lib include with PUBLIC visibility * compile imgui stdlib * clang format * documentation update centralize `LogLevelToString` to `ILog.hpp` update docs and examples
74 lines
1.8 KiB
C++
74 lines
1.8 KiB
C++
#include "PixelariumLogger.hpp"
|
|
|
|
#include <chrono>
|
|
#include <fstream>
|
|
#include <memory>
|
|
#include <ostream>
|
|
#include <stdexcept>
|
|
|
|
using namespace pixelarium::utils::log;
|
|
|
|
struct PixelariumLogger::LogStream
|
|
{
|
|
LogStream(const std::string& sink)
|
|
{
|
|
out_stream_ = std::ofstream(sink, std::ios::app);
|
|
if (!out_stream_)
|
|
{
|
|
throw std::runtime_error("Failed to open log stream");
|
|
}
|
|
}
|
|
|
|
~LogStream()
|
|
{
|
|
if (out_stream_.is_open())
|
|
{
|
|
out_stream_.close();
|
|
}
|
|
}
|
|
|
|
LogStream& operator<<(const std::string& str)
|
|
{
|
|
this->out_stream_ << str;
|
|
return *this;
|
|
}
|
|
|
|
private:
|
|
std::ofstream out_stream_;
|
|
};
|
|
|
|
PixelariumLogger::PixelariumLogger(const std::string& name, const std::string& file_sink)
|
|
: name_(name), file_sink_(file_sink)
|
|
{
|
|
log_stream_ = std::make_unique<LogStream>(file_sink_);
|
|
}
|
|
|
|
PixelariumLogger::~PixelariumLogger() = default;
|
|
|
|
auto PixelariumLogger::Write(LogLevel lvl, const std::string& msg) const -> void
|
|
{
|
|
if (lvl < this->level_)
|
|
{
|
|
return;
|
|
}
|
|
|
|
auto now = std::chrono::system_clock::now();
|
|
auto time_t = std::chrono::system_clock::to_time_t(now);
|
|
std::tm tm;
|
|
#ifdef _WIN32
|
|
localtime_s(&tm, &time_t);
|
|
#else
|
|
localtime_r(&time_t, &tm);
|
|
#endif
|
|
|
|
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
|
|
|
|
auto timestamp = std::format("{:04}-{:02}-{:02} {:02}:{:02}:{:02}.{:03}", tm.tm_year + 1900, tm.tm_mon + 1,
|
|
tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, ms.count());
|
|
|
|
{
|
|
std::lock_guard<std::mutex> guard(mutex_);
|
|
*log_stream_ << std::format("[{}] [{}] [{}] {}\n", timestamp, name_, LogLevelToString(lvl), msg);
|
|
}
|
|
}
|