#include <iostream>
#include <thread>
#include <chrono>
std::cout << "\n=== Basic Structured Logging ===\n" << std::endl;
auto logger_instance = std::make_shared<logger>(false);
logger_instance->add_writer(std::make_unique<console_writer>());
logger_instance->start();
logger_instance->log_structured(log_level::info)
.message("User login successful")
.field("user_id", 12345)
.field("username", "john_doe")
.field("ip_address", "192.168.1.100")
.field("login_time_ms", 42.5)
.field("mfa_enabled", true)
.emit();
logger_instance->log_structured(log_level::error)
.message("Database connection failed")
.field("host", "db.example.com")
.field("port", 5432)
.field("retry_count", 3)
.field("timeout_ms", 30000)
.emit();
logger_instance->log_structured(log_level::debug)
.message("Cache lookup performed")
.field("cache_key", "user:12345:profile")
.field("hit", false)
.field("latency_us", 150)
.emit();
logger_instance->stop();
}
std::cout << "\n=== Context Propagation Example ===\n" << std::endl;
auto logger_instance = std::make_shared<logger>(false);
logger_instance->add_writer(std::make_unique<console_writer>());
logger_instance->start();
logger_instance->context()
.set("trace_id", std::string("0af7651916cd43dd8448eb211c80319c"), context_category::trace)
.set("span_id", std::string("b7ad6b7169203331"), context_category::trace)
.set("correlation_id", std::string("req-abc-123"), context_category::trace);
logger_instance->log_structured(log_level::info)
.message("Processing API request")
.field("endpoint", "/api/v1/users")
.field("method", "GET")
.emit();
logger_instance->log_structured(log_level::info)
.message("Database query executed")
.field("query_type", "SELECT")
.field("rows_returned", 42)
.emit();
logger_instance->context().clear(context_category::trace);
logger_instance->stop();
}
std::cout << "\n=== Context Scope Example ===\n" << std::endl;
auto logger_instance = std::make_shared<logger>(false);
logger_instance->add_writer(std::make_unique<console_writer>());
logger_instance->start();
{
{"request_id", std::string("req-12345")},
{"user_id", static_cast<int64_t>(1001)},
{"tenant", std::string("acme-corp")}
});
logger_instance->log_structured(log_level::info)
.message("Request processing started")
.emit();
{
{"operation", std::string("user_lookup")},
{"database", std::string("users_db")}
});
logger_instance->log_structured(log_level::debug)
.message("Executing database query")
.field("query_time_ms", 15.3)
.emit();
}
logger_instance->log_structured(log_level::info)
.message("Request processing completed")
.field("total_time_ms", 45.7)
.emit();
}
logger_instance->stop();
}
std::cout << "\n=== Scoped Context (Single Field) ===\n" << std::endl;
auto logger_instance = std::make_shared<logger>(false);
logger_instance->add_writer(std::make_unique<console_writer>());
logger_instance->start();
{
logger_instance->log_structured(log_level::info)
.message("Processing order")
.field("status", "pending")
.emit();
{
logger_instance->log_structured(log_level::debug)
.message("Validating item")
.field("quantity", 3)
.emit();
}
logger_instance->log_structured(log_level::info)
.message("Order completed")
.field("status", "completed")
.emit();
}
logger_instance->stop();
}
std::cout << "\n=== JSON Formatter Example ===\n" << std::endl;
log_entry entry(log_level::info,
"User profile updated");
{"user_id", static_cast<int64_t>(12345)},
{"fields_changed", static_cast<int64_t>(3)},
{"notification_sent", true}
};
std::string output = formatter.
format(entry);
std::cout << "JSON formatted output:\n" << output << std::endl;
}
std::cout << "\n=== Logfmt Formatter Example ===\n" << std::endl;
log_entry entry(log_level::info,
"HTTP request completed");
{"method", std::string("POST")},
{"path", std::string("/api/orders")},
{"status_code", static_cast<int64_t>(201)},
{"duration_ms", 125.5}
};
std::string output = formatter.
format(entry);
std::cout << "Logfmt formatted output:\n" << output << std::endl;
}
std::cout << "\n=== Template Formatter Example ===\n" << std::endl;
log_entry entry(log_level::info,
"Session created");
{"user_id", static_cast<int64_t>(12345)},
{"session_id", std::string("sess-abc-123")}
};
template_formatter formatter(
"[{timestamp_local}] [{level:8}] {message} | user={user_id}");
std::string output = formatter.
format(entry);
std::cout << "Template formatted output:\n" << output << std::endl;
formatter.set_template("{level}: {message} (session={session_id})");
std::string output2 = formatter.
format(entry);
std::cout << "Alternative template:\n" << output2 << std::endl;
}
std::cout << "\n=== Multithreaded Context Example ===\n" << std::endl;
auto logger_instance = std::make_shared<logger>(true);
logger_instance->add_writer(std::make_unique<console_writer>());
logger_instance->start();
auto worker = [&](int thread_id) {
{"thread_id", static_cast<int64_t>(thread_id)},
{"worker", std::string("processor-" + std::to_string(thread_id))}
});
for (int i = 0; i < 3; ++i) {
logger_instance->log_structured(log_level::info)
.message("Processing item")
.field("item_number", i)
.emit();
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
};
std::thread t1(worker, 1);
std::thread t2(worker, 2);
t1.join();
t2.join();
logger_instance->stop();
}
std::cout << "\n=== Logger Context Example ===\n" << std::endl;
auto logger_instance = std::make_shared<logger>(false);
logger_instance->add_writer(std::make_unique<console_writer>());
logger_instance->start();
logger_instance->context()
.set("service", std::string("order-service"))
.set("version", std::string("1.2.3"))
.set("environment", std::string("production"));
logger_instance->log_structured(log_level::info)
.message("Service started")
.emit();
logger_instance->log_structured(log_level::info)
.message("Processing request")
.field("request_id", "req-001")
.emit();
if (!logger_instance->context().empty()) {
auto ctx = logger_instance->context().to_fields();
std::cout << "Current context has " << ctx.size() << " fields" << std::endl;
}
logger_instance->context().remove("environment");
logger_instance->context().clear();
logger_instance->stop();
}
try {
std::cout << "\n=== All structured logging examples completed! ===" << std::endl;
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
return 1;
}
return 0;
}
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.
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.