24#include <kcenon/common/interfaces/logger_interface.h>
30namespace ci = kcenon::common::interfaces;
60 std::lock_guard<std::mutex> lock(
get_mutex());
68 std::lock_guard<std::mutex> lock(
get_mutex());
76 std::lock_guard<std::mutex> lock(
get_mutex());
125 for (
int i = 0; i <= static_cast<int>(kcenon::common::interfaces::log_level::trace); ++i) {
126 counts_[
static_cast<kcenon::common::interfaces::log_level
>(i)] = 0;
131 return "counted_console";
137 size_t get_count(kcenon::common::interfaces::log_level level)
const {
138 std::lock_guard<std::mutex> lock(
get_mutex());
140 return (it !=
counts_.end()) ? it->second : 0;
147 std::lock_guard<std::mutex> lock(
get_mutex());
149 for (
const auto& [level, count] :
counts_) {
159 std::lock_guard<std::mutex> lock(
get_mutex());
160 std::cout <<
"\n=== Log Statistics ===" << std::endl;
161 std::cout <<
"Fatal: " <<
counts_.at(kcenon::common::interfaces::log_level::fatal) << std::endl;
162 std::cout <<
"Error: " <<
counts_.at(kcenon::common::interfaces::log_level::error) << std::endl;
163 std::cout <<
"Warning: " <<
counts_.at(kcenon::common::interfaces::log_level::warning) << std::endl;
164 std::cout <<
"Info: " <<
counts_.at(kcenon::common::interfaces::log_level::info) << std::endl;
165 std::cout <<
"Debug: " <<
counts_.at(kcenon::common::interfaces::log_level::debug) << std::endl;
166 std::cout <<
"Trace: " <<
counts_.at(kcenon::common::interfaces::log_level::trace) << std::endl;
173 auto level =
static_cast<kcenon::common::interfaces::log_level
>(
static_cast<int>(entry.
level));
184 case kcenon::common::interfaces::log_level::fatal:
185 case kcenon::common::interfaces::log_level::error:
186 std::cerr <<
"\033[31m" << formatted <<
"\033[0m" << std::endl;
188 case kcenon::common::interfaces::log_level::warning:
189 std::cout <<
"\033[33m" << formatted <<
"\033[0m" << std::endl;
192 std::cout << formatted << std::endl;
196 if (level <= kcenon::common::interfaces::log_level::error) {
197 std::cerr << formatted << std::endl;
199 std::cout << formatted << std::endl;
213 mutable std::map<kcenon::common::interfaces::log_level, size_t>
counts_;
217 std::cout <<
"=== Custom Writer Example (thread_safe_writer) ===" << std::endl;
218 std::cout << std::endl;
221 std::cout <<
"--- Example 1: Memory Writer ---" << std::endl;
225 .
add_writer(
"memory", std::make_unique<memory_writer>())
229 std::cerr <<
"Failed to create logger" << std::endl;
236 logger->log(ci::log_level::info, std::string(
"First message"));
237 logger->log(ci::log_level::warning, std::string(
"Second message"));
238 logger->log(ci::log_level::error, std::string(
"Third message"));
240 std::cout <<
"Logged 3 messages to memory writer" << std::endl;
243 std::cout << std::endl;
246 std::cout <<
"--- Example 2: Counted Console Writer ---" << std::endl;
248 auto counted_writer = std::make_unique<counted_console_writer>();
249 auto* counted_ptr = counted_writer.get();
253 .
add_writer(
"counted", std::move(counted_writer))
257 std::cerr <<
"Failed to create logger" << std::endl;
264 logger->log(ci::log_level::debug, std::string(
"Debug message 1"));
265 logger->log(ci::log_level::debug, std::string(
"Debug message 2"));
266 logger->log(ci::log_level::info, std::string(
"Info message"));
267 logger->log(ci::log_level::warning, std::string(
"Warning message"));
268 logger->log(ci::log_level::error, std::string(
"Error message"));
271 counted_ptr->print_stats();
274 std::cout << std::endl;
275 std::cout <<
"=== Custom Writer Example Complete ===" << std::endl;
A console writer that counts messages per log level.
kcenon::common::VoidResult flush_impl() override
Implementation of flush operation (override in derived classes)
std::string get_name() const override
kcenon::common::VoidResult write_entry_impl(const log_entry &entry) override
Implementation of structured write operation (override in derived classes)
size_t total_count() const
Get total message count.
void print_stats() const
Print statistics summary.
size_t get_count(kcenon::common::interfaces::log_level level) const
Get count for a specific log level.
std::map< kcenon::common::interfaces::log_level, size_t > counts_
std::string format_log_entry(const log_entry &entry) const
Format a log entry using the current formatter.
bool use_color() const
Get current color output setting.
Builder pattern for logger construction with validation.
logger_builder & with_min_level(log_level level)
result< std::unique_ptr< logger > > build()
logger_builder & add_writer(const std::string &name, log_writer_ptr writer)
Add a writer to the logger.
Base class providing automatic thread-safety for writer implementations.
std::mutex & get_mutex() const
Access the writer mutex for extended operations.
A custom writer that stores log entries in memory.
kcenon::common::VoidResult flush_impl() override
Implementation of flush operation.
std::vector< std::string > entries_
size_t size() const
Get count of stored entries.
kcenon::common::VoidResult write_entry_impl(const log_entry &entry) override
Implementation of write operation.
std::vector< std::string > get_entries() const
Get all stored log entries.
std::string get_name() const override
void clear()
Clear all stored entries.
Console writer for logging to stdout/stderr.
Data structures for representing log entries and source locations kcenon.
Builder pattern implementation for flexible logger configuration kcenon.
Represents a single log entry with all associated metadata.
log_level level
Severity level of the log message.
Thread-safe base class for writer implementations kcenon.