Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
common_system_adapter.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
12#pragma once
13
14#include <memory>
15#include <string>
16#include <string_view>
17#include <chrono>
18#include <unordered_map>
19
20// common_system integration
21#include <kcenon/common/interfaces/logger_interface.h>
22#include <kcenon/common/patterns/result.h>
23#include <kcenon/common/utils/source_location.h>
24
25#include "../core/logger.h"
26
28
35class common_system_logger_adapter : public ::common::interfaces::ILogger {
36public:
41 explicit common_system_logger_adapter(std::shared_ptr<logger> lg)
42 : impl_(std::move(lg)) {}
43
44 ~common_system_logger_adapter() override = default;
45
49 ::common::VoidResult log(
50 ::common::interfaces::log_level level,
51 const std::string& message) override {
52 if (!impl_) {
53 return ::common::VoidResult(
54 ::common::error_info(1, "Logger not initialized", "kcenon::logger"));
55 }
56
57 try {
58 auto logger_level = convert_level_from_common(level);
59 impl_->log(logger_level, message);
60 return ::common::VoidResult(std::monostate{});
61 } catch (const std::exception& e) {
62 return ::common::VoidResult(
63 ::common::error_info(2, e.what(), "kcenon::logger"));
64 }
65 }
66
70 ::common::VoidResult log(
71 ::common::interfaces::log_level level,
72 std::string_view message,
73 const ::kcenon::common::source_location& loc = ::kcenon::common::source_location::current()) override {
74 if (!impl_) {
75 return ::common::VoidResult(
76 ::common::error_info(1, "Logger not initialized", "kcenon::logger"));
77 }
78
79 try {
80 auto logger_level = convert_level_from_common(level);
81 impl_->log(logger_level, message, loc);
82 return ::common::VoidResult(std::monostate{});
83 } catch (const std::exception& e) {
84 return ::common::VoidResult(
85 ::common::error_info(2, e.what(), "kcenon::logger"));
86 }
87 }
88
92 ::common::VoidResult log(
93 const ::common::interfaces::log_entry& entry) override {
94 if (!impl_) {
95 return ::common::VoidResult(
96 ::common::error_info(1, "Logger not initialized", "kcenon::logger"));
97 }
98
99 try {
100 // Delegate directly to logger's log_entry overload, which extracts
101 // file/line/function from the entry without constructing a
102 // std::source_location (not possible in C++20).
103 return impl_->log(entry);
104 } catch (const std::exception& e) {
105 return ::common::VoidResult(
106 ::common::error_info(2, e.what(), "kcenon::logger"));
107 }
108 }
109
113 bool is_enabled(::common::interfaces::log_level level) const override {
114 if (!impl_) {
115 return false;
116 }
117 auto logger_level = convert_level_from_common(level);
118 return impl_->is_enabled(logger_level);
119 }
120
124 ::common::VoidResult set_level(
125 ::common::interfaces::log_level level) override {
126 if (!impl_) {
127 return ::common::VoidResult(
128 ::common::error_info(1, "Logger not initialized", "kcenon::logger"));
129 }
130
131 try {
132 auto logger_level = convert_level_from_common(level);
133 impl_->set_level(logger_level);
134 return ::common::VoidResult(std::monostate{});
135 } catch (const std::exception& e) {
136 return ::common::VoidResult(
137 ::common::error_info(2, e.what(), "kcenon::logger"));
138 }
139 }
140
144 ::common::interfaces::log_level get_level() const override {
145 if (!impl_) {
146 return ::common::interfaces::log_level::info;
147 }
148 auto logger_level = impl_->get_level();
149 return convert_level_to_common(logger_level);
150 }
151
155 ::common::VoidResult flush() override {
156 if (!impl_) {
157 return ::common::VoidResult(
158 ::common::error_info(1, "Logger not initialized", "kcenon::logger"));
159 }
160
161 try {
162 impl_->flush();
163 return ::common::VoidResult(std::monostate{});
164 } catch (const std::exception& e) {
165 return ::common::VoidResult(
166 ::common::error_info(2, e.what(), "kcenon::logger"));
167 }
168 }
169
174 std::shared_ptr<logger> get_impl() const { return impl_; }
175
176private:
177 std::shared_ptr<logger> impl_;
178
182 static log_level convert_level_from_common(::common::interfaces::log_level level) {
183 switch(level) {
184 case ::common::interfaces::log_level::trace:
185 return log_level::trace;
186 case ::common::interfaces::log_level::debug:
187 return log_level::debug;
188 case ::common::interfaces::log_level::info:
189 return log_level::info;
190 case ::common::interfaces::log_level::warning:
191 return log_level::warning;
192 case ::common::interfaces::log_level::error:
193 return log_level::error;
194 case ::common::interfaces::log_level::critical:
195 return log_level::critical;
196 case ::common::interfaces::log_level::off:
197 default:
198 return log_level::off;
199 }
200 }
201
205 static ::common::interfaces::log_level convert_level_to_common(log_level level) {
206 switch(level) {
207 case log_level::trace:
208 return ::common::interfaces::log_level::trace;
209 case log_level::debug:
210 return ::common::interfaces::log_level::debug;
211 case log_level::info:
212 return ::common::interfaces::log_level::info;
213 case log_level::warning:
214 return ::common::interfaces::log_level::warning;
215 case log_level::error:
216 return ::common::interfaces::log_level::error;
217 case log_level::critical:
218 return ::common::interfaces::log_level::critical;
219 case log_level::off:
220 default:
221 return ::common::interfaces::log_level::off;
222 }
223 }
224};
225
230public:
234 static std::shared_ptr<::common::interfaces::ILogger> create_common_logger(
235 std::shared_ptr<logger> lg) {
236 return std::make_shared<common_system_logger_adapter>(lg);
237 }
238};
239
240} // namespace kcenon::logger::adapters
Factory for creating common_system compatible loggers.
static std::shared_ptr<::common::interfaces::ILogger > create_common_logger(std::shared_ptr< logger > lg)
Create a common_system ILogger from kcenon::logger logger.
Adapter to expose kcenon::logger as common::interfaces::ILogger.
::common::VoidResult log(::common::interfaces::log_level level, const std::string &message) override
Log a message with specified level.
::common::VoidResult set_level(::common::interfaces::log_level level) override
Set the minimum log level.
::common::interfaces::log_level convert_level_to_common(log_level level)
Convert kcenon::logger log level to common log level.
::common::VoidResult flush() override
Flush any buffered log messages.
common_system_logger_adapter(std::shared_ptr< logger > lg)
Construct adapter with kcenon::logger logger.
static log_level convert_level_from_common(::common::interfaces::log_level level)
Convert common log level to kcenon::logger log level.
::common::VoidResult log(::common::interfaces::log_level level, std::string_view message, const ::kcenon::common::source_location &loc=::kcenon::common::source_location::current()) override
Log a message with source location information (C++20 style)
bool is_enabled(::common::interfaces::log_level level) const override
Check if logging is enabled for the specified level.
std::shared_ptr< logger > get_impl() const
Get access to the underlying logger.
::common::VoidResult log(const ::common::interfaces::log_entry &entry) override
Log a structured entry.
::common::interfaces::log_level get_level() const override
Get the current minimum log level.
High-performance, thread-safe logging system with asynchronous capabilities.
common::interfaces::log_level log_level