22#include <kcenon/common/interfaces/logger_interface.h>
26namespace ci = kcenon::common::interfaces;
32 std::cout <<
"\n=== Example 1: Basic Critical Writer ===\n";
38 auto file = std::make_unique<file_writer>(
"logs/critical_basic.log");
39 auto critical = std::make_unique<critical_writer>(
42 .force_flush_on_critical =
true,
43 .force_flush_on_error =
false,
44 .write_ahead_log =
false,
45 .sync_on_critical =
true
52 log.
log(ci::log_level::info, std::string(
"Application started"));
53 log.
log(ci::log_level::debug, std::string(
"Debug information"));
56 log.
log(ci::log_level::critical, std::string(
"Critical error occurred - guaranteed on disk"));
59 std::cout <<
"Critical log written and flushed immediately\n";
67 std::cout <<
"\n=== Example 2: Write-Ahead Logging ===\n";
71 auto file = std::make_unique<rotating_file_writer>(
77 auto critical = std::make_unique<critical_writer>(
80 .force_flush_on_critical =
true,
81 .write_ahead_log =
true,
82 .wal_path =
"logs/.critical.wal",
83 .sync_on_critical =
true
89 log.
log(ci::log_level::info, std::string(
"Normal log"));
90 log.
log(ci::log_level::critical, std::string(
"Critical log - written to WAL first"));
92 std::cout <<
"Check logs/.critical.wal for write-ahead log entries\n";
100 std::cout <<
"\n=== Example 3: Hybrid Writer (Async + Critical) ===\n";
107 auto hybrid = std::make_unique<hybrid_writer>(
108 std::make_unique<file_writer>(
"logs/hybrid.log"),
110 .force_flush_on_critical =
true,
111 .force_flush_on_error =
true
119 for (
int i = 0; i < 100; ++i) {
120 log.
log(ci::log_level::info,
"High-frequency log " + std::to_string(i));
124 log.
log(ci::log_level::critical, std::string(
"Critical error - no loss guaranteed"));
126 std::cout <<
"Hybrid writer provides both performance and safety\n";
134 std::cout <<
"\n=== Example 4: Production Configuration ===\n";
142 std::make_unique<hybrid_writer>(
143 std::make_unique<rotating_file_writer>(
144 "logs/production.log",
149 .force_flush_on_critical =
true,
150 .force_flush_on_error =
true,
151 .write_ahead_log =
true,
152 .wal_path =
"logs/.production.wal",
153 .sync_on_critical =
true,
154 .critical_write_timeout_ms = 5000
170 log->log(ci::log_level::info, std::string(
"Service started"));
171 log->log(ci::log_level::warning, std::string(
"Cache miss rate high"));
172 log->log(ci::log_level::error, std::string(
"Database connection timeout"));
173 log->log(ci::log_level::critical, std::string(
"Out of memory - terminating"));
178 std::cout <<
"Production setup complete\n";
179 std::cout <<
"Configuration:\n";
180 std::cout <<
" - Async logging for normal messages (performance)\n";
181 std::cout <<
" - Immediate flush for errors and critical (safety)\n";
182 std::cout <<
" - Write-ahead logging for crash recovery\n";
183 std::cout <<
" - File rotation to manage disk space\n";
190 std::cout <<
"\n=== Example 5: Error Handling & Statistics ===\n";
194 auto critical = std::make_unique<critical_writer>(
195 std::make_unique<file_writer>(
"logs/stats.log"),
197 .force_flush_on_critical =
true,
198 .write_ahead_log =
true,
199 .wal_path =
"logs/.stats.wal"
204 const auto& config =
critical->get_config();
205 const auto& stats =
critical->get_stats();
210 log.
log(ci::log_level::info, std::string(
"Info message"));
211 log.
log(ci::log_level::warning, std::string(
"Warning message"));
212 log.
log(ci::log_level::error, std::string(
"Error message"));
213 log.
log(ci::log_level::critical, std::string(
"Critical message 1"));
214 log.
log(ci::log_level::critical, std::string(
"Critical message 2"));
215 log.
log(ci::log_level::critical, std::string(
"Fatal message"));
218 std::cout <<
"\nConfiguration:\n";
219 std::cout <<
" Force flush on critical: " << config.force_flush_on_critical <<
"\n";
220 std::cout <<
" Force flush on error: " << config.force_flush_on_error <<
"\n";
221 std::cout <<
" WAL enabled: " << config.write_ahead_log <<
"\n";
222 std::cout <<
" Sync on critical: " << config.sync_on_critical <<
"\n";
224 std::cout <<
"\nStatistics:\n";
225 std::cout <<
" Total critical writes: " << stats.total_critical_writes.load() <<
"\n";
226 std::cout <<
" Total flushes: " << stats.total_flushes.load() <<
"\n";
227 std::cout <<
" WAL writes: " << stats.wal_writes.load() <<
"\n";
228 std::cout <<
" Sync calls: " << stats.sync_calls.load() <<
"\n";
231 std::cout <<
"\nChanging configuration at runtime...\n";
237 std::cout <<
"Critical Logging Examples\n";
238 std::cout <<
"=========================\n";
247 std::cout <<
"\n=== All Examples Completed Successfully ===\n";
248 std::cout <<
"\nCheck the logs/ directory for output files:\n";
249 std::cout <<
" - *.log: Main log files\n";
250 std::cout <<
" - .*.wal: Write-ahead log files\n";
252 }
catch (
const std::exception& e) {
253 std::cerr <<
"Error: " << e.what() <<
"\n";
Asynchronous wrapper for log writers.
Builder pattern for logger construction with validation.
logger_builder & with_min_level(log_level level)
logger_builder & with_async(bool async=true)
logger_builder & add_writer(const std::string &name, log_writer_ptr writer)
Add a writer to the logger.
logger_builder & with_buffer_size(std::size_t size)
Set buffer size.
common::VoidResult add_writer(log_writer_ptr writer)
common::VoidResult log(common::interfaces::log_level level, const std::string &message) override
Log a message with specified level (ILogger interface)
const std::string & error_message() const
void example_write_ahead_logging()
void example_basic_critical_writer()
void example_hybrid_writer()
void example_error_handling()
void example_production_setup()
Synchronous wrapper for critical log messages to prevent loss.
File writer for logging to files with optional buffering.
High-performance, thread-safe logging system with asynchronous capabilities.
Builder pattern implementation for flexible logger configuration kcenon.
Rotating file writer with size and time-based rotation.
Configuration for critical log writer.