Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
kcenon::logger::logger::impl Class Reference
Collaboration diagram for kcenon::logger::logger::impl:
Collaboration graph

Public Member Functions

 impl (bool async, std::size_t buffer_size, std::unique_ptr< backends::integration_backend > backend)
 
 ~impl ()
 
void dispatch_to_writers (log_level level, const std::string &message, const std::string &file, int line, const std::string &function, const log_entry &entry)
 Dispatch log to writers with routing support.
 

Public Attributes

bool async_mode_
 
std::size_t buffer_size_
 
bool running_
 
bool metrics_enabled_
 
std::atomic< log_level > min_level_
 
std::vector< std::shared_ptr< log_writer_interface > > writers_
 
std::unordered_map< std::string, std::shared_ptr< log_writer_interface > > named_writers_
 
std::shared_mutex writers_mutex_
 
std::unique_ptr< backends::integration_backendbackend_
 
std::unique_ptr< log_collectorcollector_
 
std::unique_ptr< log_filter_interfacefilter_
 
std::shared_mutex filter_mutex_
 
std::unique_ptr< log_routerrouter_
 
std::shared_mutex router_mutex_
 
unified_log_context context_
 
std::unique_ptr< sampling::log_samplersampler_
 
std::shared_mutex sampler_mutex_
 
char emergency_buffer_ [emergency_buffer_size_]
 
std::atomic< size_t > emergency_buffer_used_ {0}
 
std::atomic< int > emergency_fd_ {-1}
 

Static Public Attributes

static constexpr size_t emergency_buffer_size_ = 8192
 

Detailed Description

Definition at line 59 of file logger.cpp.

Constructor & Destructor Documentation

◆ impl()

kcenon::logger::logger::impl::impl ( bool async,
std::size_t buffer_size,
std::unique_ptr< backends::integration_backend > backend )
inline

Definition at line 95 of file logger.cpp.

96 : async_mode_(async), buffer_size_(buffer_size), running_(false), metrics_enabled_(false),
97 min_level_(log_level::info), backend_(std::move(backend)),
98 router_(std::make_unique<log_router>()) {
99 // Reserve space to avoid reallocation during typical usage
100 writers_.reserve(10);
101
102 // Auto-detect backend if not provided
103 // Users can provide thread_system_backend or other backends via constructor
104 if (!backend_) {
105 backend_ = std::make_unique<backends::standalone_backend>();
106 }
107
108 // Initialize backend if required
109 if (backend_->requires_initialization()) {
110 backend_->initialize();
111 }
112
113 // Create log collector for async mode
114 if (async_mode_) {
115 collector_ = std::make_unique<log_collector>(buffer_size_);
116 }
117 }
std::unique_ptr< backends::integration_backend > backend_
Definition logger.cpp:69
std::unique_ptr< log_collector > collector_
Definition logger.cpp:70
std::atomic< log_level > min_level_
Definition logger.cpp:65
std::unique_ptr< log_router > router_
Definition logger.cpp:73
std::vector< std::shared_ptr< log_writer_interface > > writers_
Definition logger.cpp:66

References async_mode_, backend_, buffer_size_, collector_, and writers_.

◆ ~impl()

kcenon::logger::logger::impl::~impl ( )
inline

Definition at line 119 of file logger.cpp.

119 {
120 if (backend_) {
121 backend_->shutdown();
122 }
123 }

References backend_.

Member Function Documentation

◆ dispatch_to_writers()

void kcenon::logger::logger::impl::dispatch_to_writers ( log_level level,
const std::string & message,
const std::string & file,
int line,
const std::string & function,
const log_entry & entry )
inline

Dispatch log to writers with routing support.

Parameters
levelLog level
messageLog message
fileSource file
lineSource line
functionSource function
entryLog entry for routing check

Definition at line 134 of file logger.cpp.

139 {
140#ifdef LOGGER_WITH_ANALYSIS
141 // Real-time analysis if analyzer is set
142 {
143 std::shared_lock<std::shared_mutex> lock(analyzer_mutex_);
144 if (realtime_analyzer_) {
145 analysis::analyzed_log_entry analyzed_entry;
146 analyzed_entry.level = level;
147 analyzed_entry.message = message;
148 analyzed_entry.timestamp = entry.timestamp;
149 analyzed_entry.source_file = file;
150 analyzed_entry.source_line = line;
151 analyzed_entry.function_name = function;
152 realtime_analyzer_->analyze(analyzed_entry);
153 }
154 }
155#endif // LOGGER_WITH_ANALYSIS
156
157 // Check routing rules
158 std::vector<std::string> routed_writer_names;
159 bool is_exclusive = false;
160 {
161 std::shared_lock<std::shared_mutex> lock(router_mutex_);
162 if (router_) {
163 routed_writer_names = router_->get_writers_for_log(entry);
164 is_exclusive = router_->is_exclusive_routing();
165 }
166 }
167
168 auto now = std::chrono::system_clock::now();
169
170 if (is_exclusive) {
171 // Exclusive mode: only send to matched routes
172 // If no routes match, message is dropped (exclusive mode behavior)
173 if (!routed_writer_names.empty()) {
174 std::unordered_map<std::string, std::shared_ptr<log_writer_interface>> local_named_writers;
175 {
176 std::shared_lock<std::shared_mutex> lock(writers_mutex_);
177 local_named_writers = named_writers_;
178 }
179
180 // Create log_entry for routing
181 log_entry entry(level, message, file, line, function, now);
182
183 for (const auto& writer_name : routed_writer_names) {
184 auto it = local_named_writers.find(writer_name);
185 if (it != local_named_writers.end() && it->second) {
186 it->second->write(entry);
187 }
188 }
189 }
190 // No matched routes in exclusive mode = drop message
191 } else {
192 // Non-exclusive mode: send to all writers
193 std::vector<std::shared_ptr<log_writer_interface>> local_writers;
194 {
195 std::shared_lock<std::shared_mutex> lock(writers_mutex_);
196 local_writers = writers_;
197 }
198
199 // Create log_entry once for all writers
200 log_entry entry(level, message, file, line, function, now);
201
202 for (auto& writer : local_writers) {
203 if (writer) {
204 writer->write(entry);
205 }
206 }
207 }
208 }
std::unordered_map< std::string, std::shared_ptr< log_writer_interface > > named_writers_
Definition logger.cpp:67
std::shared_mutex router_mutex_
Definition logger.cpp:74
std::shared_mutex writers_mutex_
Definition logger.cpp:68

References kcenon::logger::analysis::analyzed_log_entry::function_name, kcenon::logger::analysis::analyzed_log_entry::level, kcenon::logger::analysis::analyzed_log_entry::message, named_writers_, router_, router_mutex_, kcenon::logger::analysis::analyzed_log_entry::source_file, kcenon::logger::analysis::analyzed_log_entry::source_line, kcenon::logger::analysis::analyzed_log_entry::timestamp, kcenon::logger::log_entry::timestamp, writers_, and writers_mutex_.

Member Data Documentation

◆ async_mode_

bool kcenon::logger::logger::impl::async_mode_

Definition at line 61 of file logger.cpp.

Referenced by impl().

◆ backend_

std::unique_ptr<backends::integration_backend> kcenon::logger::logger::impl::backend_

Definition at line 69 of file logger.cpp.

Referenced by impl(), and ~impl().

◆ buffer_size_

std::size_t kcenon::logger::logger::impl::buffer_size_

Definition at line 62 of file logger.cpp.

Referenced by impl().

◆ collector_

std::unique_ptr<log_collector> kcenon::logger::logger::impl::collector_

Definition at line 70 of file logger.cpp.

Referenced by impl().

◆ context_

unified_log_context kcenon::logger::logger::impl::context_

Definition at line 83 of file logger.cpp.

◆ emergency_buffer_

char kcenon::logger::logger::impl::emergency_buffer_[emergency_buffer_size_]
mutable

Definition at line 91 of file logger.cpp.

◆ emergency_buffer_size_

size_t kcenon::logger::logger::impl::emergency_buffer_size_ = 8192
staticconstexpr

Definition at line 90 of file logger.cpp.

◆ emergency_buffer_used_

std::atomic<size_t> kcenon::logger::logger::impl::emergency_buffer_used_ {0}

Definition at line 92 of file logger.cpp.

92{0}; // Track how much is used

◆ emergency_fd_

std::atomic<int> kcenon::logger::logger::impl::emergency_fd_ {-1}

Definition at line 93 of file logger.cpp.

93{-1}; // File descriptor for emergency writes

◆ filter_

std::unique_ptr<log_filter_interface> kcenon::logger::logger::impl::filter_

Definition at line 71 of file logger.cpp.

◆ filter_mutex_

std::shared_mutex kcenon::logger::logger::impl::filter_mutex_
mutable

Definition at line 72 of file logger.cpp.

◆ metrics_enabled_

bool kcenon::logger::logger::impl::metrics_enabled_

Definition at line 64 of file logger.cpp.

◆ min_level_

std::atomic<log_level> kcenon::logger::logger::impl::min_level_

Definition at line 65 of file logger.cpp.

◆ named_writers_

std::unordered_map<std::string, std::shared_ptr<log_writer_interface> > kcenon::logger::logger::impl::named_writers_

Definition at line 67 of file logger.cpp.

Referenced by dispatch_to_writers().

◆ router_

std::unique_ptr<log_router> kcenon::logger::logger::impl::router_

Definition at line 73 of file logger.cpp.

Referenced by dispatch_to_writers().

◆ router_mutex_

std::shared_mutex kcenon::logger::logger::impl::router_mutex_
mutable

Definition at line 74 of file logger.cpp.

Referenced by dispatch_to_writers().

◆ running_

bool kcenon::logger::logger::impl::running_

Definition at line 63 of file logger.cpp.

◆ sampler_

std::unique_ptr<sampling::log_sampler> kcenon::logger::logger::impl::sampler_

Definition at line 86 of file logger.cpp.

◆ sampler_mutex_

std::shared_mutex kcenon::logger::logger::impl::sampler_mutex_
mutable

Definition at line 87 of file logger.cpp.

◆ writers_

std::vector<std::shared_ptr<log_writer_interface> > kcenon::logger::logger::impl::writers_

Definition at line 66 of file logger.cpp.

Referenced by dispatch_to_writers(), and impl().

◆ writers_mutex_

std::shared_mutex kcenon::logger::logger::impl::writers_mutex_

Definition at line 68 of file logger.cpp.

Referenced by dispatch_to_writers().


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