Logger System 1.0.0
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.
 
void set_integrity_policy (std::shared_ptr< security::integrity_policy > policy)
 Enable tamper-evident integrity signing for every console record.
 
- 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::shared_ptr< security::integrity_policyintegrity_policy_
 
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 48 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 26 of file console_writer.cpp.

29 : use_stderr_(use_stderr)
30 , formatter_(formatter ? std::move(formatter) : std::make_unique<timestamp_formatter>()) {
31 if (auto_detect_color) {
33 } else {
34 // Apply color setting to formatter
35 auto opts = formatter_->get_options();
36 opts.use_colors = use_color_;
37 formatter_->set_options(opts);
38 }
39}
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 41 of file console_writer.cpp.

41 {
42 flush();
43}
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 104 of file console_writer.cpp.

104 {
105 std::lock_guard<std::mutex> lock(mutex_);
107 std::cout.flush();
108 std::cerr.flush();
109
110 if (std::cout.fail() || std::cerr.fail()) {
111 return make_logger_void_result(logger_error_code::flush_timeout, "Console flush failed");
112 }
113
114 return common::ok();
116}
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 146 of file console_writer.cpp.

146 {
147 if (!formatter_) {
148 // Fallback if formatter is somehow null
149 return entry.message.to_string();
150 }
151 return formatter_->format(entry);
152}

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 132 of file console_writer.h.

132{ 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 87 of file console_writer.h.

87{ 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 154 of file console_writer.cpp.

154 {
155#ifdef _WIN32
156 // Check if running in Windows Terminal or if ANSI is enabled
157 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
158 if (hOut == INVALID_HANDLE_VALUE) {
159 return false;
160 }
161
162 DWORD dwMode = 0;
163 if (!GetConsoleMode(hOut, &dwMode)) {
164 return false;
165 }
166
167 // Check for ENABLE_VIRTUAL_TERMINAL_PROCESSING flag
168 return (dwMode & 0x0004) != 0;
169#else
170 // Check if output is to a terminal and TERM is set
171 const char* term = std::getenv("TERM");
172 return isatty(STDOUT_FILENO) && term && std::string(term) != "dumb";
173#endif
174}

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 118 of file console_writer.cpp.

118 {
119 return std::cout.good() && std::cerr.good();
120}

◆ 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_integrity_policy()

void kcenon::logger::console_writer::set_integrity_policy ( std::shared_ptr< security::integrity_policy > policy)

Enable tamper-evident integrity signing for every console record.

Parameters
policySigning policy (shared ownership); pass nullptr to disable.

When a policy is installed, each emitted line is suffixed with a SIGNATURE[<policy>]:<hex> token (Issue #612). Consumers piping the console output to a log collector can re-verify each record.

Definition at line 140 of file console_writer.cpp.

141 {
142 std::lock_guard<std::mutex> lock(mutex_);
143 integrity_policy_ = std::move(policy);
144}
std::shared_ptr< security::integrity_policy > integrity_policy_

References integrity_policy_, and mutex_.

◆ 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 127 of file console_writer.cpp.

127 {
129 if (formatter_) {
130 auto opts = formatter_->get_options();
131 opts.use_colors = use_color_;
132 formatter_->set_options(opts);
133 }
134}
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 122 of file console_writer.cpp.

122 {
123 std::lock_guard<std::mutex> lock(mutex_);
124 use_stderr_ = use_stderr;
125}

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 136 of file console_writer.cpp.

136 {
137 return use_color_;
138}

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 45 of file console_writer.cpp.

45 {
46 std::lock_guard<std::mutex> lock(mutex_);
48 // Convert logger_system::log_level to common::interfaces::log_level for comparison
49 auto level = static_cast<common::interfaces::log_level>(static_cast<int>(entry.level));
50
51 // Route error/fatal to stderr; everything less severe to stdout.
52 // log_level values are ordered by severity (trace=0 ... fatal=5),
53 // so >= error selects the high-severity bucket.
54 auto& stream = (use_stderr_ || level >= common::interfaces::log_level::error)
55 ? std::cerr : std::cout;
56
57 if (use_color()) {
58 // Simple color mapping based on level
59 switch (level) {
60 case common::interfaces::log_level::fatal:
61 case common::interfaces::log_level::error:
62 stream << "\033[31m"; // Red
63 break;
64 case common::interfaces::log_level::warning:
65 stream << "\033[33m"; // Yellow
66 break;
67 case common::interfaces::log_level::info:
68 stream << "\033[32m"; // Green
69 break;
70 case common::interfaces::log_level::debug:
71 stream << "\033[36m"; // Cyan
72 break;
73 case common::interfaces::log_level::trace:
74 stream << "\033[37m"; // White
75 break;
76 default:
77 break;
78 }
79 }
80
81 std::string formatted = format_entry(entry);
82
83 // Append tamper-evident signature (Issue #612) when configured.
84 // Color reset is emitted first so the signature is never colorized
85 // and stays machine-readable by downstream collectors.
86 stream << formatted;
87
88 if (use_color()) {
89 stream << "\033[0m"; // Reset color
90 }
91
94 *integrity_policy_, formatted);
95 }
96
97 stream << '\n';
98
99 // Verify stream state
100 return utils::check_stream_state(stream, "console write");
102}
std::string format_entry(const log_entry &entry) const
Format a log entry using the current formatter.
std::string format_signature_suffix(const integrity_policy &policy, const std::string &record)
Format a signature line suitable for appending to a text log record.
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::security::format_signature_suffix(), integrity_policy_, 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 144 of file console_writer.h.

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

◆ integrity_policy_

std::shared_ptr<security::integrity_policy> kcenon::logger::console_writer::integrity_policy_
private

Definition at line 145 of file console_writer.h.

Referenced by set_integrity_policy(), and write().

◆ mutex_

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

Definition at line 146 of file console_writer.h.

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

◆ use_color_

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

Definition at line 143 of file console_writer.h.

143{true};

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

◆ use_stderr_

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

Definition at line 142 of file console_writer.h.

Referenced by set_use_stderr(), and write().


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