33#include <shared_mutex>
35#include <unordered_map>
165 std::shared_ptr<ILogger> logger)
override;
179 std::shared_ptr<ILogger>
get_logger(
const std::string& name)
override;
248 bool has_logger(
const std::string& name)
const;
341 std::unordered_map<std::string, std::shared_ptr<ILogger>>
loggers_;
362 static auto* null_logger_ptr =
363 new std::shared_ptr<NullLogger>(std::make_shared<NullLogger>());
364 return *null_logger_ptr;
368 const std::string& name,
369 std::shared_ptr<ILogger> logger) {
375 "Registry is frozen"));
378 "Cannot register logger: registry is frozen",
379 "interfaces::GlobalLoggerRegistry"
387 "Logger name cannot be empty"));
390 "Logger name cannot be empty",
391 "interfaces::GlobalLoggerRegistry"
399 "Logger instance cannot be null"));
402 "Logger instance cannot be null",
403 "interfaces::GlobalLoggerRegistry"
407 std::unique_lock lock(
mutex_);
422 std::shared_lock lock(
mutex_);
444 "Registry is frozen"));
447 "Cannot unregister logger: registry is frozen",
448 "interfaces::GlobalLoggerRegistry"
452 std::unique_lock lock(
mutex_);
466 std::shared_lock lock(
mutex_);
487 "Registry is frozen"));
490 "Cannot set default logger: registry is frozen",
491 "interfaces::GlobalLoggerRegistry"
499 "Default logger instance cannot be null"));
502 "Default logger instance cannot be null",
503 "interfaces::GlobalLoggerRegistry"
507 std::unique_lock lock(
mutex_);
520 const std::string& name,
527 "Registry is frozen"));
530 "Cannot register factory: registry is frozen",
531 "interfaces::GlobalLoggerRegistry"
539 "Logger name cannot be empty"));
542 "Logger name cannot be empty",
543 "interfaces::GlobalLoggerRegistry"
551 "Factory function cannot be null"));
554 "Factory function cannot be null",
555 "interfaces::GlobalLoggerRegistry"
559 std::unique_lock lock(
mutex_);
566 "Logger already registered with name: " + name));
569 "Logger already registered with name: " + name,
570 "interfaces::GlobalLoggerRegistry"
588 "Registry is frozen"));
591 "Cannot set default factory: registry is frozen",
592 "interfaces::GlobalLoggerRegistry"
600 "Factory function cannot be null"));
603 "Factory function cannot be null",
604 "interfaces::GlobalLoggerRegistry"
608 std::unique_lock lock(
mutex_);
615 "Default logger already registered"));
618 "Default logger already registered",
619 "interfaces::GlobalLoggerRegistry"
633 std::shared_lock lock(
mutex_);
639 std::shared_lock lock(
mutex_);
648 "Registry is frozen"));
653 std::unique_lock lock(
mutex_);
665 std::shared_lock lock(
mutex_);
670 frozen_.store(
true, std::memory_order_release);
678 return frozen_.load(std::memory_order_acquire);
682 const std::string& name) {
684 std::unique_lock lock(
mutex_);
687 auto logger_it =
loggers_.find(name);
689 return logger_it->second;
698 auto logger = factory_it->second();
708 std::unique_lock lock(
mutex_);
765inline std::shared_ptr<ILogger>
get_logger(
const std::string& name) {
Result type for error handling with member function support.
static Result< T > ok(U &&value)
Create a successful result with value (static factory)
Thread-safe singleton registry for managing logger instances.
static GlobalLoggerRegistry & instance()
Get the singleton instance of GlobalLoggerRegistry.
bool has_logger(const std::string &name) const
Check if a logger is registered.
void freeze()
Freeze the registry to prevent further modifications.
std::shared_ptr< ILogger > create_from_factory(const std::string &name)
Create logger from factory if available.
std::shared_ptr< ILogger > create_default_from_factory()
Create default logger from factory if available.
VoidResult unregister_logger(const std::string &name) override
Remove a logger by name.
void clear()
Clear all registered loggers and factories.
GlobalLoggerRegistry(const GlobalLoggerRegistry &)=delete
bool is_frozen() const
Check if the registry is frozen.
VoidResult set_default_factory(LoggerFactory factory)
Set a factory for the default logger.
LoggerFactory default_factory_
~GlobalLoggerRegistry()=default
size_t size() const
Get the number of registered loggers.
static std::shared_ptr< ILogger > null_logger()
Get the shared NullLogger instance.
std::shared_ptr< ILogger > default_logger_
std::atomic< bool > frozen_
VoidResult register_factory(const std::string &name, LoggerFactory factory)
Register a factory for lazy logger creation.
GlobalLoggerRegistry & operator=(const GlobalLoggerRegistry &)=delete
GlobalLoggerRegistry & operator=(GlobalLoggerRegistry &&)=delete
VoidResult set_default_logger(std::shared_ptr< ILogger > logger) override
Set the default logger.
GlobalLoggerRegistry(GlobalLoggerRegistry &&)=delete
VoidResult register_logger(const std::string &name, std::shared_ptr< ILogger > logger) override
Register a logger with a name.
std::shared_ptr< ILogger > get_logger(const std::string &name) override
Get a logger by name.
std::unordered_map< std::string, std::shared_ptr< ILogger > > loggers_
std::unordered_map< std::string, LoggerFactory > factories_
std::shared_ptr< ILogger > get_default_logger() override
Get the default logger.
GlobalLoggerRegistry()=default
bool has_default_logger() const
Check if a default logger is available.
Phase 2: Global logger registry interface.
Standard interface for logging implementations.
A no-op logger implementation for fallback scenarios.
VoidResult set_level(log_level) override
Set the minimum log level.
VoidResult flush() override
Flush any buffered log messages.
VoidResult log(log_level, std::string_view, const source_location &=source_location::current()) override
Log with source_location (no-op)
VoidResult log(log_level, const std::string &) override
Log a message with specified level.
log_level get_level() const override
Get the current minimum log level.
VoidResult log(const log_entry &) override
Log a structured entry.
~NullLogger() override=default
bool is_enabled(log_level) const override
Check if logging is enabled for the specified level.
static void log_event(const registry_event &event)
Log a registry event.
Standard logger interface for all systems.
constexpr int REGISTRY_FROZEN
constexpr int ALREADY_EXISTS
constexpr int INVALID_ARGUMENT
@ set_default_logger
Default logger set.
@ freeze_logger_registry
Freeze logger registry.
@ clear_loggers
Clear all loggers.
@ register_logger
Logger registration.
@ set_default_factory
Default factory set (logger)
@ unregister_logger
Logger unregistration.
@ register_factory
Factory registration (logger)
GlobalLoggerRegistry & get_registry()
Get the global logger registry instance.
std::shared_ptr< ILogger > get_logger()
Get the default logger from the global registry.
std::function< std::shared_ptr< ILogger >()> LoggerFactory
Factory function type for creating logger instances.
log_level
Standard log levels.
Result< T > make_error(int code, const std::string &message, const std::string &module="")
Create an error result with code and message.
Audit logging for registry operations.
Standard log entry structure.
Represents a single audit event for registry mutations.
C++17-compatible source_location implementation using compiler builtins.
static constexpr source_location current(const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE()) noexcept