50 const std::string_view formatted_message) {
52 event.timestamp = msg.time;
53 const auto level_sv = spdlog::level::to_string_view(msg.level);
54 event.level.assign(level_sv.data(), level_sv.size());
55 event.channel.assign(msg.logger_name.data(), msg.logger_name.size());
56 event.thread_id =
static_cast<std::uint64_t
>(msg.thread_id);
58 event.process_id = pid;
60 if (msg.source.filename !=
nullptr && msg.source.filename[0] !=
'\0') {
61 event.file = msg.source.filename;
62 event.line =
static_cast<int>(msg.source.line);
63 if (msg.source.funcname !=
nullptr) {
64 event.function = msg.source.funcname;
67 event.message.assign(formatted_message.data(), formatted_message.size());
79 using listener_t = std::function<void(
const LogEvent&)>;
80 using listener_id = std::uint64_t;
84 listener_id add_listener(listener_t listener) {
85 const std::scoped_lock lock(listeners_mutex_);
86 const auto id = ++listener_id_gen_;
87 listeners_.emplace(
id, std::move(listener));
91 bool remove_listener(
const listener_id
id) {
92 const std::scoped_lock lock(listeners_mutex_);
93 return listeners_.erase(
id) > 0;
96 void clear_listeners() {
97 const std::scoped_lock lock(listeners_mutex_);
103 const std::scoped_lock lock(listeners_mutex_);
104 return listeners_.size();
108 void sink_it_(
const spdlog::details::log_msg& msg)
override {
109 spdlog::memory_buf_t formatted;
110 this->formatter_->format(msg, formatted);
112 detail::make_log_event(msg, std::string_view(formatted.data(), formatted.size()));
114 std::vector<listener_t> snapshot;
116 const std::scoped_lock lock(listeners_mutex_);
117 snapshot.reserve(listeners_.size());
118 for (
const auto& l : listeners_ | std::views::values) {
119 snapshot.push_back(l);
123 for (
auto& listener : snapshot) {
126 }
catch (
const std::exception& e) {
128 std::cerr <<
"logman: listener threw " <<
typeid(e).name() <<
": " << e.what()
135 std::cerr <<
"logman: listener threw non-std::exception\n";
141 void flush_()
override {}
144 std::atomic<listener_id> listener_id_gen_{0};
145 std::unordered_map<listener_id, listener_t> listeners_;
146 mutable std::mutex listeners_mutex_;
LogEvent make_log_event(const spdlog::details::log_msg &msg, const std::string_view formatted_message)
Build a LogEvent from a spdlog log_msg.
Definition listener_sink.hpp:49