Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
common_logger_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 <chrono>
17#include <functional>
18#include <format>
19
20// common_system integration
21#include <kcenon/common/interfaces/logger_interface.h>
22#include <kcenon/common/patterns/result.h>
23
24#include "../logger.h"
25#include "../log_level.h"
26#include "../formatter/basic_formatter.h"
27
28namespace kcenon {
29namespace logger {
30namespace adapters {
31
35inline ::common::interfaces::log_level to_common_level(log_level level) {
36 switch (level) {
37 case log_level::trace:
38 return ::common::interfaces::log_level::trace;
39 case log_level::debug:
40 return ::common::interfaces::log_level::debug;
41 case log_level::info:
42 return ::common::interfaces::log_level::info;
43 case log_level::warning:
44 return ::common::interfaces::log_level::warning;
45 case log_level::error:
46 return ::common::interfaces::log_level::error;
47 case log_level::critical:
48 return ::common::interfaces::log_level::critical;
49 case log_level::off:
50 return ::common::interfaces::log_level::off;
51 default:
52 return ::common::interfaces::log_level::info;
53 }
54}
55
56inline log_level from_common_level(::common::interfaces::log_level level) {
57 switch (level) {
58 case ::common::interfaces::log_level::trace:
59 return log_level::trace;
60 case ::common::interfaces::log_level::debug:
61 return log_level::debug;
62 case ::common::interfaces::log_level::info:
63 return log_level::info;
64 case ::common::interfaces::log_level::warning:
65 return log_level::warning;
66 case ::common::interfaces::log_level::error:
67 return log_level::error;
68 case ::common::interfaces::log_level::critical:
69 return log_level::critical;
70 case ::common::interfaces::log_level::off:
71 return log_level::off;
72 default:
73 return log_level::info;
74 }
75}
76
80class logger_adapter : public ::common::interfaces::ILogger {
81public:
85 explicit logger_adapter(std::shared_ptr<kcenon::logger::logger> lgr)
86 : logger_(lgr) {}
87
88 ~logger_adapter() override = default;
89
94 ::common::VoidResult log(::common::interfaces::log_level level,
95 const std::string& message) override {
96 if (!logger_) {
97 return ::common::error_info(1, "Logger not initialized", "logger_system");
98 }
99
100 // Logger operations are designed to be noexcept - simply call and return success
101 logger_->log(from_common_level(level), message);
102 return ::common::VoidResult(std::monostate{});
103 }
104
109 ::common::VoidResult log_with_location(
110 ::common::interfaces::log_level level,
111 const std::string& message,
112 const std::string& file,
113 int line,
114 const std::string& function) override {
115 if (!logger_) {
116 return ::common::error_info(1, "Logger not initialized", "logger_system");
117 }
118
119 // Create formatted message with location info
120 // Logger operations are noexcept - format may throw but we catch at API boundary
121 try {
122 std::string formatted = std::format("[{}:{}:{}] {}",
123 file, line, function, message);
124 logger_->log(from_common_level(level), formatted);
125 } catch (const std::exception& e) {
126 // Only format can throw - return error for format failure
127 return ::common::error_info(2, std::string("Format error: ") + e.what(), "logger_system");
128 }
129 return ::common::VoidResult(std::monostate{});
130 }
131
136 ::common::VoidResult log_entry(
137 const ::common::interfaces::log_entry& entry) override {
138 if (!logger_) {
139 return ::common::error_info(1, "Logger not initialized", "logger_system");
140 }
141
142 // Format the entry with location if available
143 try {
144 std::string message = entry.message;
145 if (!entry.file.empty()) {
146 message = std::format("[{}:{}:{}] {}",
147 entry.file, entry.line, entry.function, entry.message);
148 }
149
150 logger_->log(from_common_level(entry.level), message);
151 } catch (const std::exception& e) {
152 // Only format can throw
153 return ::common::error_info(2, std::string("Format error: ") + e.what(), "logger_system");
154 }
155 return ::common::VoidResult(std::monostate{});
156 }
157
162 ::common::VoidResult set_level(::common::interfaces::log_level level) override {
163 if (!logger_) {
164 return ::common::error_info(1, "Logger not initialized", "logger_system");
165 }
166
167 // Logger operations are designed to be noexcept
169 return ::common::VoidResult(std::monostate{});
170 }
171
175 ::common::interfaces::log_level get_level() const override {
176 if (!logger_) {
177 return ::common::interfaces::log_level::off;
178 }
179
181 }
182
187 ::common::VoidResult flush() override {
188 if (!logger_) {
189 return ::common::error_info(1, "Logger not initialized", "logger_system");
190 }
191
192 // Logger operations are designed to be noexcept
193 logger_->flush();
194 return ::common::VoidResult(std::monostate{});
195 }
196
200 ::common::VoidResult register_callback(
201 std::function<void(const ::common::interfaces::log_entry&)> callback) override {
202 if (!logger_) {
203 return ::common::error_info(1, "Logger not initialized", "logger_system");
204 }
205
206 // Note: This requires extending the logger_system to support callbacks
207 // For now, return success as placeholder
208 return ::common::VoidResult(std::monostate{});
209 }
210
211private:
212 std::shared_ptr<kcenon::logger::logger> logger_;
213};
214
219public:
224 std::shared_ptr<::common::interfaces::ILogger> common_logger)
225 : common_logger_(common_logger) {}
226
230 void log(log_level level, const std::string& message) {
231 if (!common_logger_) {
232 return;
233 }
234
235 auto result = common_logger_->log(to_common_level(level), message);
236 // Silently ignore errors for now
237 }
238
243 const std::string& message,
244 const std::string& file,
245 int line,
246 const std::string& function) {
247 if (!common_logger_) {
248 return;
249 }
250
251 auto result = common_logger_->log_with_location(
252 to_common_level(level), message, file, line, function);
253 // Silently ignore errors for now
254 }
255
259 void set_level(log_level level) {
260 if (common_logger_) {
261 common_logger_->set_level(to_common_level(level));
262 }
263 }
264
269 if (!common_logger_) {
270 return log_level::off;
271 }
272
273 return from_common_level(common_logger_->get_level());
274 }
275
279 void flush() {
280 if (common_logger_) {
281 common_logger_->flush();
282 }
283 }
284
285private:
286 std::shared_ptr<::common::interfaces::ILogger> common_logger_;
287};
288
293public:
297 static std::shared_ptr<::common::interfaces::ILogger> create_from_logger(
298 std::shared_ptr<kcenon::logger::logger> lgr) {
299 return std::make_shared<logger_adapter>(lgr);
300 }
301
305 static std::unique_ptr<logger_from_common_adapter> create_from_common(
306 std::shared_ptr<::common::interfaces::ILogger> common_logger) {
307 return std::make_unique<logger_from_common_adapter>(common_logger);
308 }
309};
310
311} // namespace adapters
312} // namespace logger
313} // namespace kcenon
Factory for creating common_system compatible loggers.
static std::unique_ptr< logger_from_common_adapter > create_from_common(std::shared_ptr<::common::interfaces::ILogger > common_logger)
Create a logger_system wrapper from common ILogger.
static std::shared_ptr<::common::interfaces::ILogger > create_from_logger(std::shared_ptr< kcenon::logger::logger > lgr)
Create a common_system ILogger from logger_system logger.
logger_adapter(std::shared_ptr< kcenon::logger::logger > lgr)
Construct adapter with logger instance.
::common::interfaces::log_level get_level() const override
Get the current log level.
::common::VoidResult log(::common::interfaces::log_level level, const std::string &message) override
Log a message with specified level.
::common::VoidResult log_entry(const ::common::interfaces::log_entry &entry) override
Log a structured entry.
::common::VoidResult set_level(::common::interfaces::log_level level) override
Set the minimum log level.
::common::VoidResult log_with_location(::common::interfaces::log_level level, const std::string &message, const std::string &file, int line, const std::string &function) override
Log a message with source location information.
::common::VoidResult register_callback(std::function< void(const ::common::interfaces::log_entry &)> callback) override
Register a callback for log events.
std::shared_ptr< kcenon::logger::logger > logger_
::common::VoidResult flush() override
Flush all pending log messages.
Adapter to use common::interfaces::ILogger in logger_system.
void log_with_location(log_level level, const std::string &message, const std::string &file, int line, const std::string &function)
Log with source location.
std::shared_ptr<::common::interfaces::ILogger > common_logger_
void log(log_level level, const std::string &message)
Log a message.
logger_from_common_adapter(std::shared_ptr<::common::interfaces::ILogger > common_logger)
Construct adapter with common logger.
common::VoidResult set_level(common::interfaces::log_level level) override
Set the minimum log level (ILogger interface)
Definition logger.cpp:555
common::interfaces::log_level get_level() const override
Get the current minimum log level (ILogger interface)
Definition logger.cpp:567
common::VoidResult log(common::interfaces::log_level level, const std::string &message) override
Log a message with specified level (ILogger interface)
Definition logger.cpp:378
common::VoidResult flush() override
Flush any buffered log messages (ILogger interface)
Definition logger.cpp:574
inline ::common::interfaces::log_level to_common_level(log_level level)
Convert log levels between logger_system and common_system.
common::interfaces::log_level log_level
log_level from_common_level(::common::interfaces::log_level level)