Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
kcenon::logger::queued_writer_base< Container > Class Template Reference

Abstract base class for queue-based log writers. More...

#include <queued_writer_base.h>

Inheritance diagram for kcenon::logger::queued_writer_base< Container >:
Inheritance graph
Collaboration diagram for kcenon::logger::queued_writer_base< Container >:
Collaboration graph

Public Member Functions

 queued_writer_base (std::unique_ptr< log_writer_interface > wrapped_writer, std::size_t max_queue_size, std::string_view decorator_name)
 Constructor for queued writer base.
 
 ~queued_writer_base () override=default
 Virtual destructor.
 
bool is_healthy () const override
 Check if the writer is healthy.
 
std::size_t get_queue_size () const
 Get the current queue size.
 
std::size_t get_max_queue_size () const
 Get maximum queue size.
 
- Public Member Functions inherited from kcenon::logger::decorator_writer_base
 decorator_writer_base (std::unique_ptr< log_writer_interface > wrapped, std::string_view decorator_name)
 Construct a decorator writer base.
 
 ~decorator_writer_base () override=default
 Virtual destructor for proper cleanup.
 
 decorator_writer_base (const decorator_writer_base &)=delete
 
decorator_writer_baseoperator= (const decorator_writer_base &)=delete
 
 decorator_writer_base (decorator_writer_base &&) noexcept=default
 
decorator_writer_baseoperator= (decorator_writer_base &&) noexcept=default
 
common::VoidResult write (const log_entry &entry) override=0
 Write a log entry (must be implemented by derived classes)
 
common::VoidResult flush () override
 Flush the wrapped writer.
 
std::string get_name () const override
 Get the name of this writer.
 
const log_writer_interfaceget_wrapped_writer () const noexcept
 Get the wrapped writer (const version)
 
- Public Member Functions inherited from kcenon::logger::log_writer_interface
virtual ~log_writer_interface ()=default
 
virtual common::VoidResult close ()
 Close the writer and release resources.
 
virtual auto is_open () const -> bool
 Check if writer is open and ready.
 

Protected Member Functions

common::VoidResult try_enqueue (const log_entry &entry)
 Try to enqueue an entry with overflow protection.
 
virtual common::VoidResult handle_overflow (const log_entry &)
 Handle queue overflow condition.
 
virtual void on_entry_enqueued ()
 Called after an entry is successfully enqueued.
 
- Protected Member Functions inherited from kcenon::logger::decorator_writer_base
log_writer_interfacewrapped () noexcept
 Access the wrapped writer (non-const)
 
const log_writer_interfacewrapped () const noexcept
 Access the wrapped writer (const)
 
const std::string & decorator_name () const noexcept
 Get the decorator name.
 

Static Protected Member Functions

template<typename T >
static std::size_t get_container_size (const std::queue< T > &container)
 Get container size (specialization for std::queue)
 
template<typename T >
static std::size_t get_container_size (const std::vector< T > &container)
 Get container size (specialization for std::vector)
 
template<typename T >
static void enqueue_entry (std::queue< T > &container, const log_entry &entry)
 Enqueue entry (specialization for std::queue)
 
template<typename T >
static void enqueue_entry (std::vector< T > &container, const log_entry &entry)
 Enqueue entry (specialization for std::vector)
 

Protected Attributes

std::size_t max_queue_size_
 
std::mutex queue_mutex_
 
Container queue_
 
std::atomic< bool > shutting_down_
 

Additional Inherited Members

- Static Public Attributes inherited from kcenon::logger::decorator_writer_tag
static constexpr writer_category category = writer_category::decorator
 
- Static Public Attributes inherited from kcenon::logger::async_writer_tag
static constexpr writer_category category = writer_category::asynchronous
 

Detailed Description

template<typename Container>
class kcenon::logger::queued_writer_base< Container >

Abstract base class for queue-based log writers.

This template provides common functionality for writers that accumulate log entries in a queue before processing. Derived classes must implement the queue processing strategy (immediate async vs batched).

Template Parameter:

  • Container: The container type to use for storing entries (e.g., std::queue, std::vector)

Category: Asynchronous (non-blocking), Decorator (wraps another writer)

Definition at line 61 of file queued_writer_base.h.

Constructor & Destructor Documentation

◆ queued_writer_base()

template<typename Container >
kcenon::logger::queued_writer_base< Container >::queued_writer_base ( std::unique_ptr< log_writer_interface > wrapped_writer,
std::size_t max_queue_size,
std::string_view decorator_name )
inlineexplicit

Constructor for queued writer base.

Parameters
wrapped_writerThe underlying writer to delegate writes to
max_queue_sizeMaximum number of entries in the queue
decorator_nameName of the decorator (e.g., "async", "batch")
Exceptions
std::invalid_argumentif wrapped_writer is null

Definition at line 70 of file queued_writer_base.h.

73 : decorator_writer_base(std::move(wrapped_writer), decorator_name)
74 , max_queue_size_(max_queue_size)
75 , shutting_down_(false) {
76 }
const std::string & decorator_name() const noexcept
Get the decorator name.
decorator_writer_base(std::unique_ptr< log_writer_interface > wrapped, std::string_view decorator_name)
Construct a decorator writer base.

◆ ~queued_writer_base()

template<typename Container >
kcenon::logger::queued_writer_base< Container >::~queued_writer_base ( )
overridedefault

Virtual destructor.

Member Function Documentation

◆ enqueue_entry() [1/2]

template<typename Container >
template<typename T >
static void kcenon::logger::queued_writer_base< Container >::enqueue_entry ( std::queue< T > & container,
const log_entry & entry )
inlinestaticprotected

Enqueue entry (specialization for std::queue)

Definition at line 162 of file queued_writer_base.h.

162 {
163 container.push(copy_log_entry(entry));
164 }
log_entry copy_log_entry(const log_entry &entry)
Creates a copy of a log_entry for queue storage.

References kcenon::logger::copy_log_entry().

Referenced by kcenon::logger::queued_writer_base< Container >::try_enqueue().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ enqueue_entry() [2/2]

template<typename Container >
template<typename T >
static void kcenon::logger::queued_writer_base< Container >::enqueue_entry ( std::vector< T > & container,
const log_entry & entry )
inlinestaticprotected

Enqueue entry (specialization for std::vector)

Definition at line 170 of file queued_writer_base.h.

170 {
171 container.push_back(copy_log_entry(entry));
172 }

References kcenon::logger::copy_log_entry().

Here is the call graph for this function:

◆ get_container_size() [1/2]

template<typename Container >
template<typename T >
static std::size_t kcenon::logger::queued_writer_base< Container >::get_container_size ( const std::queue< T > & container)
inlinestaticprotected

Get container size (specialization for std::queue)

Definition at line 146 of file queued_writer_base.h.

146 {
147 return container.size();
148 }

Referenced by kcenon::logger::queued_writer_base< Container >::get_queue_size(), and kcenon::logger::queued_writer_base< Container >::try_enqueue().

Here is the caller graph for this function:

◆ get_container_size() [2/2]

template<typename Container >
template<typename T >
static std::size_t kcenon::logger::queued_writer_base< Container >::get_container_size ( const std::vector< T > & container)
inlinestaticprotected

Get container size (specialization for std::vector)

Definition at line 154 of file queued_writer_base.h.

154 {
155 return container.size();
156 }

◆ get_max_queue_size()

template<typename Container >
std::size_t kcenon::logger::queued_writer_base< Container >::get_max_queue_size ( ) const
inline

Get maximum queue size.

Returns
Maximum allowed queue size

Definition at line 104 of file queued_writer_base.h.

104 {
105 return max_queue_size_;
106 }

References kcenon::logger::queued_writer_base< Container >::max_queue_size_.

◆ get_queue_size()

template<typename Container >
std::size_t kcenon::logger::queued_writer_base< Container >::get_queue_size ( ) const
inline

Get the current queue size.

Returns
Number of entries currently in the queue

Definition at line 95 of file queued_writer_base.h.

95 {
96 std::lock_guard<std::mutex> lock(queue_mutex_);
98 }
static std::size_t get_container_size(const std::queue< T > &container)
Get container size (specialization for std::queue)

References kcenon::logger::queued_writer_base< Container >::get_container_size(), kcenon::logger::queued_writer_base< Container >::queue_, and kcenon::logger::queued_writer_base< Container >::queue_mutex_.

Here is the call graph for this function:

◆ handle_overflow()

template<typename Container >
virtual common::VoidResult kcenon::logger::queued_writer_base< Container >::handle_overflow ( const log_entry & )
inlineprotectedvirtual

Handle queue overflow condition.

Parameters
entryThe entry that couldn't be enqueued
Returns
Error result indicating queue full
Note
Derived classes can override to implement custom overflow policies

Reimplemented in kcenon::logger::async_writer.

Definition at line 132 of file queued_writer_base.h.

132 {
134 }
common::VoidResult make_logger_void_result(logger_error_code code, const std::string &message="")

References kcenon::logger::make_logger_void_result(), and kcenon::logger::queue_full.

Referenced by kcenon::logger::queued_writer_base< Container >::try_enqueue().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_healthy()

template<typename Container >
bool kcenon::logger::queued_writer_base< Container >::is_healthy ( ) const
inlineoverridevirtual

Check if the writer is healthy.

Returns
true if healthy, false otherwise

Reimplemented from kcenon::logger::decorator_writer_base.

Definition at line 87 of file queued_writer_base.h.

87 {
88 return !shutting_down_ && wrapped().is_healthy();
89 }
log_writer_interface & wrapped() noexcept
Access the wrapped writer (non-const)
virtual bool is_healthy() const =0
Check if the writer is healthy.

References kcenon::logger::log_writer_interface::is_healthy(), kcenon::logger::queued_writer_base< Container >::shutting_down_, and kcenon::logger::decorator_writer_base::wrapped().

Here is the call graph for this function:

◆ on_entry_enqueued()

template<typename Container >
virtual void kcenon::logger::queued_writer_base< Container >::on_entry_enqueued ( )
inlineprotectedvirtual

Called after an entry is successfully enqueued.

Note
Derived classes can override to implement notifications (e.g., condition variable)

Reimplemented in kcenon::logger::async_writer.

Definition at line 140 of file queued_writer_base.h.

140{}

Referenced by kcenon::logger::queued_writer_base< Container >::try_enqueue().

Here is the caller graph for this function:

◆ try_enqueue()

template<typename Container >
common::VoidResult kcenon::logger::queued_writer_base< Container >::try_enqueue ( const log_entry & entry)
inlineprotected

Try to enqueue an entry with overflow protection.

Parameters
entryThe log entry to enqueue
Returns
common::VoidResult indicating success or queue_full error

Definition at line 114 of file queued_writer_base.h.

114 {
115 std::lock_guard<std::mutex> lock(queue_mutex_);
116
118 return handle_overflow(entry);
119 }
120
121 enqueue_entry(queue_, entry);
123 return common::ok();
124 }
virtual common::VoidResult handle_overflow(const log_entry &)
Handle queue overflow condition.
virtual void on_entry_enqueued()
Called after an entry is successfully enqueued.
static void enqueue_entry(std::queue< T > &container, const log_entry &entry)
Enqueue entry (specialization for std::queue)
VoidResult ok()

References kcenon::logger::queued_writer_base< Container >::enqueue_entry(), kcenon::logger::queued_writer_base< Container >::get_container_size(), kcenon::logger::queued_writer_base< Container >::handle_overflow(), kcenon::logger::queued_writer_base< Container >::max_queue_size_, kcenon::common::ok(), kcenon::logger::queued_writer_base< Container >::on_entry_enqueued(), kcenon::logger::queued_writer_base< Container >::queue_, and kcenon::logger::queued_writer_base< Container >::queue_mutex_.

Here is the call graph for this function:

Member Data Documentation

◆ max_queue_size_

template<typename Container >
std::size_t kcenon::logger::queued_writer_base< Container >::max_queue_size_
protected

◆ queue_

template<typename Container >
Container kcenon::logger::queued_writer_base< Container >::queue_
protected

◆ queue_mutex_

template<typename Container >
std::mutex kcenon::logger::queued_writer_base< Container >::queue_mutex_
mutableprotected

◆ shutting_down_

template<typename Container >
std::atomic<bool> kcenon::logger::queued_writer_base< Container >::shutting_down_
protected

The documentation for this class was generated from the following file: