Files
m-aXimilian c00c2c71ac
MegaLinter / MegaLinter (push) Has been cancelled
CI Workflow / build-ubuntu (push) Has been cancelled
CI Workflow / build-windows (push) Has been cancelled
CI Workflow / generate-docs (push) Has been cancelled
build system and module refactoring + simple histogram scratch (#20)
* 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
2026-02-16 20:36:48 +01:00

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);
}
}