Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
structured_log_builder.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
5#pragma once
6
28#include <kcenon/common/interfaces/logger_interface.h>
29
30#include <string>
31#include <functional>
32
33namespace kcenon::logger {
34
35// Type alias for log_level
36using log_level = common::interfaces::log_level;
37
38// Forward declaration
39class logger;
40
58public:
62 using emit_callback = std::function<void(log_entry&&)>;
63
70 structured_log_builder(log_level level,
71 emit_callback callback,
72 const log_fields* context_fields = nullptr)
73 : level_(level),
74 callback_(std::move(callback)) {
75 if (context_fields && !context_fields->empty()) {
76 fields_ = *context_fields;
77 }
78 }
79
85 structured_log_builder& message(const std::string& msg) {
86 message_ = msg;
87 return *this;
88 }
89
96 structured_log_builder& field(const std::string& key, const std::string& value) {
97 fields_[key] = value;
98 return *this;
99 }
100
107 structured_log_builder& field(const std::string& key, const char* value) {
108 fields_[key] = std::string(value);
109 return *this;
110 }
111
118 structured_log_builder& field(const std::string& key, int value) {
119 fields_[key] = static_cast<int64_t>(value);
120 return *this;
121 }
122
129 structured_log_builder& field(const std::string& key, int64_t value) {
130 fields_[key] = value;
131 return *this;
132 }
133
140 structured_log_builder& field(const std::string& key, double value) {
141 fields_[key] = value;
142 return *this;
143 }
144
151 structured_log_builder& field(const std::string& key, bool value) {
152 fields_[key] = value;
153 return *this;
154 }
155
162 structured_log_builder& field(const std::string& key, const log_value& value) {
163 fields_[key] = value;
164 return *this;
165 }
166
172 structured_log_builder& category(const std::string& cat) {
173 category_ = cat;
174 return *this;
175 }
176
184 void emit() {
185 if (!callback_) {
186 return;
187 }
188
189 log_entry entry(level_, message_);
190
191 if (!fields_.empty()) {
192 entry.fields = std::move(fields_);
193 }
194
195 if (!category_.empty()) {
197 }
198
199 callback_(std::move(entry));
200 }
201
209
210 // Disable copy
213
214 // Enable move
216 structured_log_builder& operator=(structured_log_builder&&) noexcept = default;
217
218private:
219 log_level level_;
221 std::string message_;
222 std::string category_;
224};
225
226} // namespace kcenon::logger
Fluent builder for creating structured log entries.
structured_log_builder & field(const std::string &key, const std::string &value)
Add a string field.
structured_log_builder & field(const std::string &key, const log_value &value)
Add a log_value field.
~structured_log_builder()=default
Destructor - does NOT auto-emit.
structured_log_builder & field(const std::string &key, bool value)
Add a boolean field.
structured_log_builder & field(const std::string &key, int64_t value)
Add a long integer field.
structured_log_builder & operator=(const structured_log_builder &)=delete
structured_log_builder & field(const std::string &key, const char *value)
Add a C-string field.
structured_log_builder(log_level level, emit_callback callback, const log_fields *context_fields=nullptr)
Constructor.
structured_log_builder & field(const std::string &key, double value)
Add a double field.
structured_log_builder(const structured_log_builder &)=delete
structured_log_builder & field(const std::string &key, int value)
Add an integer field.
std::function< void(log_entry &&)> emit_callback
Callback type for emitting structured log entries.
structured_log_builder & category(const std::string &cat)
Set the category for the log entry.
structured_log_builder & message(const std::string &msg)
Set the log message.
structured_log_builder(structured_log_builder &&) noexcept=default
Data structures for representing log entries and source locations kcenon.
common::interfaces::log_level log_level
std::unordered_map< std::string, log_value > log_fields
Type alias for structured fields map.
Definition log_entry.h:75
small_string< 128 > small_string_128
std::variant< std::string, int64_t, double, bool > log_value
Value type for structured logging fields.
Definition log_entry.h:69
Represents a single log entry with all associated metadata.
Definition log_entry.h:155
std::optional< log_fields > fields
Optional structured fields for key-value logging.
Definition log_entry.h:213
std::optional< small_string_128 > category
Optional category for log filtering and routing.
Definition log_entry.h:197