Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
service_registration.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
15#pragma once
16
17#include <memory>
18
19#ifdef BUILD_WITH_COMMON_SYSTEM
20
21#include <kcenon/common/di/service_container.h>
22#include <kcenon/common/interfaces/logger_interface.h>
23
25#include "../core/logger.h"
26
27namespace kcenon::logger::di {
28
29// Type alias for log_level
30using log_level = common::interfaces::log_level;
31
32namespace detail {
33
37class ilogger_adapter : public common::interfaces::ILogger {
38public:
39 explicit ilogger_adapter(std::shared_ptr<logger> lgr)
40 : logger_(std::move(lgr))
41 , level_(common::interfaces::log_level::info) {}
42
43 ~ilogger_adapter() override = default;
44
45 common::VoidResult log(log_level level,
46 const std::string& message) override {
47 if (!logger_) {
48 return common::make_error<std::monostate>(
49 1, "Logger not initialized", "logger_system");
50 }
51 logger_->log(level, message);
52 return common::VoidResult::ok({});
53 }
54
55 common::VoidResult log(log_level level,
56 const std::string& message,
57 const std::string& file,
58 int line,
59 const std::string& function) override {
60 if (!logger_) {
61 return common::make_error<std::monostate>(
62 1, "Logger not initialized", "logger_system");
63 }
64 // Format message with location info
65 std::string formatted = "[" + file + ":" + std::to_string(line) + ":" + function + "] " + message;
66 logger_->log(level, formatted);
67 return common::VoidResult::ok({});
68 }
69
70 common::VoidResult log(const common::interfaces::log_entry& entry) override {
71 if (!logger_) {
72 return common::make_error<std::monostate>(
73 1, "Logger not initialized", "logger_system");
74 }
75 if (!entry.file.empty()) {
76 std::string formatted = "[" + entry.file + ":" + std::to_string(entry.line) +
77 ":" + entry.function + "] " + entry.message;
78 logger_->log(entry.level, formatted);
79 } else {
80 logger_->log(entry.level, entry.message);
81 }
82 return common::VoidResult::ok({});
83 }
84
85 bool is_enabled(log_level level) const override {
86 return level >= level_;
87 }
88
89 common::VoidResult set_level(log_level level) override {
90 level_ = level;
91 if (logger_) {
92 logger_->set_level(level);
93 }
94 return common::VoidResult::ok({});
95 }
96
97 log_level get_level() const override {
98 return level_;
99 }
100
101 common::VoidResult flush() override {
102 if (logger_) {
103 logger_->flush();
104 }
105 return common::VoidResult::ok({});
106 }
107
108private:
109 std::shared_ptr<logger> logger_;
110 log_level level_;
111};
112
113} // namespace detail
114
118struct logger_registration_config {
120 std::string config_template = "default";
121
123 log_level min_level = log_level::info;
124
126 bool async = true;
127
129 bool metrics = false;
130
132 common::di::service_lifetime lifetime = common::di::service_lifetime::singleton;
133};
134
163inline common::VoidResult register_logger_services(
164 common::di::IServiceContainer& container,
165 const logger_registration_config& config = {}) {
166
167 // Check if already registered
168 if (container.is_registered<common::interfaces::ILogger>()) {
169 return common::make_error<std::monostate>(
170 common::di::di_error_codes::already_registered,
171 "ILogger is already registered",
172 "logger_system::di"
173 );
174 }
175
176 // Register logger factory
177 return container.register_factory<common::interfaces::ILogger>(
178 [config](common::di::IServiceContainer&) -> std::shared_ptr<common::interfaces::ILogger> {
179 // Build logger with configuration
180 auto builder = logger_builder()
181 .use_template(config.config_template)
182 .with_min_level(config.min_level)
183 .with_async(config.async)
184 .with_metrics(config.metrics);
185
186 auto result = builder.build();
187 if (!result) {
188 // Return a null logger on failure - the caller should check
189 // This should rarely happen with default configuration
190 return nullptr;
191 }
192
193 // Create adapter that implements ILogger
194 return std::make_shared<detail::ilogger_adapter>(
195 std::shared_ptr<logger>(result.value().release())
196 );
197 },
198 config.lifetime
199 );
200}
201
224inline common::VoidResult register_logger_instance(
225 common::di::IServiceContainer& container,
226 std::unique_ptr<logger> lgr) {
227
228 if (!lgr) {
229 return common::make_error<std::monostate>(
230 common::error_codes::INVALID_ARGUMENT,
231 "Cannot register null logger instance",
232 "logger_system::di"
233 );
234 }
235
236 auto adapter = std::make_shared<detail::ilogger_adapter>(
237 std::shared_ptr<logger>(lgr.release())
238 );
239
240 return container.register_instance<common::interfaces::ILogger>(adapter);
241}
242
249inline common::VoidResult unregister_logger_services(
250 common::di::IServiceContainer& container) {
251
252 return container.unregister<common::interfaces::ILogger>();
253}
254
255} // namespace kcenon::logger::di
256
257#endif // BUILD_WITH_COMMON_SYSTEM
High-performance, thread-safe logging system with asynchronous capabilities.
Builder pattern implementation for flexible logger configuration kcenon.
common::interfaces::log_level log_level