19#ifdef BUILD_WITH_COMMON_SYSTEM
21#include <kcenon/common/di/service_container.h>
22#include <kcenon/common/interfaces/logger_interface.h>
27namespace kcenon::logger::di {
30using log_level = common::interfaces::log_level;
37class ilogger_adapter :
public common::interfaces::ILogger {
39 explicit ilogger_adapter(std::shared_ptr<logger> lgr)
40 : logger_(std::move(lgr))
43 ~ilogger_adapter()
override =
default;
46 const std::string& message)
override {
48 return common::make_error<std::monostate>(
49 1,
"Logger not initialized",
"logger_system");
51 logger_->log(level, message);
52 return common::VoidResult::ok({});
56 const std::string& message,
57 const std::string& file,
59 const std::string& function)
override {
61 return common::make_error<std::monostate>(
62 1,
"Logger not initialized",
"logger_system");
65 std::string formatted =
"[" + file +
":" + std::to_string(line) +
":" + function +
"] " + message;
66 logger_->log(level, formatted);
67 return common::VoidResult::ok({});
72 return common::make_error<std::monostate>(
73 1,
"Logger not initialized",
"logger_system");
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);
80 logger_->log(entry.level, entry.message);
82 return common::VoidResult::ok({});
85 bool is_enabled(log_level level)
const override {
86 return level >= level_;
92 logger_->set_level(level);
94 return common::VoidResult::ok({});
105 return common::VoidResult::ok({});
109 std::shared_ptr<logger> logger_;
118struct logger_registration_config {
120 std::string config_template =
"default";
129 bool metrics =
false;
132 common::di::service_lifetime lifetime = common::di::service_lifetime::singleton;
164 common::di::IServiceContainer& container,
165 const logger_registration_config& config = {}) {
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",
177 return container.register_factory<common::interfaces::ILogger>(
178 [config](common::di::IServiceContainer&) -> std::shared_ptr<common::interfaces::ILogger> {
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);
186 auto result = builder.build();
194 return std::make_shared<detail::ilogger_adapter>(
195 std::shared_ptr<logger>(result.value().release())
225 common::di::IServiceContainer& container,
226 std::unique_ptr<logger> lgr) {
229 return common::make_error<std::monostate>(
230 common::error_codes::INVALID_ARGUMENT,
231 "Cannot register null logger instance",
236 auto adapter = std::make_shared<detail::ilogger_adapter>(
237 std::shared_ptr<logger>(lgr.release())
240 return container.register_instance<common::interfaces::ILogger>(adapter);
250 common::di::IServiceContainer& container) {
252 return container.unregister<common::interfaces::ILogger>();
High-performance, thread-safe logging system with asynchronous capabilities.
Builder pattern implementation for flexible logger configuration kcenon.
common::interfaces::log_level log_level