Logger System 0.1.3
High-performance C++20 thread-safe logging system with asynchronous capabilities
Loading...
Searching...
No Matches
kcenon::logger::console_writer Class Reference

Core console writer for logging to stdout/stderr. More...

#include <console_writer.h>

Inheritance diagram for kcenon::logger::console_writer:
Inheritance graph
Collaboration diagram for kcenon::logger::console_writer:
Collaboration graph

Public Member Functions

 console_writer (bool use_stderr=false, bool auto_detect_color=true, std::unique_ptr< log_formatter_interface > formatter=nullptr)
 Constructor.
 
 ~console_writer () override
 Destructor.
 
 console_writer (const console_writer &)=delete
 
console_writeroperator= (const console_writer &)=delete
 
 console_writer (console_writer &&)=delete
 
console_writeroperator= (console_writer &&)=delete
 
common::VoidResult write (const log_entry &entry) override
 Write a log entry to console.
 
common::VoidResult flush () override
 Flush console streams.
 
std::string get_name () const override
 Get writer name.
 
bool is_healthy () const override
 Check if writer is healthy.
 
void set_use_stderr (bool use_stderr)
 Set whether to use stderr for all output.
 
void set_use_color (bool use_color)
 Set whether to use color output (if supported)
 
bool use_color () const
 Get current color output setting.
 
- Public Member Functions inherited from kcenon::logger::log_writer_interface
virtual ~log_writer_interface ()=default
 
virtual common::VoidResult close ()
 Close the writer and release resources.
 
virtual auto is_open () const -> bool
 Check if writer is open and ready.
 

Protected Member Functions

std::string format_entry (const log_entry &entry) const
 Format a log entry using the current formatter.
 
std::mutex & get_mutex () const
 Access the writer mutex for extended operations.
 

Private Member Functions

bool is_color_supported () const
 Check if terminal supports color.
 

Private Attributes

bool use_stderr_
 
bool use_color_ {true}
 
std::unique_ptr< log_formatter_interfaceformatter_
 
std::mutex mutex_
 

Additional Inherited Members

- Static Public Attributes inherited from kcenon::logger::sync_writer_tag
static constexpr writer_category category = writer_category::synchronous
 

Detailed Description

Core console writer for logging to stdout/stderr.

Pure console I/O implementation with direct mutex management. Designed to serve as the base layer in Decorator pattern compositions.

Features:

  • Color support for different log levels (if terminal supports it)
  • Thread-safe console output with internal mutex synchronization
  • Error levels go to stderr, others to stdout

Category: Synchronous (blocking I/O to console)

Since
1.0.0
1.3.0 Refactored to use thread_safe_writer base class
1.4.0 Added sync_writer_tag for category classification
4.0.0 Refactored for Decorator pattern with simplified inheritance
4.1.0 Directly implements log_writer_interface as core writer
Examples
composite_writer_example.cpp, and decorator_usage.cpp.

Definition at line 46 of file console_writer.h.

Constructor & Destructor Documentation

◆ console_writer() [1/3]

kcenon::logger::console_writer::console_writer ( bool use_stderr = false,
bool auto_detect_color = true,
std::unique_ptr< log_formatter_interface > formatter = nullptr )
explicit

Constructor.

Parameters
use_stderrIf true, all output goes to stderr (default: false)
auto_detect_colorAuto-detect terminal color support (default: true)
formatterCustom log formatter (default: timestamp formatter)

Definition at line 25 of file console_writer.cpp.

28 : use_stderr_(use_stderr)
29 , formatter_(formatter ? std::move(formatter) : std::make_unique<timestamp_formatter>()) {
30 if (auto_detect_color) {
32 } else {
33 // Apply color setting to formatter
34 auto opts = formatter_->get_options();
35 opts.use_colors = use_color_;
36 formatter_->set_options(opts);
37 }
38}
bool is_color_supported() const
Check if terminal supports color.
std::unique_ptr< log_formatter_interface > formatter_
void set_use_color(bool use_color)
Set whether to use color output (if supported)

References formatter_, is_color_supported(), set_use_color(), and use_color_.

Here is the call graph for this function:

◆ ~console_writer()

kcenon::logger::console_writer::~console_writer ( )
override

Destructor.

Definition at line 40 of file console_writer.cpp.

40 {
41 flush();
42}
common::VoidResult flush() override
Flush console streams.

References flush().

Here is the call graph for this function:

◆ console_writer() [2/3]

kcenon::logger::console_writer::console_writer ( const console_writer & )
delete

◆ console_writer() [3/3]

kcenon::logger::console_writer::console_writer ( console_writer && )
delete

Member Function Documentation

◆ flush()

common::VoidResult kcenon::logger::console_writer::flush ( )
overridevirtual

Flush console streams.

Returns
common::VoidResult Success or error code

Implements kcenon::logger::log_writer_interface.

Definition at line 90 of file console_writer.cpp.

90 {
91 std::lock_guard<std::mutex> lock(mutex_);
93 std::cout.flush();
94 std::cerr.flush();
95
96 if (std::cout.fail() || std::cerr.fail()) {
97 return make_logger_void_result(logger_error_code::flush_timeout, "Console flush failed");
98 }
99
100 return common::ok();
102}
VoidResult ok()
common::VoidResult try_write_operation(F &&operation, logger_error_code default_error_code=logger_error_code::file_write_failed)
Error handling helper for write operations.
common::VoidResult make_logger_void_result(logger_error_code code, const std::string &message="")

References kcenon::logger::flush_timeout, kcenon::logger::make_logger_void_result(), mutex_, kcenon::common::ok(), and kcenon::logger::utils::try_write_operation().

Referenced by ~console_writer().

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

◆ format_entry()

std::string kcenon::logger::console_writer::format_entry ( const log_entry & entry) const
protected

Format a log entry using the current formatter.

Definition at line 126 of file console_writer.cpp.

126 {
127 if (!formatter_) {
128 // Fallback if formatter is somehow null
129 return entry.message.to_string();
130 }
131 return formatter_->format(entry);
132}

References formatter_, kcenon::logger::log_entry::message, and kcenon::logger::small_string< SSO_SIZE >::to_string().

Referenced by write().

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

◆ get_mutex()

std::mutex & kcenon::logger::console_writer::get_mutex ( ) const
inlineprotected

Access the writer mutex for extended operations.

Returns
Reference to the internal mutex

Definition at line 120 of file console_writer.h.

120{ return mutex_; }

◆ get_name()

std::string kcenon::logger::console_writer::get_name ( ) const
inlineoverridevirtual

Get writer name.

Implements kcenon::logger::log_writer_interface.

Examples
decorator_usage.cpp.

Definition at line 85 of file console_writer.h.

85{ return "console"; }

Referenced by example_core_writers().

Here is the caller graph for this function:

◆ is_color_supported()

bool kcenon::logger::console_writer::is_color_supported ( ) const
private

Check if terminal supports color.

Returns
true if color is supported

Definition at line 134 of file console_writer.cpp.

134 {
135#ifdef _WIN32
136 // Check if running in Windows Terminal or if ANSI is enabled
137 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
138 if (hOut == INVALID_HANDLE_VALUE) {
139 return false;
140 }
141
142 DWORD dwMode = 0;
143 if (!GetConsoleMode(hOut, &dwMode)) {
144 return false;
145 }
146
147 // Check for ENABLE_VIRTUAL_TERMINAL_PROCESSING flag
148 return (dwMode & 0x0004) != 0;
149#else
150 // Check if output is to a terminal and TERM is set
151 const char* term = std::getenv("TERM");
152 return isatty(STDOUT_FILENO) && term && std::string(term) != "dumb";
153#endif
154}

Referenced by console_writer().

Here is the caller graph for this function:

◆ is_healthy()

bool kcenon::logger::console_writer::is_healthy ( ) const
overridevirtual

Check if writer is healthy.

Implements kcenon::logger::log_writer_interface.

Definition at line 104 of file console_writer.cpp.

104 {
105 return std::cout.good() && std::cerr.good();
106}

◆ operator=() [1/2]

console_writer & kcenon::logger::console_writer::operator= ( console_writer && )
delete

◆ operator=() [2/2]

console_writer & kcenon::logger::console_writer::operator= ( const console_writer & )
delete

◆ set_use_color()

void kcenon::logger::console_writer::set_use_color ( bool use_color)

Set whether to use color output (if supported)

Parameters
use_colortrue to enable color output, false to disable

Definition at line 113 of file console_writer.cpp.

113 {
115 if (formatter_) {
116 auto opts = formatter_->get_options();
117 opts.use_colors = use_color_;
118 formatter_->set_options(opts);
119 }
120}
bool use_color() const
Get current color output setting.

References formatter_, use_color(), and use_color_.

Referenced by console_writer().

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

◆ set_use_stderr()

void kcenon::logger::console_writer::set_use_stderr ( bool use_stderr)

Set whether to use stderr for all output.

Parameters
use_stderrEnable/disable stderr usage

Definition at line 108 of file console_writer.cpp.

108 {
109 std::lock_guard<std::mutex> lock(mutex_);
110 use_stderr_ = use_stderr;
111}

References mutex_, and use_stderr_.

◆ use_color()

bool kcenon::logger::console_writer::use_color ( ) const

Get current color output setting.

Returns
true if color output is enabled, false otherwise

Definition at line 122 of file console_writer.cpp.

122 {
123 return use_color_;
124}

References use_color_.

Referenced by set_use_color(), and write().

Here is the caller graph for this function:

◆ write()

common::VoidResult kcenon::logger::console_writer::write ( const log_entry & entry)
overridevirtual

Write a log entry to console.

Parameters
entryThe log entry to write
Returns
common::VoidResult Success or error code

Implements kcenon::logger::log_writer_interface.

Examples
composite_writer_example.cpp.

Definition at line 44 of file console_writer.cpp.

44 {
45 std::lock_guard<std::mutex> lock(mutex_);
47 // Convert logger_system::log_level to common::interfaces::log_level for comparison
48 auto level = static_cast<common::interfaces::log_level>(static_cast<int>(entry.level));
49
50 auto& stream = (use_stderr_ || level <= common::interfaces::log_level::error)
51 ? std::cerr : std::cout;
52
53 if (use_color()) {
54 // Simple color mapping based on level
55 switch (level) {
56 case common::interfaces::log_level::fatal:
57 case common::interfaces::log_level::error:
58 stream << "\033[31m"; // Red
59 break;
60 case common::interfaces::log_level::warning:
61 stream << "\033[33m"; // Yellow
62 break;
63 case common::interfaces::log_level::info:
64 stream << "\033[32m"; // Green
65 break;
66 case common::interfaces::log_level::debug:
67 stream << "\033[36m"; // Cyan
68 break;
69 case common::interfaces::log_level::trace:
70 stream << "\033[37m"; // White
71 break;
72 default:
73 break;
74 }
75 }
76
77 stream << format_entry(entry);
78
79 if (use_color()) {
80 stream << "\033[0m"; // Reset color
81 }
82
83 stream << '\n';
84
85 // Verify stream state
86 return utils::check_stream_state(stream, "console write");
88}
std::string format_entry(const log_entry &entry) const
Format a log entry using the current formatter.
common::VoidResult check_stream_state(const Stream &stream, const std::string &operation_name="operation")
Stream state verification helper.

References kcenon::logger::utils::check_stream_state(), format_entry(), kcenon::logger::log_entry::level, mutex_, kcenon::logger::processing_failed, kcenon::logger::utils::try_write_operation(), use_color(), and use_stderr_.

Referenced by main().

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

Member Data Documentation

◆ formatter_

std::unique_ptr<log_formatter_interface> kcenon::logger::console_writer::formatter_
private

Definition at line 132 of file console_writer.h.

Referenced by console_writer(), format_entry(), and set_use_color().

◆ mutex_

std::mutex kcenon::logger::console_writer::mutex_
mutableprivate

Definition at line 133 of file console_writer.h.

Referenced by flush(), set_use_stderr(), and write().

◆ use_color_

bool kcenon::logger::console_writer::use_color_ {true}
private

Definition at line 131 of file console_writer.h.

131{true};

Referenced by console_writer(), set_use_color(), and use_color().

◆ use_stderr_

bool kcenon::logger::console_writer::use_stderr_
private

Definition at line 130 of file console_writer.h.

Referenced by set_use_stderr(), and write().


The documentation for this class was generated from the following files: