// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "spdlog/sinks/daily_file_sink.h" #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/sinks/base_sink.h" #include "spdlog/fmt/bin_to_hex.h" #include "Logger.h" #include "GitInfo.h" Logger::Logger(const std::string &service_name, const std::string &file_name) { std::string variant = ""; #ifdef JFJOCH_USE_CUDA variant += "C"; #endif #ifdef JFJOCH_USE_FFTW variant += "F"; #endif std::vector sinks; sinks.push_back(std::make_shared()); if (!file_name.empty()) sinks.push_back(std::make_shared(file_name, 23, 59)); spdlog_logger = std::make_shared(service_name, std::begin(sinks), std::end(sinks)); if (jfjoch_git_sha1().empty()) spdlog_logger->info("Version {} {}", jfjoch_version(), variant); else spdlog_logger->info("Version {} (git {} {}) {}", jfjoch_version(), jfjoch_git_sha1().substr(0, 6), jfjoch_git_date(), variant); } class LogBufferSink : public spdlog::sinks::base_sink { public: std::vector> lines; protected: void sink_it_(const spdlog::details::log_msg &msg) override { lines.emplace_back(msg.level, std::string(msg.payload.data(), msg.payload.size())); } void flush_() override {} }; Logger::Logger(std::shared_ptr sink) : buffer(std::move(sink)) { spdlog_logger = std::make_shared("buffer", buffer); spdlog_logger->set_level(spdlog::level::trace); // the logger it is replayed into filters } Logger Logger::Buffered() { return Logger(std::make_shared()); } // Called once the work that logged is finished, so nothing is still writing to the buffer. void Logger::ReplayInto(Logger &to) const { for (const auto &[level, line] : buffer->lines) to.spdlog_logger->log(level, line); } void Logger::ErrorException(const std::exception &e) { spdlog_logger->error(e.what()); } Logger &Logger::Verbose(bool input) { if (input) spdlog_logger->set_level(spdlog::level::debug); else spdlog_logger->set_level(spdlog::level::info); return *this; }