diff --git a/include/spdlog/details/circular_q.h b/include/spdlog/details/circular_q.h index 60b8d157..325dbfea 100644 --- a/include/spdlog/details/circular_q.h +++ b/include/spdlog/details/circular_q.h @@ -77,11 +77,11 @@ public: { if (tail_ >= head_) { - return tail_ - head_; + return tail_ - head_; } else { - return max_items_ - (head_ - tail_ ); + return max_items_ - (head_ - tail_); } } @@ -90,7 +90,7 @@ public: const T &at(size_t i) const { assert(i < size()); - return v_[(head_+ i) % max_items_]; + return v_[(head_ + i) % max_items_]; } // Pop item from front. diff --git a/include/spdlog/details/log_msg_buffer-inl.h b/include/spdlog/details/log_msg_buffer-inl.h index 0c1d9f35..51f4d5b9 100644 --- a/include/spdlog/details/log_msg_buffer-inl.h +++ b/include/spdlog/details/log_msg_buffer-inl.h @@ -26,9 +26,7 @@ SPDLOG_INLINE log_msg_buffer::log_msg_buffer(const log_msg_buffer &other) update_string_views(); } -SPDLOG_INLINE log_msg_buffer::log_msg_buffer(log_msg_buffer &&other) SPDLOG_NOEXCEPT - : log_msg{other} - , buffer{std::move(other.buffer)} +SPDLOG_INLINE log_msg_buffer::log_msg_buffer(log_msg_buffer &&other) SPDLOG_NOEXCEPT : log_msg{other}, buffer{std::move(other.buffer)} { update_string_views(); } diff --git a/include/spdlog/sinks/ringbuffer_sink-inl.h b/include/spdlog/sinks/ringbuffer_sink-inl.h index d218a975..7f4f48aa 100644 --- a/include/spdlog/sinks/ringbuffer_sink-inl.h +++ b/include/spdlog/sinks/ringbuffer_sink-inl.h @@ -3,20 +3,19 @@ #pragma once -#ifndef SPDLOG_HEADER_ONLY -#include "spdlog/sinks/ringbuffer_sink.h" -#endif +//#ifndef SPDLOG_HEADER_ONLY +//#include "spdlog/sinks/ringbuffer_sink.h" +//#endif #include "spdlog/common.h" -#include "spdlog/details/os.h" namespace spdlog { namespace sinks { template -SPDLOG_INLINE ringbuffer_sink::ringbuffer_sink(size_t buf_size) +SPDLOG_INLINE ringbuffer_sink::ringbuffer_sink(size_t n_items) { - buf_=details::circular_q(buf_size); + buf_ = details::circular_q(n_items); } template @@ -26,18 +25,31 @@ SPDLOG_INLINE void ringbuffer_sink::sink_it_(const details::log_msg &msg) } template -SPDLOG_INLINE std::vector ringbuffer_sink::last(size_t lim) +SPDLOG_INLINE std::vector ringbuffer_sink::formatted_messages(size_t lim) { std::lock_guard lock(base_sink::mutex_); + auto n_items = lim > 0 ? (std::min)(lim, buf_.size()) : buf_.size(); std::vector ret; - ret.reserve(lim); - size_t num=0; - for(size_t i=0; i::formatter_->format(buf_.at(i), formatted); ret.push_back(fmt::to_string(formatted)); - if(lim>0 && num==lim) break; + } + return ret; +} + +template +SPDLOG_INLINE std::vector ringbuffer_sink::raw_messages(size_t lim) +{ + std::lock_guard lock(base_sink::mutex_); + auto n_items = lim > 0 ? (std::min)(lim, buf_.size()) : buf_.size(); + std::vector ret; + ret.reserve(n_items); + for (size_t i = 0; i < n_items; i++) + { + ret.push_back(buf_.at(i)); } return ret; } diff --git a/include/spdlog/sinks/ringbuffer_sink.h b/include/spdlog/sinks/ringbuffer_sink.h index a5933744..ee6ef555 100644 --- a/include/spdlog/sinks/ringbuffer_sink.h +++ b/include/spdlog/sinks/ringbuffer_sink.h @@ -3,9 +3,7 @@ #pragma once -#include "spdlog/details/null_mutex.h" #include "spdlog/sinks/base_sink.h" -#include "spdlog/details/synchronous_factory.h" #include "spdlog/details/circular_q.h" #include "spdlog/details/log_msg_buffer.h" @@ -22,15 +20,47 @@ template class ringbuffer_sink final : public base_sink { public: - explicit ringbuffer_sink(size_t buf_size); - std::vector last(size_t lim=0); + explicit ringbuffer_sink(size_t n_items) + : q_{n_items} + {} + + std::vector last_raw(size_t lim = 0) + { + std::lock_guard lock(base_sink::mutex_); + auto n_items = lim > 0 ? (std::min)(lim, q_.size()) : q_.size(); + std::vector ret; + ret.reserve(n_items); + for (size_t i = 0; i < n_items; i++) + { + ret.push_back(q_.at(i)); + } + return ret; + } + + std::vector last_formatted(size_t lim = 0) + { + std::lock_guard lock(base_sink::mutex_); + auto n_items = lim > 0 ? (std::min)(lim, q_.size()) : q_.size(); + std::vector ret; + ret.reserve(n_items); + for (size_t i = 0; i < n_items; i++) + { + memory_buf_t formatted; + base_sink::formatter_->format(q_.at(i), formatted); + ret.push_back(fmt::to_string(formatted)); + } + return ret; + } protected: - void sink_it_(const details::log_msg &msg) override; - void flush_() override {}; + void sink_it_(const details::log_msg &msg) override + { + q_.push_back(details::log_msg_buffer{msg}); + } + void flush_() override {} private: - details::circular_q buf_; + details::circular_q q_; }; using ringbuffer_sink_mt = ringbuffer_sink; @@ -38,23 +68,4 @@ using ringbuffer_sink_st = ringbuffer_sink; } // namespace sinks -// -// factory functions -// -template -inline std::shared_ptr basic_logger_mt(const std::string &logger_name, size_t buf_size) -{ - return Factory::template create(logger_name, buf_size); -} - -template -inline std::shared_ptr basic_logger_st(const std::string &logger_name, size_t buf_size) -{ - return Factory::template create(logger_name, buf_size); -} - } // namespace spdlog - -#ifdef SPDLOG_HEADER_ONLY -#include "ringbuffer_sink-inl.h" -#endif