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

RAII guard for structured logging context. More...

#include <log_context_scope.h>

Collaboration diagram for kcenon::logger::log_context_scope:
Collaboration graph

Public Member Functions

 log_context_scope (const log_fields &fields)
 Construct scope with initial fields.
 
 log_context_scope (logger &log, const log_fields &fields)
 Construct scope with a logger reference (for logger-level context)
 
 ~log_context_scope ()
 Destructor - restores previous context.
 
 log_context_scope (const log_context_scope &)=delete
 
log_context_scopeoperator= (const log_context_scope &)=delete
 
 log_context_scope (log_context_scope &&)=delete
 
log_context_scopeoperator= (log_context_scope &&)=delete
 

Private Member Functions

void remove_logger_context (const std::string &key)
 

Private Attributes

log_fields previous_context_
 
bool had_previous_
 
std::vector< std::string > added_keys_
 
loggerlogger_ = nullptr
 

Detailed Description

RAII guard for structured logging context.

Automatically sets context fields on construction and restores the previous context on destruction. Supports nested scopes where inner scopes can add or override fields from outer scopes.

Examples
structured_logging_example.cpp.

Definition at line 251 of file log_context_scope.h.

Constructor & Destructor Documentation

◆ log_context_scope() [1/4]

kcenon::logger::log_context_scope::log_context_scope ( const log_fields & fields)
inlineexplicit

Construct scope with initial fields.

Parameters
fieldsContext fields to set for this scope

Saves the current thread-local context and sets the new fields. Fields are merged with existing context (new fields override existing ones with the same key).

Definition at line 261 of file log_context_scope.h.

264 for (const auto& [key, value] : fields) {
265 // Track which keys we're adding (to remove them on destruction)
266 if (previous_context_.find(key) == previous_context_.end()) {
267 added_keys_.push_back(key);
268 }
269 log_context_storage::set(key, value);
270 }
271 }
std::vector< std::string > added_keys_
static void set(const std::string &key, const std::string &value)
Set a string context field for the current thread.
static log_fields get()
Get all context fields for the current thread.
static bool has_context()
Check if any context fields are set for the current thread.

◆ log_context_scope() [2/4]

kcenon::logger::log_context_scope::log_context_scope ( logger & log,
const log_fields & fields )

Construct scope with a logger reference (for logger-level context)

Parameters
logLogger to use for context
fieldsContext fields to set for this scope

Sets context on both the logger (for non-thread-local use) and thread-local storage.

Definition at line 10 of file log_context_scope.cpp.

13 logger_(&log) {
14 for (const auto& [key, value] : fields) {
15 // Track which keys we're adding
16 if (previous_context_.find(key) == previous_context_.end()) {
17 added_keys_.push_back(key);
18 }
19 log_context_storage::set(key, value);
20
21 // Also set on logger for non-thread-local context
22 std::visit([&log, &key](const auto& v) {
23 log.context().set(key, v);
24 }, value);
25 }
26}

References added_keys_, kcenon::logger::logger::context(), previous_context_, kcenon::logger::log_context_storage::set(), and kcenon::logger::unified_log_context::set().

Here is the call graph for this function:

◆ ~log_context_scope()

kcenon::logger::log_context_scope::~log_context_scope ( )
inline

Destructor - restores previous context.

Removes fields that were added by this scope and restores fields that were overridden.

Definition at line 289 of file log_context_scope.h.

289 {
290 // Remove keys that were added by this scope
291 for (const auto& key : added_keys_) {
293 }
294
295 // Restore overridden values from previous context
296 if (had_previous_) {
297 for (const auto& [key, value] : previous_context_) {
298 // Only restore if the key was overridden (not newly added)
299 if (std::find(added_keys_.begin(), added_keys_.end(), key) == added_keys_.end()) {
300 log_context_storage::set(key, value);
301 }
302 }
303 }
304
305 // Clear logger context if we set it
306 if (logger_ != nullptr) {
307 for (const auto& key : added_keys_) {
309 }
310 }
311 }
void remove_logger_context(const std::string &key)
static void remove(const std::string &key)
Remove a context field for the current thread.

◆ log_context_scope() [3/4]

kcenon::logger::log_context_scope::log_context_scope ( const log_context_scope & )
delete

◆ log_context_scope() [4/4]

kcenon::logger::log_context_scope::log_context_scope ( log_context_scope && )
delete

Member Function Documentation

◆ operator=() [1/2]

log_context_scope & kcenon::logger::log_context_scope::operator= ( const log_context_scope & )
delete

◆ operator=() [2/2]

log_context_scope & kcenon::logger::log_context_scope::operator= ( log_context_scope && )
delete

◆ remove_logger_context()

void kcenon::logger::log_context_scope::remove_logger_context ( const std::string & key)
private

Definition at line 28 of file log_context_scope.cpp.

28 {
29 if (logger_ != nullptr) {
30 logger_->context().remove(key);
31 }
32}
unified_log_context & context()
Definition logger.cpp:769
void remove(std::string_view key)
Remove a specific key from the context.

References kcenon::logger::logger::context(), logger_, and kcenon::logger::unified_log_context::remove().

Here is the call graph for this function:

Member Data Documentation

◆ added_keys_

std::vector<std::string> kcenon::logger::log_context_scope::added_keys_
private

Definition at line 324 of file log_context_scope.h.

Referenced by log_context_scope().

◆ had_previous_

bool kcenon::logger::log_context_scope::had_previous_
private

Definition at line 323 of file log_context_scope.h.

◆ logger_

logger* kcenon::logger::log_context_scope::logger_ = nullptr
private

Definition at line 325 of file log_context_scope.h.

Referenced by remove_logger_context().

◆ previous_context_

log_fields kcenon::logger::log_context_scope::previous_context_
private

Definition at line 322 of file log_context_scope.h.

Referenced by log_context_scope().


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