36 std::cout <<
"\n=== Basic Structured Logging ===\n" << std::endl;
38 auto logger_instance = std::make_shared<logger>(
false);
39 logger_instance->add_writer(std::make_unique<console_writer>());
40 logger_instance->start();
43 logger_instance->log_structured(log_level::info)
44 .message(
"User login successful")
45 .field(
"user_id", 12345)
46 .field(
"username",
"john_doe")
47 .field(
"ip_address",
"192.168.1.100")
48 .field(
"login_time_ms", 42.5)
49 .field(
"mfa_enabled",
true)
53 logger_instance->log_structured(log_level::error)
54 .message(
"Database connection failed")
55 .field(
"host",
"db.example.com")
57 .field(
"retry_count", 3)
58 .field(
"timeout_ms", 30000)
62 logger_instance->log_structured(log_level::debug)
63 .message(
"Cache lookup performed")
64 .field(
"cache_key",
"user:12345:profile")
66 .field(
"latency_us", 150)
69 logger_instance->stop();
76 std::cout <<
"\n=== Context Propagation Example ===\n" << std::endl;
78 auto logger_instance = std::make_shared<logger>(
false);
79 logger_instance->add_writer(std::make_unique<console_writer>());
80 logger_instance->start();
83 logger_instance->context()
84 .set(
"trace_id", std::string(
"0af7651916cd43dd8448eb211c80319c"), context_category::trace)
85 .set(
"span_id", std::string(
"b7ad6b7169203331"), context_category::trace)
86 .set(
"correlation_id", std::string(
"req-abc-123"), context_category::trace);
89 logger_instance->log_structured(log_level::info)
90 .message(
"Processing API request")
91 .field(
"endpoint",
"/api/v1/users")
92 .field(
"method",
"GET")
95 logger_instance->log_structured(log_level::info)
96 .message(
"Database query executed")
97 .field(
"query_type",
"SELECT")
98 .field(
"rows_returned", 42)
102 logger_instance->context().clear(context_category::trace);
104 logger_instance->stop();
111 std::cout <<
"\n=== Context Scope Example ===\n" << std::endl;
113 auto logger_instance = std::make_shared<logger>(
false);
114 logger_instance->add_writer(std::make_unique<console_writer>());
115 logger_instance->start();
120 {
"request_id", std::string(
"req-12345")},
121 {
"user_id",
static_cast<int64_t
>(1001)},
122 {
"tenant", std::string(
"acme-corp")}
125 logger_instance->log_structured(log_level::info)
126 .message(
"Request processing started")
132 {
"operation", std::string(
"user_lookup")},
133 {
"database", std::string(
"users_db")}
136 logger_instance->log_structured(log_level::debug)
137 .message(
"Executing database query")
138 .field(
"query_time_ms", 15.3)
143 logger_instance->log_structured(log_level::info)
144 .message(
"Request processing completed")
145 .field(
"total_time_ms", 45.7)
150 logger_instance->stop();
157 std::cout <<
"\n=== Scoped Context (Single Field) ===\n" << std::endl;
159 auto logger_instance = std::make_shared<logger>(
false);
160 logger_instance->add_writer(std::make_unique<console_writer>());
161 logger_instance->start();
165 scoped_context order_ctx(
"order_id",
static_cast<int64_t
>(98765));
167 logger_instance->log_structured(log_level::info)
168 .message(
"Processing order")
169 .field(
"status",
"pending")
175 logger_instance->log_structured(log_level::debug)
176 .message(
"Validating item")
177 .field(
"quantity", 3)
181 logger_instance->log_structured(log_level::info)
182 .message(
"Order completed")
183 .field(
"status",
"completed")
187 logger_instance->stop();
194 std::cout <<
"\n=== JSON Formatter Example ===\n" << std::endl;
197 log_entry entry(log_level::info,
"User profile updated");
199 {
"user_id",
static_cast<int64_t
>(12345)},
200 {
"fields_changed",
static_cast<int64_t
>(3)},
201 {
"notification_sent",
true}
206 std::string output = formatter.
format(entry);
208 std::cout <<
"JSON formatted output:\n" << output << std::endl;
215 std::cout <<
"\n=== Logfmt Formatter Example ===\n" << std::endl;
218 log_entry entry(log_level::info,
"HTTP request completed");
220 {
"method", std::string(
"POST")},
221 {
"path", std::string(
"/api/orders")},
222 {
"status_code",
static_cast<int64_t
>(201)},
223 {
"duration_ms", 125.5}
228 std::string output = formatter.
format(entry);
230 std::cout <<
"Logfmt formatted output:\n" << output << std::endl;
237 std::cout <<
"\n=== Template Formatter Example ===\n" << std::endl;
240 log_entry entry(log_level::info,
"Session created");
242 {
"user_id",
static_cast<int64_t
>(12345)},
243 {
"session_id", std::string(
"sess-abc-123")}
247 template_formatter formatter(
"[{timestamp_local}] [{level:8}] {message} | user={user_id}");
248 std::string output = formatter.
format(entry);
250 std::cout <<
"Template formatted output:\n" << output << std::endl;
253 formatter.
set_template(
"{level}: {message} (session={session_id})");
254 std::string output2 = formatter.
format(entry);
255 std::cout <<
"Alternative template:\n" << output2 << std::endl;
262 std::cout <<
"\n=== Multithreaded Context Example ===\n" << std::endl;
264 auto logger_instance = std::make_shared<logger>(
true);
265 logger_instance->add_writer(std::make_unique<console_writer>());
266 logger_instance->start();
268 auto worker = [&](
int thread_id) {
271 {
"thread_id",
static_cast<int64_t
>(thread_id)},
272 {
"worker", std::string(
"processor-" + std::to_string(thread_id))}
275 for (
int i = 0; i < 3; ++i) {
276 logger_instance->log_structured(log_level::info)
277 .message(
"Processing item")
278 .field(
"item_number", i)
281 std::this_thread::sleep_for(std::chrono::milliseconds(10));
285 std::thread t1(worker, 1);
286 std::thread t2(worker, 2);
291 logger_instance->stop();
298 std::cout <<
"\n=== Logger Context Example ===\n" << std::endl;
300 auto logger_instance = std::make_shared<logger>(
false);
301 logger_instance->add_writer(std::make_unique<console_writer>());
302 logger_instance->start();
305 logger_instance->context()
306 .set(
"service", std::string(
"order-service"))
307 .set(
"version", std::string(
"1.2.3"))
308 .set(
"environment", std::string(
"production"));
311 logger_instance->log_structured(log_level::info)
312 .message(
"Service started")
315 logger_instance->log_structured(log_level::info)
316 .message(
"Processing request")
317 .field(
"request_id",
"req-001")
321 if (!logger_instance->context().empty()) {
322 auto ctx = logger_instance->context().to_fields();
323 std::cout <<
"Current context has " << ctx.size() <<
" fields" << std::endl;
327 logger_instance->context().remove(
"environment");
330 logger_instance->context().clear();
332 logger_instance->stop();
347 std::cout <<
"\n=== All structured logging examples completed! ===" << std::endl;
349 }
catch (
const std::exception& e) {
350 std::cerr <<
"Error: " << e.what() << std::endl;
RAII guard for structured logging context.
Convenience class for setting a single context field with RAII.
Console writer for logging to stdout/stderr.
RAII-based context scope management for structured logging kcenon.
High-performance, thread-safe logging system with asynchronous capabilities.
std::unordered_map< std::string, log_value > log_fields
Type alias for structured fields map.
Represents a single log entry with all associated metadata.
std::optional< log_fields > fields
Optional structured fields for key-value logging.
Fluent builder for structured log entries kcenon.
void context_propagation_example()
Demonstrates context propagation for distributed tracing.
void context_scope_example()
Demonstrates RAII-based context scopes.
void scoped_context_single_field()
Demonstrates single-field scoped context.
void basic_structured_logging()
Demonstrates basic structured logging with key-value fields.
void multithreaded_context_example()
Demonstrates thread-safe context in multi-threaded environment.
void logger_context_example()
Demonstrates logger-level context fields.
void template_formatter_example()
Demonstrates template-based custom formatter.
void logfmt_formatter_example()
Demonstrates Logfmt formatter for key=value output.
void json_formatter_example()
Demonstrates JSON formatter for structured output.