pairinteraction
A Rydberg Interaction Calculator
LoggerBridge.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025 Pairinteraction Developers
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
4#include "./LoggerBridge.hpp"
5
7
8#include <filesystem>
9#include <fmt/core.h>
10#include <memory>
11#include <spdlog/async.h>
12#include <spdlog/sinks/base_sink.h>
13#include <spdlog/sinks/rotating_file_sink.h>
14#include <spdlog/spdlog.h>
15#include <string>
16#include <vector>
17
18using namespace pairinteraction;
19
20LoggerBridge::QueueSink::QueueSink(LoggerBridge *parent) : parent(parent) {}
21
22void LoggerBridge::QueueSink::sink_it_(const spdlog::details::log_msg &msg) {
23 spdlog::memory_buf_t buf;
24 this->formatter_->format(msg, buf);
25 std::string text = fmt::to_string(buf);
26 LogEntry entry;
27 switch (msg.level) {
28 case spdlog::level::trace:
29 entry.level = 0;
30 break;
31 case spdlog::level::debug:
32 entry.level = 10;
33 break;
34 case spdlog::level::info:
35 entry.level = 20;
36 break;
37 case spdlog::level::warn:
38 entry.level = 30;
39 break;
40 case spdlog::level::err:
41 entry.level = 40;
42 break;
43 case spdlog::level::critical:
44 entry.level = 50;
45 break;
46 default:
47 break;
48 }
49 entry.message = text;
50 parent->log_queue.push(std::move(entry));
51}
52
53void LoggerBridge::QueueSink::flush_() {}
54
57 if (!std::filesystem::exists(logdir)) {
58 std::filesystem::create_directories(logdir);
59 } else if (!std::filesystem::is_directory(logdir)) {
60 throw std::runtime_error("Log path is not a directory.");
61 }
62 std::filesystem::path logfile = logdir / "cpp.log";
63
64 spdlog::init_thread_pool(8192, 1);
65
66 auto queue_sink = std::make_shared<QueueSink>(this);
67 queue_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e %t] [%s:%#] %v");
68
69 auto file_sink =
70 std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logfile.string(), 1048576 * 5, 10);
71 file_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e %t] [%^%l%$] [%s:%#] %v");
72
73 std::vector<spdlog::sink_ptr> sinks{queue_sink, file_sink};
74 auto logger = std::make_shared<spdlog::async_logger>("logger", sinks.begin(), sinks.end(),
75 spdlog::thread_pool(),
76 spdlog::async_overflow_policy::block);
77 logger->set_level(spdlog::level::trace);
78 spdlog::set_default_logger(logger);
79}
80
82 spdlog::shutdown();
83 logger.reset();
84}
85
86std::vector<LoggerBridge::LogEntry> LoggerBridge::get_pending_logs() {
87 std::vector<LogEntry> entries;
88 LogEntry entry;
89 while (log_queue.try_pop(entry)) {
90 entries.push_back(std::move(entry));
91 }
92 return entries;
93}
std::vector< LogEntry > get_pending_logs()
std::filesystem::path get_cache_directory()
Definition: paths.hpp:29