Common System 0.2.0
Common interfaces and patterns for system integration
Loading...
Searching...
No Matches
kcenon::common::interfaces::GlobalLoggerRegistry Class Reference

Thread-safe singleton registry for managing logger instances. More...

#include <global_logger_registry.h>

Inheritance diagram for kcenon::common::interfaces::GlobalLoggerRegistry:
Inheritance graph
Collaboration diagram for kcenon::common::interfaces::GlobalLoggerRegistry:
Collaboration graph

Public Member Functions

 GlobalLoggerRegistry (const GlobalLoggerRegistry &)=delete
 
GlobalLoggerRegistryoperator= (const GlobalLoggerRegistry &)=delete
 
 GlobalLoggerRegistry (GlobalLoggerRegistry &&)=delete
 
GlobalLoggerRegistryoperator= (GlobalLoggerRegistry &&)=delete
 
VoidResult register_logger (const std::string &name, std::shared_ptr< ILogger > logger) override
 Register a logger with a name.
 
std::shared_ptr< ILoggerget_logger (const std::string &name) override
 Get a logger by name.
 
VoidResult unregister_logger (const std::string &name) override
 Remove a logger by name.
 
std::shared_ptr< ILoggerget_default_logger () override
 Get the default logger.
 
VoidResult set_default_logger (std::shared_ptr< ILogger > logger) override
 Set the default logger.
 
VoidResult register_factory (const std::string &name, LoggerFactory factory)
 Register a factory for lazy logger creation.
 
VoidResult set_default_factory (LoggerFactory factory)
 Set a factory for the default logger.
 
bool has_logger (const std::string &name) const
 Check if a logger is registered.
 
bool has_default_logger () const
 Check if a default logger is available.
 
void clear ()
 Clear all registered loggers and factories.
 
size_t size () const
 Get the number of registered loggers.
 
void freeze ()
 Freeze the registry to prevent further modifications.
 
bool is_frozen () const
 Check if the registry is frozen.
 
- Public Member Functions inherited from kcenon::common::interfaces::ILoggerRegistry
virtual ~ILoggerRegistry ()=default
 
virtual ~ILoggerRegistry ()=default
 

Static Public Member Functions

static GlobalLoggerRegistryinstance ()
 Get the singleton instance of GlobalLoggerRegistry.
 
static std::shared_ptr< ILoggernull_logger ()
 Get the shared NullLogger instance.
 

Private Member Functions

 GlobalLoggerRegistry ()=default
 
 ~GlobalLoggerRegistry ()=default
 
std::shared_ptr< ILoggercreate_from_factory (const std::string &name)
 Create logger from factory if available.
 
std::shared_ptr< ILoggercreate_default_from_factory ()
 Create default logger from factory if available.
 

Private Attributes

std::shared_mutex mutex_
 
std::unordered_map< std::string, std::shared_ptr< ILogger > > loggers_
 
std::unordered_map< std::string, LoggerFactoryfactories_
 
std::shared_ptr< ILoggerdefault_logger_
 
LoggerFactory default_factory_
 
std::atomic< bool > frozen_ {false}
 

Detailed Description

Thread-safe singleton registry for managing logger instances.

GlobalLoggerRegistry implements the ILoggerRegistry interface and provides:

  • Thread-safe registration and retrieval of named loggers
  • Default logger management
  • Factory-based lazy initialization for deferred logger creation
  • NullLogger fallback for unregistered logger requests

This class resolves the circular dependency between thread_system and logger_system by providing a centralized, decoupled logging registry that can be accessed from any subsystem without creating direct dependencies.

Usage Example:

// Get the global registry
auto& registry = GlobalLoggerRegistry::instance();
// Register a default logger
auto logger = std::make_shared<MyLogger>();
registry.set_default_logger(logger);
// Register a named logger
registry.register_logger("network", network_logger);
// Retrieve loggers
auto default_log = registry.get_default_logger();
auto network_log = registry.get_logger("network");
// Use factory for lazy initialization
registry.register_factory("database", []() {
return std::make_shared<DatabaseLogger>();
});
static GlobalLoggerRegistry & instance()
Get the singleton instance of GlobalLoggerRegistry.

Definition at line 128 of file global_logger_registry.h.

Constructor & Destructor Documentation

◆ GlobalLoggerRegistry() [1/3]

kcenon::common::interfaces::GlobalLoggerRegistry::GlobalLoggerRegistry ( const GlobalLoggerRegistry & )
delete

◆ GlobalLoggerRegistry() [2/3]

kcenon::common::interfaces::GlobalLoggerRegistry::GlobalLoggerRegistry ( GlobalLoggerRegistry && )
delete

◆ GlobalLoggerRegistry() [3/3]

kcenon::common::interfaces::GlobalLoggerRegistry::GlobalLoggerRegistry ( )
privatedefault

Referenced by instance().

Here is the caller graph for this function:

◆ ~GlobalLoggerRegistry()

kcenon::common::interfaces::GlobalLoggerRegistry::~GlobalLoggerRegistry ( )
privatedefault

Member Function Documentation

◆ clear()

void kcenon::common::interfaces::GlobalLoggerRegistry::clear ( )
inline

Clear all registered loggers and factories.

Removes all registered loggers, factories, and the default logger. Useful for testing or application shutdown.

Definition at line 643 of file global_logger_registry.h.

643 {
644 if (is_frozen()) {
645 RegistryAuditLog::log_event(registry_event(
648 "Registry is frozen"));
649 // Silently ignore clear when frozen to maintain API compatibility
650 return;
651 }
652
653 std::unique_lock lock(mutex_);
654 loggers_.clear();
655 factories_.clear();
656 default_logger_.reset();
657 default_factory_ = nullptr;
658
659 RegistryAuditLog::log_event(registry_event(
662}
bool is_frozen() const
Check if the registry is frozen.
std::unordered_map< std::string, std::shared_ptr< ILogger > > loggers_
std::unordered_map< std::string, LoggerFactory > factories_
static void log_event(const registry_event &event)
Log a registry event.
static constexpr source_location current(const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE()) noexcept

References kcenon::common::interfaces::clear_loggers, kcenon::common::source_location::current(), default_factory_, default_logger_, factories_, is_frozen(), kcenon::common::interfaces::RegistryAuditLog::log_event(), loggers_, and mutex_.

Referenced by kcenon::common::bootstrap::SystemBootstrapper::clear_loggers().

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

◆ create_default_from_factory()

std::shared_ptr< ILogger > kcenon::common::interfaces::GlobalLoggerRegistry::create_default_from_factory ( )
inlineprivate

Create default logger from factory if available.

Returns
Logger instance or nullptr if no factory

Definition at line 707 of file global_logger_registry.h.

707 {
708 std::unique_lock lock(mutex_);
709
710 // Check again under write lock
711 if (default_logger_) {
712 return default_logger_;
713 }
714
715 if (!default_factory_) {
716 return nullptr;
717 }
718
719 // Create logger from factory
720 auto logger = default_factory_();
721 if (logger) {
722 default_logger_ = logger;
723 default_factory_ = nullptr;
724 }
725
726 return logger;
727}

References default_factory_, default_logger_, and mutex_.

Referenced by get_default_logger().

Here is the caller graph for this function:

◆ create_from_factory()

std::shared_ptr< ILogger > kcenon::common::interfaces::GlobalLoggerRegistry::create_from_factory ( const std::string & name)
inlineprivate

Create logger from factory if available.

Internal helper that creates a logger using a registered factory and stores it in the logger map.

Parameters
nameLogger name
lockReference to held read lock (will be upgraded if needed)
Returns
Logger instance or nullptr if no factory

Definition at line 681 of file global_logger_registry.h.

682 {
683
684 std::unique_lock lock(mutex_);
685
686 // Check again under write lock
687 auto logger_it = loggers_.find(name);
688 if (logger_it != loggers_.end()) {
689 return logger_it->second;
690 }
691
692 auto factory_it = factories_.find(name);
693 if (factory_it == factories_.end()) {
694 return nullptr;
695 }
696
697 // Create logger from factory
698 auto logger = factory_it->second();
699 if (logger) {
700 loggers_[name] = logger;
701 factories_.erase(factory_it);
702 }
703
704 return logger;
705}

References factories_, loggers_, and mutex_.

Referenced by get_logger().

Here is the caller graph for this function:

◆ freeze()

void kcenon::common::interfaces::GlobalLoggerRegistry::freeze ( )
inline

Freeze the registry to prevent further modifications.

Once frozen, the registry cannot be modified (no registrations, unregistrations, or clears allowed). This is a one-way operation and cannot be undone.

Note
This should be called after system initialization to prevent unauthorized logger swapping which could be used to suppress security audit logs.
This is a security feature to prevent audit log tampering.
See also
Issue #206 for security requirements.

Definition at line 669 of file global_logger_registry.h.

669 {
670 frozen_.store(true, std::memory_order_release);
671
672 RegistryAuditLog::log_event(registry_event(
675}
@ freeze_logger_registry
Freeze logger registry.

References kcenon::common::source_location::current(), kcenon::common::interfaces::freeze_logger_registry, frozen_, and kcenon::common::interfaces::RegistryAuditLog::log_event().

Referenced by kcenon::common::bootstrap::SystemBootstrapper::initialize().

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

◆ get_default_logger()

std::shared_ptr< ILogger > kcenon::common::interfaces::GlobalLoggerRegistry::get_default_logger ( )
inlineoverridevirtual

Get the default logger.

Returns the default logger instance. If no default logger is set, returns a NullLogger instance.

Returns
Default logger instance or NullLogger

Implements kcenon::common::interfaces::ILoggerRegistry.

Definition at line 463 of file global_logger_registry.h.

463 {
464 // First, try to get existing default logger with read lock
465 {
466 std::shared_lock lock(mutex_);
467 if (default_logger_) {
468 return default_logger_;
469 }
470 }
471
472 // Try to create from factory
473 auto logger = create_default_from_factory();
474 if (logger) {
475 return logger;
476 }
477
478 // Return NullLogger as fallback
479 return null_logger();
480}
std::shared_ptr< ILogger > create_default_from_factory()
Create default logger from factory if available.
static std::shared_ptr< ILogger > null_logger()
Get the shared NullLogger instance.

References create_default_from_factory(), default_logger_, mutex_, and null_logger().

Referenced by kcenon::common::interfaces::get_logger().

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

◆ get_logger()

std::shared_ptr< ILogger > kcenon::common::interfaces::GlobalLoggerRegistry::get_logger ( const std::string & name)
inlineoverridevirtual

Get a logger by name.

Retrieves a logger registered under the specified name. If no logger is registered with that name but a factory exists, the factory will be invoked to create the logger (lazy initialization).

If no logger or factory is registered, returns a NullLogger instance.

Parameters
nameLogger name (case-sensitive)
Returns
Logger instance or NullLogger if not found

Implements kcenon::common::interfaces::ILoggerRegistry.

Definition at line 419 of file global_logger_registry.h.

419 {
420 // First, try to get existing logger with read lock
421 {
422 std::shared_lock lock(mutex_);
423 auto it = loggers_.find(name);
424 if (it != loggers_.end()) {
425 return it->second;
426 }
427 }
428
429 // Try to create from factory
430 auto logger = create_from_factory(name);
431 if (logger) {
432 return logger;
433 }
434
435 // Return NullLogger as fallback
436 return null_logger();
437}
std::shared_ptr< ILogger > create_from_factory(const std::string &name)
Create logger from factory if available.

References create_from_factory(), loggers_, mutex_, and null_logger().

Referenced by kcenon::common::interfaces::get_logger().

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

◆ has_default_logger()

bool kcenon::common::interfaces::GlobalLoggerRegistry::has_default_logger ( ) const
inline

Check if a default logger is available.

Checks if a default logger or factory is registered.

Returns
true if a default logger or factory is available

Definition at line 638 of file global_logger_registry.h.

638 {
639 std::shared_lock lock(mutex_);
640 return default_logger_ != nullptr || default_factory_ != nullptr;
641}

References default_factory_, default_logger_, and mutex_.

◆ has_logger()

bool kcenon::common::interfaces::GlobalLoggerRegistry::has_logger ( const std::string & name) const
inline

Check if a logger is registered.

Checks if a logger or factory is registered under the specified name.

Parameters
nameLogger name to check
Returns
true if a logger or factory is registered

Definition at line 632 of file global_logger_registry.h.

632 {
633 std::shared_lock lock(mutex_);
634 return loggers_.find(name) != loggers_.end() ||
635 factories_.find(name) != factories_.end();
636}

References factories_, loggers_, and mutex_.

◆ instance()

GlobalLoggerRegistry & kcenon::common::interfaces::GlobalLoggerRegistry::instance ( )
inlinestatic

Get the singleton instance of GlobalLoggerRegistry.

Returns a reference to the application-wide singleton registry. Thread-safe for concurrent access.

Note
Uses Intentional Leak pattern to avoid Static Destruction Order Fiasco (SDOF). The registry may be accessed during other static objects' destruction, so it must remain valid throughout the entire process lifetime. The leaked memory is reclaimed by the OS at process termination.
Returns
Reference to the GlobalLoggerRegistry singleton

Definition at line 352 of file global_logger_registry.h.

352 {
353 // Intentionally leak to avoid static destruction order issues.
354 // Registry may be accessed during other singletons' destruction.
356 return *instance;
357}

References GlobalLoggerRegistry(), and instance().

Referenced by kcenon::common::bootstrap::SystemBootstrapper::clear_loggers(), kcenon::common::interfaces::get_logger(), kcenon::common::interfaces::get_logger(), kcenon::common::interfaces::get_registry(), kcenon::common::bootstrap::SystemBootstrapper::initialize(), instance(), and kcenon::common::bootstrap::SystemBootstrapper::register_loggers().

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

◆ is_frozen()

bool kcenon::common::interfaces::GlobalLoggerRegistry::is_frozen ( ) const
inline

Check if the registry is frozen.

Returns
true if the registry is frozen and cannot be modified

Definition at line 677 of file global_logger_registry.h.

677 {
678 return frozen_.load(std::memory_order_acquire);
679}

References frozen_.

Referenced by clear(), register_factory(), register_logger(), set_default_factory(), set_default_logger(), and unregister_logger().

Here is the caller graph for this function:

◆ null_logger()

std::shared_ptr< ILogger > kcenon::common::interfaces::GlobalLoggerRegistry::null_logger ( )
inlinestatic

Get the shared NullLogger instance.

Returns the singleton NullLogger instance used as a fallback when no logger is registered.

Note
Uses Intentional Leak pattern to avoid Static Destruction Order Fiasco (SDOF). The NullLogger may be accessed during other static objects' destruction, so it must remain valid throughout the entire process lifetime.
Returns
Shared pointer to NullLogger

Definition at line 359 of file global_logger_registry.h.

359 {
360 // Intentionally leak to avoid static destruction order issues.
361 // NullLogger may be accessed during other singletons' destruction.
362 static auto* null_logger_ptr =
363 new std::shared_ptr<NullLogger>(std::make_shared<NullLogger>());
364 return *null_logger_ptr;
365}

Referenced by get_default_logger(), and get_logger().

Here is the caller graph for this function:

◆ operator=() [1/2]

GlobalLoggerRegistry & kcenon::common::interfaces::GlobalLoggerRegistry::operator= ( const GlobalLoggerRegistry & )
delete

◆ operator=() [2/2]

GlobalLoggerRegistry & kcenon::common::interfaces::GlobalLoggerRegistry::operator= ( GlobalLoggerRegistry && )
delete

◆ register_factory()

VoidResult kcenon::common::interfaces::GlobalLoggerRegistry::register_factory ( const std::string & name,
LoggerFactory factory )
inline

Register a factory for lazy logger creation.

Registers a factory function that will be invoked when a logger with the specified name is first requested. This enables deferred initialization of loggers.

Parameters
nameLogger name (case-sensitive)
factoryFactory function that creates the logger
Returns
VoidResult indicating success or error

Definition at line 519 of file global_logger_registry.h.

521 {
522
523 if (is_frozen()) {
524 RegistryAuditLog::log_event(registry_event(
527 "Registry is frozen"));
530 "Cannot register factory: registry is frozen",
531 "interfaces::GlobalLoggerRegistry"
532 );
533 }
534
535 if (name.empty()) {
536 RegistryAuditLog::log_event(registry_event(
539 "Logger name cannot be empty"));
542 "Logger name cannot be empty",
543 "interfaces::GlobalLoggerRegistry"
544 );
545 }
546
547 if (!factory) {
548 RegistryAuditLog::log_event(registry_event(
551 "Factory function cannot be null"));
554 "Factory function cannot be null",
555 "interfaces::GlobalLoggerRegistry"
556 );
557 }
558
559 std::unique_lock lock(mutex_);
560
561 // Only register factory if no logger already exists
562 if (loggers_.find(name) != loggers_.end()) {
563 RegistryAuditLog::log_event(registry_event(
566 "Logger already registered with name: " + name));
569 "Logger already registered with name: " + name,
570 "interfaces::GlobalLoggerRegistry"
571 );
572 }
573
574 factories_[name] = std::move(factory);
575
576 RegistryAuditLog::log_event(registry_event(
579
580 return VoidResult::ok({});
581}
static Result< T > ok(U &&value)
Create a successful result with value (static factory)
Definition core.h:223
constexpr int REGISTRY_FROZEN
Definition compat.h:41
constexpr int ALREADY_EXISTS
Definition compat.h:37
constexpr int INVALID_ARGUMENT
Definition compat.h:31
@ register_factory
Factory registration (logger)
Result< T > make_error(int code, const std::string &message, const std::string &module="")
Create an error result with code and message.
Definition utilities.h:91

References kcenon::common::error_codes::ALREADY_EXISTS, kcenon::common::source_location::current(), factories_, kcenon::common::error_codes::INVALID_ARGUMENT, is_frozen(), kcenon::common::interfaces::RegistryAuditLog::log_event(), loggers_, kcenon::common::make_error(), mutex_, kcenon::common::Result< T >::ok(), kcenon::common::interfaces::register_factory, and kcenon::common::error_codes::REGISTRY_FROZEN.

Here is the call graph for this function:

◆ register_logger()

VoidResult kcenon::common::interfaces::GlobalLoggerRegistry::register_logger ( const std::string & name,
std::shared_ptr< ILogger > logger )
inlineoverridevirtual

Register a logger with a name.

Registers a logger instance under the specified name. If a logger with the same name already exists, it will be replaced.

Parameters
nameLogger name (case-sensitive)
loggerLogger instance to register
Returns
VoidResult indicating success or error

Implements kcenon::common::interfaces::ILoggerRegistry.

Definition at line 367 of file global_logger_registry.h.

369 {
370
371 if (is_frozen()) {
372 RegistryAuditLog::log_event(registry_event(
375 "Registry is frozen"));
378 "Cannot register logger: registry is frozen",
379 "interfaces::GlobalLoggerRegistry"
380 );
381 }
382
383 if (name.empty()) {
384 RegistryAuditLog::log_event(registry_event(
387 "Logger name cannot be empty"));
390 "Logger name cannot be empty",
391 "interfaces::GlobalLoggerRegistry"
392 );
393 }
394
395 if (!logger) {
396 RegistryAuditLog::log_event(registry_event(
399 "Logger instance cannot be null"));
402 "Logger instance cannot be null",
403 "interfaces::GlobalLoggerRegistry"
404 );
405 }
406
407 std::unique_lock lock(mutex_);
408 loggers_[name] = std::move(logger);
409 // Remove factory if one exists for this name (logger takes precedence)
410 factories_.erase(name);
411
412 RegistryAuditLog::log_event(registry_event(
415
416 return VoidResult::ok({});
417}

References kcenon::common::source_location::current(), factories_, kcenon::common::error_codes::INVALID_ARGUMENT, is_frozen(), kcenon::common::interfaces::RegistryAuditLog::log_event(), loggers_, kcenon::common::make_error(), mutex_, kcenon::common::Result< T >::ok(), kcenon::common::interfaces::register_logger, and kcenon::common::error_codes::REGISTRY_FROZEN.

Here is the call graph for this function:

◆ set_default_factory()

VoidResult kcenon::common::interfaces::GlobalLoggerRegistry::set_default_factory ( LoggerFactory factory)
inline

Set a factory for the default logger.

Registers a factory function for creating the default logger. The factory will be invoked when get_default_logger() is called and no default logger has been set.

Parameters
factoryFactory function that creates the default logger
Returns
VoidResult indicating success or error

Definition at line 583 of file global_logger_registry.h.

583 {
584 if (is_frozen()) {
585 RegistryAuditLog::log_event(registry_event(
588 "Registry is frozen"));
591 "Cannot set default factory: registry is frozen",
592 "interfaces::GlobalLoggerRegistry"
593 );
594 }
595
596 if (!factory) {
597 RegistryAuditLog::log_event(registry_event(
600 "Factory function cannot be null"));
603 "Factory function cannot be null",
604 "interfaces::GlobalLoggerRegistry"
605 );
606 }
607
608 std::unique_lock lock(mutex_);
609
610 // Only set factory if no default logger exists
611 if (default_logger_) {
612 RegistryAuditLog::log_event(registry_event(
615 "Default logger already registered"));
618 "Default logger already registered",
619 "interfaces::GlobalLoggerRegistry"
620 );
621 }
622
623 default_factory_ = std::move(factory);
624
625 RegistryAuditLog::log_event(registry_event(
628
629 return VoidResult::ok({});
630}
@ set_default_factory
Default factory set (logger)

References kcenon::common::error_codes::ALREADY_EXISTS, kcenon::common::source_location::current(), default_factory_, default_logger_, kcenon::common::error_codes::INVALID_ARGUMENT, is_frozen(), kcenon::common::interfaces::RegistryAuditLog::log_event(), kcenon::common::make_error(), mutex_, kcenon::common::Result< T >::ok(), kcenon::common::error_codes::REGISTRY_FROZEN, and kcenon::common::interfaces::set_default_factory.

Here is the call graph for this function:

◆ set_default_logger()

VoidResult kcenon::common::interfaces::GlobalLoggerRegistry::set_default_logger ( std::shared_ptr< ILogger > logger)
inlineoverridevirtual

Set the default logger.

Sets the default logger instance. The default logger is used when no specific logger name is provided.

Parameters
loggerLogger instance to set as default
Returns
VoidResult indicating success or error

Implements kcenon::common::interfaces::ILoggerRegistry.

Definition at line 482 of file global_logger_registry.h.

482 {
483 if (is_frozen()) {
484 RegistryAuditLog::log_event(registry_event(
487 "Registry is frozen"));
490 "Cannot set default logger: registry is frozen",
491 "interfaces::GlobalLoggerRegistry"
492 );
493 }
494
495 if (!logger) {
496 RegistryAuditLog::log_event(registry_event(
499 "Default logger instance cannot be null"));
502 "Default logger instance cannot be null",
503 "interfaces::GlobalLoggerRegistry"
504 );
505 }
506
507 std::unique_lock lock(mutex_);
508 default_logger_ = std::move(logger);
509 // Clear factory since we have a concrete instance
510 default_factory_ = nullptr;
511
512 RegistryAuditLog::log_event(registry_event(
515
516 return VoidResult::ok({});
517}

References kcenon::common::source_location::current(), default_factory_, default_logger_, kcenon::common::error_codes::INVALID_ARGUMENT, is_frozen(), kcenon::common::interfaces::RegistryAuditLog::log_event(), kcenon::common::make_error(), mutex_, kcenon::common::Result< T >::ok(), kcenon::common::error_codes::REGISTRY_FROZEN, and kcenon::common::interfaces::set_default_logger.

Here is the call graph for this function:

◆ size()

size_t kcenon::common::interfaces::GlobalLoggerRegistry::size ( ) const
inline

Get the number of registered loggers.

Returns the count of registered named loggers (not including the default logger).

Returns
Number of registered loggers

Definition at line 664 of file global_logger_registry.h.

664 {
665 std::shared_lock lock(mutex_);
666 return loggers_.size() + factories_.size();
667}

References factories_, loggers_, and mutex_.

◆ unregister_logger()

VoidResult kcenon::common::interfaces::GlobalLoggerRegistry::unregister_logger ( const std::string & name)
inlineoverridevirtual

Remove a logger by name.

Unregisters a logger from the registry. Also removes any associated factory if present.

Parameters
nameLogger name
Returns
VoidResult indicating success (success even if not found)

Implements kcenon::common::interfaces::ILoggerRegistry.

Definition at line 439 of file global_logger_registry.h.

439 {
440 if (is_frozen()) {
441 RegistryAuditLog::log_event(registry_event(
444 "Registry is frozen"));
447 "Cannot unregister logger: registry is frozen",
448 "interfaces::GlobalLoggerRegistry"
449 );
450 }
451
452 std::unique_lock lock(mutex_);
453 loggers_.erase(name);
454 factories_.erase(name);
455
456 RegistryAuditLog::log_event(registry_event(
459
460 return VoidResult::ok({});
461}

References kcenon::common::source_location::current(), factories_, is_frozen(), kcenon::common::interfaces::RegistryAuditLog::log_event(), loggers_, kcenon::common::make_error(), mutex_, kcenon::common::Result< T >::ok(), kcenon::common::error_codes::REGISTRY_FROZEN, and kcenon::common::interfaces::unregister_logger.

Here is the call graph for this function:

Member Data Documentation

◆ default_factory_

LoggerFactory kcenon::common::interfaces::GlobalLoggerRegistry::default_factory_
private

◆ default_logger_

std::shared_ptr<ILogger> kcenon::common::interfaces::GlobalLoggerRegistry::default_logger_
private

◆ factories_

std::unordered_map<std::string, LoggerFactory> kcenon::common::interfaces::GlobalLoggerRegistry::factories_
private

◆ frozen_

std::atomic<bool> kcenon::common::interfaces::GlobalLoggerRegistry::frozen_ {false}
private

Definition at line 345 of file global_logger_registry.h.

345{false};

Referenced by freeze(), and is_frozen().

◆ loggers_

std::unordered_map<std::string, std::shared_ptr<ILogger> > kcenon::common::interfaces::GlobalLoggerRegistry::loggers_
private

◆ mutex_


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