Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
metrics_demo.cpp File Reference

Logger performance metrics collection and multi-threaded throughput test. More...

#include <kcenon/logger/core/logger.h>
#include <kcenon/logger/writers/console_writer.h>
#include <kcenon/logger/interfaces/logger_types.h>
#include <kcenon/common/interfaces/logger_interface.h>
#include <thread>
#include <iostream>
#include <random>
Include dependency graph for metrics_demo.cpp:

Go to the source code of this file.

Functions

void generate_logs (logger *log, int thread_id, int count)
 
void print_metrics (const logger_metrics &metrics)
 
void test_structured_logging ()
 
int main ()
 

Detailed Description

Logger performance metrics collection and multi-threaded throughput test.

Definition in file metrics_demo.cpp.

Function Documentation

◆ generate_logs()

void generate_logs ( logger * log,
int thread_id,
int count )
Examples
metrics_demo.cpp.

Definition at line 29 of file metrics_demo.cpp.

29 {
30 std::random_device rd;
31 std::mt19937 gen(rd());
32 std::uniform_int_distribution<> level_dist(0, 5);
33 std::uniform_int_distribution<> message_size_dist(10, 200);
34
35 // Map integer to log level using ILogger interface
36 static constexpr ci::log_level levels[] = {
37 ci::log_level::trace,
38 ci::log_level::debug,
39 ci::log_level::info,
40 ci::log_level::warning,
41 ci::log_level::error,
42 ci::log_level::critical
43 };
44
45 for (int i = 0; i < count; ++i) {
46 auto level = levels[level_dist(gen)];
47
48 // Generate message of random size
49 std::string message = "Thread " + std::to_string(thread_id) + " - Message " + std::to_string(i);
50 message.append(message_size_dist(gen), 'x');
51
52 log->log(level, message);
53
54 std::this_thread::sleep_for(std::chrono::milliseconds(10));
55 }
56}
common::VoidResult log(common::interfaces::log_level level, const std::string &message) override
Log a message with specified level (ILogger interface)
Definition logger.cpp:378

References kcenon::logger::logger::log().

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

int main ( )

Definition at line 86 of file metrics_demo.cpp.

86 {
87 // Create logger with metrics enabled
88 auto logger = std::make_unique<logger_module::logger>(true, 1024); // Small buffer to test dropping
89
90 // Add console writer
91 logger->add_writer(std::make_unique<console_writer>());
92
93 // Enable metrics collection
94 auto enable_result = logger->enable_metrics_collection(true);
95 if (enable_result.is_err()) {
96 std::cerr << "Failed to enable metrics collection" << std::endl;
97 }
98
99 // Start logger
100 logger->start();
101
102 std::cout << "Starting logger metrics demo..." << std::endl;
103 std::cout << "Generating logs from multiple threads..." << std::endl;
104
105 // Launch multiple threads to generate logs
106 std::vector<std::thread> threads;
107 for (int i = 0; i < 4; ++i) {
108 threads.emplace_back(generate_logs, logger.get(), i, 100);
109 }
110
111 // Wait for threads to complete
112 for (auto& t : threads) {
113 t.join();
114 }
115
116 // Wait a bit for processing
117 std::this_thread::sleep_for(std::chrono::seconds(1));
118
119 // Get and display metrics
120 auto metrics_result = logger->get_current_metrics();
121 if (metrics_result.has_value()) {
122 print_metrics(metrics_result.value());
123 } else {
124 std::cerr << "Failed to get metrics" << std::endl;
125 }
126
127 // Test basic logging functionality
129
130 // Stop logger
131 logger->stop();
132
133 std::cout << "\nDemo completed!" << std::endl;
134
135 return 0;
136}
void print_metrics(const logger_metrics &metrics)
void generate_logs(logger *log, int thread_id, int count)
void test_structured_logging()

References generate_logs(), print_metrics(), and test_structured_logging().

Here is the call graph for this function:

◆ print_metrics()

void print_metrics ( const logger_metrics & metrics)
Examples
metrics_demo.cpp.

Definition at line 58 of file metrics_demo.cpp.

58 {
59 std::cout << "\n=== Logger Performance Metrics ===" << std::endl;
60 std::cout << "Messages logged: " << metrics.messages_logged.load() << std::endl;
61 std::cout << "Messages dropped: " << metrics.messages_dropped.load() << std::endl;
62 std::cout << "Total log time: " << metrics.total_log_time_ns.load() / 1000000.0 << " ms" << std::endl;
63 std::cout << "Throughput: " << metrics.get_messages_per_second() << " msg/s" << std::endl;
64 std::cout << "Queue utilization: " << metrics.get_queue_utilization_percent() << "%" << std::endl;
65 std::cout << "Avg enqueue time: " << metrics.get_avg_enqueue_time_ns() << " ns" << std::endl;
66 std::cout << "Writer errors: " << metrics.writer_errors.load() << std::endl;
67 std::cout << "Flush operations: " << metrics.flush_operations.load() << std::endl;
68}
std::atomic< uint64_t > flush_operations
Number of flush operations.
double get_queue_utilization_percent() const
Get queue utilization percentage.
uint64_t get_avg_enqueue_time_ns() const
Get average enqueue time in nanoseconds.
std::atomic< uint64_t > total_log_time_ns
Total time spent logging (nanoseconds)
std::atomic< uint64_t > writer_errors
Number of writer errors.
double get_messages_per_second() const
Get messages per second.
std::atomic< uint64_t > messages_dropped
Messages dropped due to queue full.
std::atomic< uint64_t > messages_logged
Total messages logged.

References kcenon::logger::metrics::logger_performance_stats::flush_operations, kcenon::logger::metrics::logger_performance_stats::get_avg_enqueue_time_ns(), kcenon::logger::metrics::logger_performance_stats::get_messages_per_second(), kcenon::logger::metrics::logger_performance_stats::get_queue_utilization_percent(), kcenon::logger::metrics::logger_performance_stats::messages_dropped, kcenon::logger::metrics::logger_performance_stats::messages_logged, kcenon::logger::metrics::logger_performance_stats::total_log_time_ns, and kcenon::logger::metrics::logger_performance_stats::writer_errors.

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ test_structured_logging()

void test_structured_logging ( )
Examples
metrics_demo.cpp.

Definition at line 71 of file metrics_demo.cpp.

71 {
72 std::cout << "\n=== Testing Basic Logging ===" << std::endl;
73
74 auto base_logger = std::make_shared<logger>(false); // Sync mode for testing
75 base_logger->add_writer(std::make_unique<console_writer>());
76 base_logger->start();
77
78 // Test basic logging at different levels
79 base_logger->log(ci::log_level::info, std::string("User logged in - user_id: 12345, ip: 192.168.1.100"));
80 base_logger->log(ci::log_level::error, std::string("Database connection failed - host: db.example.com, port: 5432"));
81 base_logger->log(ci::log_level::debug, std::string("Retry attempt 3 of 5"));
82
83 base_logger->stop();
84}

Referenced by main().

Here is the caller graph for this function: