Common System 0.2.0
Common interfaces and patterns for system integration
Loading...
Searching...
No Matches
logger.cppm
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
19module;
20
21#include <algorithm>
22#include <chrono>
23#include <functional>
24#include <memory>
25#include <string>
26#include <string_view>
27
29
30// Import result.core partition to reuse error_info, Result<T>, VoidResult, source_location
31import :result.core;
32
33// Internal type aliases for this partition (non-exported to avoid symbol duplication)
39} // namespace kcenon::common::interfaces
40
41export namespace kcenon::common::interfaces {
42
43// ============================================================================
44// Logger Interface
45// ============================================================================
46
51enum class log_level {
52 trace = 0,
53 debug = 1,
54 info = 2,
55 warning = 3,
56 error = 4,
57 critical = 5,
58 off = 6
59};
60
65struct log_entry {
67 std::string message;
68 std::string file;
69 int line;
70 std::string function;
71 std::chrono::system_clock::time_point timestamp;
73
74 log_entry(log_level lvl = log_level::info, const std::string& msg = "")
75 : level(lvl), message(msg), line(0), timestamp(std::chrono::system_clock::now()), location() {}
76
77 static log_entry create(log_level lvl, std::string_view msg,
79 log_entry entry;
80 entry.level = lvl;
81 entry.message = std::string(msg);
82 entry.file = loc.file_name();
83 entry.line = loc.line();
84 entry.function = loc.function_name();
85 entry.timestamp = std::chrono::system_clock::now();
86 entry.location = loc;
87 return entry;
88 }
89};
90
95class ILogger {
96public:
97 virtual ~ILogger() = default;
98
99 virtual VoidResult log(log_level level, const std::string& message) = 0;
100
101 virtual VoidResult log(log_level level, std::string_view message,
103 (void)loc;
104 return log(level, std::string(message));
105 }
106
107 virtual VoidResult log(const log_entry& entry) = 0;
108 virtual bool is_enabled(log_level level) const = 0;
109 virtual VoidResult set_level(log_level level) = 0;
110 virtual log_level get_level() const = 0;
111 virtual VoidResult flush() = 0;
112};
113
114using LoggerFactory = std::function<std::shared_ptr<ILogger>()>;
115
117public:
118 virtual ~ILoggerProvider() = default;
119 virtual std::shared_ptr<ILogger> get_logger() = 0;
120 virtual std::shared_ptr<ILogger> create_logger(const std::string& name) = 0;
121};
122
125 std::string pattern = "[%Y-%m-%d %H:%M:%S.%e] [%l] %v";
126 bool async_mode = false;
127 size_t queue_size = 8192;
128 bool color_enabled = false;
129
130 logger_config() = default;
131 logger_config(log_level level, const std::string& fmt = "")
132 : min_level(level), pattern(fmt.empty() ? pattern : fmt) {}
133};
134
136public:
137 virtual ~ILoggerRegistry() = default;
138 virtual VoidResult register_logger(const std::string& name, std::shared_ptr<ILogger> logger) = 0;
139 virtual std::shared_ptr<ILogger> get_logger(const std::string& name) = 0;
140 virtual VoidResult unregister_logger(const std::string& name) = 0;
141 virtual std::shared_ptr<ILogger> get_default_logger() = 0;
142 virtual VoidResult set_default_logger(std::shared_ptr<ILogger> logger) = 0;
143};
144
145inline std::string to_string(log_level level) {
146 switch(level) {
147 case log_level::trace: return "TRACE";
148 case log_level::debug: return "DEBUG";
149 case log_level::info: return "INFO";
150 case log_level::warning: return "WARNING";
151 case log_level::error: return "ERROR";
152 case log_level::critical: return "CRITICAL";
153 case log_level::off: return "OFF";
154 default: return "UNKNOWN";
155 }
156}
157
158inline log_level from_string(const std::string& str) {
159 std::string upper = str;
160 std::transform(upper.begin(), upper.end(), upper.begin(),
161 [](unsigned char c) { return static_cast<char>(std::toupper(c)); });
162
163 if (upper == "TRACE") return log_level::trace;
164 if (upper == "DEBUG") return log_level::debug;
165 if (upper == "INFO") return log_level::info;
166 if (upper == "WARNING" || upper == "WARN") return log_level::warning;
167 if (upper == "ERROR") return log_level::error;
168 if (upper == "CRITICAL" || upper == "FATAL") return log_level::critical;
169 if (upper == "OFF") return log_level::off;
170 return log_level::info;
171}
172
173} // namespace kcenon::common::interfaces
Result type for error handling with member function support.
Definition core.cppm:165
Interface for modules that provide logger implementations.
Definition logger.cppm:116
virtual std::shared_ptr< ILogger > create_logger(const std::string &name)=0
virtual std::shared_ptr< ILogger > get_logger()=0
Phase 2: Global logger registry interface.
Definition logger.cppm:135
virtual VoidResult register_logger(const std::string &name, std::shared_ptr< ILogger > logger)=0
virtual VoidResult unregister_logger(const std::string &name)=0
virtual VoidResult set_default_logger(std::shared_ptr< ILogger > logger)=0
virtual std::shared_ptr< ILogger > get_logger(const std::string &name)=0
virtual std::shared_ptr< ILogger > get_default_logger()=0
Standard interface for logging implementations.
Definition logger.cppm:95
virtual VoidResult log(const log_entry &entry)=0
virtual bool is_enabled(log_level level) const =0
virtual log_level get_level() const =0
virtual VoidResult log(log_level level, std::string_view message, const source_location &loc=source_location::current())
Definition logger.cppm:101
virtual VoidResult set_level(log_level level)=0
virtual VoidResult flush()=0
virtual VoidResult log(log_level level, const std::string &message)=0
log_level from_string(const std::string &str)
Parse log level from string (case-insensitive)
std::function< std::shared_ptr< ILogger >()> LoggerFactory
Factory function type for creating logger instances.
std::string to_string(log_level level)
Convert log level to string.
log_level
Standard log levels.
Standard error information used by Result<T>.
Definition core.cppm:106
Standard log entry structure.
Definition logger.cppm:65
log_level level
source_location location
C++20 source_location (Issue #177)
std::chrono::system_clock::time_point timestamp
int line
std::string function
std::string message
log_entry(log_level lvl=log_level::info, const std::string &msg="")
Definition logger.cppm:74
static log_entry create(log_level lvl, std::string_view msg, const source_location &loc=source_location::current())
Definition logger.cppm:77
std::string file
Configuration for logger instances.
Definition logger.cppm:123
logger_config(log_level level, const std::string &fmt="")
Definition logger.cppm:131
C++17-compatible source_location implementation using compiler builtins.
Definition utils.cppm:54
static constexpr source_location current(const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE()) noexcept