autotoc_md1991
doc_id: "LOG-INTR-001" doc_title: "Logger System Integration Guide" doc_version: "1.0.0" doc_date: "2026-04-04" doc_status: "Released" project: "logger_system"
category: "INTR"
Logger System Integration Guide
SSOT: This document is the single source of truth for Logger System Integration Guide.
English | 한국어
Table of Contents
- Overview
- System Dependencies
- Integration with common_system
- Integration with thread_system
- Integration with monitoring_system
- Build Configuration
- Code Examples
- Result Handling Cheatsheet
- Error Code Registry
- Troubleshooting
Overview
The Logger System is designed to integrate seamlessly with the ecosystem while maintaining the ability to operate independently. This document provides comprehensive guidance on integrating logger_system with other system modules.
Integration Architecture:
common_system (interfaces) ← logger_system implements ILogger
↖ optional: inject IMonitor at runtime
↖ optional: use IExecutor for async ops
Key Integration Points:
- common_system: Provides
ILogger, Result<T>, error code registry
- thread_system: Provides async execution via adapters
- monitoring_system: Provides metrics collection via
IMonitor interface
System Dependencies
Required Dependencies
common_system (Header-only)
- Version: 0.1.0.0+
- Purpose: Core interfaces and error handling patterns
- Components Used:
ILogger interface implementation
Result<T> pattern for error handling
- Centralized error code registry
- Smart adapter patterns
CMake Configuration:
find_package(common_system CONFIG REQUIRED)
target_link_libraries(LoggerSystem PUBLIC kcenon::common_system)
Optional Dependencies
thread_system
- Version: 0.1.0.0+
- Purpose: Asynchronous logging operations
- Components Used:
IExecutor for async task submission
- Thread pool for background processing
- DI adapter for service integration
monitoring_system
- Version: 0.1.0.0+
- Purpose: Performance metrics and health monitoring
- Components Used:
IMonitor interface for metrics injection
- Performance counters
- Health check integration
Integration with common_system
ILogger Interface Implementation
The logger_system implements the ILogger interface defined in common_system:
#include <kcenon/common/interfaces/logger_interface.h>
class logger :
public common::interfaces::ILogger {
public:
auto log(log_level level,
const std::string& message) ->
void override;
auto set_level(log_level min_level) ->
void override;
auto is_enabled(log_level level)
const ->
bool override;
};
}
common::VoidResult set_level(common::interfaces::log_level level) override
Set the minimum log level (ILogger interface)
bool is_enabled(common::interfaces::log_level level) const override
Check if logging is enabled for the specified level (ILogger interface)
common::VoidResult log(common::interfaces::log_level level, const std::string &message) override
Log a message with specified level (ILogger interface)
Log level conversion between logger_system and common_system.
High-performance, thread-safe logging system with asynchronous capabilities.
Usage Example:
#include <kcenon/common/interfaces/logger_interface.h>
std::shared_ptr<common::interfaces::ILogger>
logger =
.
add_writer(
"console", std::make_unique<kcenon::logger::console_writer>())
.value();
logger->log(common::log_level::info,
"Application started");
Builder pattern for logger construction with validation.
logger_builder & use_template(const std::string &name)
result< std::unique_ptr< logger > > build()
logger_builder & add_writer(const std::string &name, log_writer_ptr writer)
Add a writer to the logger.
Builder pattern implementation for flexible logger configuration kcenon.
Result<T> Pattern Usage
Logger system uses Result<T> for comprehensive error handling:
#include <kcenon/common/patterns/result.h>
if (!result) {
auto error = result.error();
std::cerr << "Failed to create logger: " << error.message()
<< " (code: " << static_cast<int>(error.code()) << ")\n";
return -1;
}
auto logger = std::move(result.value());
logger_builder & with_buffer_size(std::size_t size)
Set buffer size.
Core Operations with Result<T>:
auto add_result =
logger->add_writer(
"file",
std::make_unique<kcenon::logger::file_writer>("app.log"));
if (add_result.is_err()) {
std::cerr << "Failed to add writer: "
<< add_result.error().message << "\n";
}
logger->log(kcenon::logger::log_level::info,
"Performance-critical message");
Adapter Pattern
Use adapters to bridge between logger_system and common_system interfaces:
.value();
auto common_logger = kcenon::logger::adapters::make_common_logger_adapter(
std::move(native_logger)
);
common_logger->log(common::log_level::info, "Using adapter pattern");
Integration with thread_system
Asynchronous Logging with IExecutor
Logger system can use IExecutor from common_system for async operations:
#include <kcenon/thread/core/thread_pool.h>
#include <kcenon/thread/adapters/common_executor_adapter.h>
auto thread_pool = std::make_shared<kcenon::thread::thread_pool>(4);
auto executor = kcenon::thread::adapters::make_common_executor(thread_pool);
.value();
Cross-System Integration
Complete example of DI integration across systems:
#include <kcenon/thread/core/thread_pool.h>
#include <kcenon/thread/interfaces/service_container.h>
.
add_writer(
"file", std::make_unique<kcenon::logger::file_writer>(
"app.log"))
.value();
kcenon::thread::service_container::global()
.register_singleton<kcenon::thread::logger_interface>(
logger);
auto context = kcenon::thread::thread_context();
auto pool = std::make_shared<kcenon::thread::thread_pool>("WorkerPool", context);
pool->start();
pool->submit_task([]() {
});
return 0;
}
Integration with monitoring_system
IMonitor Interface Injection
Logger system supports runtime injection of IMonitor for metrics collection:
#include <kcenon/monitoring/core/performance_monitor.h>
#include <kcenon/common/interfaces/monitoring_interface.h>
auto monitor = kcenon::monitoring::create_performance_monitor();
.value();
logger->set_monitor(monitor.get());
logger->log(kcenon::logger::log_level::info,
"Application started");
logger->log(kcenon::logger::log_level::error,
"Connection failed");
auto metrics = monitor->collect_metrics();
std::cout << "Total logs: " << metrics["log_count"].value << std::endl;
std::cout << "Error logs: " << metrics["error_count"].value << std::endl;
Performance Metrics Collection
Logger system exposes built-in metrics:
logger->enable_metrics_collection(
true);
for (int i = 0; i < 1000; ++i) {
logger->log(log_level::info,
"Test message");
}
auto metrics =
logger->get_current_metrics();
std::cout << "Messages per second: " << metrics.get_messages_per_second() << "\n";
std::cout << "Average enqueue time: " << metrics.get_avg_enqueue_time_ns() << " ns\n";
std::cout << "Queue utilization: " << metrics.get_queue_utilization_percent() << "%\n";
Logger performance metrics and monitoring.
Health Monitoring Integration
#include <kcenon/common/interfaces/monitoring_interface.h>
.value();
std::cout << "Logger is healthy\n";
} else {
std::cerr << "Logger health check failed\n";
}
logger_builder & with_monitoring(std::shared_ptr< common::interfaces::IMonitor > monitor)
Set monitoring interface (Phase 2.2.4)
Build Configuration
CMake Integration Examples
Minimal Configuration (common_system only)
cmake_minimum_required(VERSION 3.16)
project(MyApp)
# Find logger_system
find_package(LoggerSystem CONFIG REQUIRED)
add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE LoggerSystem::logger)
Full Ecosystem Integration
cmake_minimum_required(VERSION 3.16)
project(MyApp)
# Find all systems
find_package(common_system CONFIG REQUIRED)
find_package(thread_system CONFIG REQUIRED)
find_package(LoggerSystem CONFIG REQUIRED)
find_package(monitoring_system CONFIG QUIET)
add_executable(myapp main.cpp)
# Link in dependency order
target_link_libraries(myapp PRIVATE
kcenon::common_system # Foundation
kcenon::thread_system # Core systems
LoggerSystem::logger # Service systems
)
# Optional monitoring integration
if(monitoring_system_FOUND)
target_link_libraries(myapp PRIVATE kcenon::monitoring_system)
target_compile_definitions(myapp PRIVATE USE_MONITORING)
endif()
Build Configuration Flags
Configure logger_system features via CMake options:
# Core Features
cmake -DLOGGER_USE_DI=ON # Enable dependency injection (default: ON)
cmake -DLOGGER_USE_MONITORING=ON # Enable monitoring support (default: ON)
cmake -DLOGGER_ENABLE_ASYNC=ON # Enable async logging (default: ON)
# Integration Options
cmake -DBUILD_WITH_COMMON_SYSTEM=ON # Enable common_system integration (default: ON)
cmake -DUSE_THREAD_SYSTEM=ON # Use thread_system if available (default: ON)
cmake -DLOGGER_STANDALONE_MODE=OFF # Standalone mode without integrations (default: OFF)
# Performance Tuning
cmake -DLOGGER_DEFAULT_BUFFER_SIZE=16384 # Buffer size in bytes
cmake -DLOGGER_DEFAULT_BATCH_SIZE=200 # Batch processing size
cmake -DLOGGER_DEFAULT_QUEUE_SIZE=20000 # Maximum queue size
# Quality Assurance
cmake -DLOGGER_ENABLE_SANITIZERS=ON # Enable sanitizers
cmake -DLOGGER_ENABLE_COVERAGE=ON # Enable code coverage
cmake -DLOGGER_WARNINGS_AS_ERRORS=ON # Treat warnings as errors
vcpkg Integration
Use vcpkg for dependency management:
{
"name": "myapp",
"version": "1.0.0",
"dependencies": [
"common-system",
"thread-system",
"logger-system"
]
}
Code Examples
Example 1: Basic Integration with common_system
#include <kcenon/common/patterns/result.h>
.
add_writer(
"console", std::make_unique<kcenon::logger::console_writer>())
if (!result) {
std::cerr << "Logger creation failed: "
<< result.error().message() << "\n";
return -1;
}
auto logger = std::move(result.value());
logger->log(kcenon::logger::log_level::info,
"Application started");
return 0;
}
logger_builder & with_min_level(log_level level)
Console writer for logging to stdout/stderr.
Example 2: Full Stack Integration
#include <kcenon/thread/core/thread_pool.h>
#include <kcenon/monitoring/core/performance_monitor.h>
#include <kcenon/common/interfaces/logger_interface.h>
#include <kcenon/common/interfaces/monitoring_interface.h>
auto monitor = kcenon::monitoring::create_performance_monitor();
.
add_writer(
"file", std::make_unique<kcenon::logger::file_writer>(
"app.log"))
.value();
logger->set_monitor(monitor.get());
auto pool = kcenon::thread::create_thread_pool(4);
logger->log(kcenon::logger::log_level::info,
"Task executed");
});
auto metrics = monitor->collect_metrics();
std::cout << "Total logs: " << metrics["log_count"].value << "\n";
return 0;
}
Example 3: Error Handling with Result<T>
#include <kcenon/common/patterns/result.h>
create_configured_logger(const std::string& config_file) {
.
add_writer(
"file", std::make_unique<kcenon::logger::file_writer>(
"app.log"))
if (!result) {
result.error().code(),
std::format("Failed to create logger from config '{}': {}",
config_file, result.error().message()),
"logger_factory"
);
}
}
auto logger_result = create_configured_logger("config.json");
if (!logger_result) {
std::cerr << "Error: " << logger_result.error().message() << "\n";
return -1;
}
auto logger = std::move(logger_result.value());
logger->log(kcenon::logger::log_level::info,
"Logger configured successfully");
return 0;
}
Result< T > error(error_info info)
Result Handling Cheatsheet
- Prefer
result.is_err() / result.error() for every public API: legacy .get_error() is maintained only for backward compatibility.
- Bubble up failures with
return Result<void>::err(result.error()); to avoid losing diagnostic context.
- When orchestrating several operations, capture both
err.code and err.module for log filtering.
auto add_writer_result =
logger->add_writer(
"network", std::move(writer));
if (add_writer_result.is_err()) {
const auto& err = add_writer_result.error();
log_error("writer_add_failed",
fmt::format("[{}] code={} message={}",
err.module, err.code, err.message));
return Result<void>::err(err);
}
Error Code Registry
Allocated Error Code Range
Logger system uses error codes -200 to -299 in the centralized error code registry:
logger_not_initialized = -200,
logger_already_started = -201,
logger_not_started = -202,
logger_shutdown = -203,
writer_add_failed = -212,
writer_remove_failed = -213,
invalid_writer = -214,
invalid_config = -220,
invalid_buffer_size = -221,
invalid_batch_size = -222,
invalid_queue_size = -223,
config_validation_failed = -224,
write_failed = -230,
flush_failed = -231,
};
}
logger_error_code error_code
Error Message Mapping
switch (code) {
case kcenon::logger::error_code::logger_not_initialized:
return "Logger not initialized";
case kcenon::logger::error_code::invalid_buffer_size:
return "Invalid buffer size (must be > 0)";
return "Logger queue is full";
default:
return "Unknown error";
}
}
Error codes specific to the logger system.
logger_error_code
Error codes specific to the logger system.
Troubleshooting
Build Fails with "common_system not found"
Problem: CMake cannot find common_system
Solution 1: Ensure common_system is in a sibling directory
/path/to/systems/
├── common_system/
├── logger_system/
└── your_project/
Solution 2: Use FetchContent (automatic in logger_system)
# logger_system CMakeLists.txt automatically uses FetchContent
# if common_system is not found locally
Solution 3: Install common_system system-wide
cd common_system
cmake -B build -DCMAKE_INSTALL_PREFIX=/usr/local
cmake --build build
sudo cmake --install build
Linker Errors: Undefined References
Problem: Linking fails with undefined symbol errors
Solution: Ensure proper link order
target_link_libraries(MyApp PRIVATE
kcenon::common_system # Foundation (first)
kcenon::thread_system # Core systems
LoggerSystem::logger # Service systems
kcenon::monitoring_system # Optional systems (last)
)
Runtime: Logger Not Outputting
Problem: Logger created but no output visible
Solution: Check configuration and flush
.
add_writer(
"console", std::make_unique<console_writer>())
.value();
Integration: IMonitor Not Injecting
Problem: Monitoring metrics not being recorded
Solution: Verify monitoring is enabled and injected
#define LOGGER_USE_MONITORING
logger->set_monitor(monitor.get());
std::cout << "Monitoring active\n";
}
Performance: High Latency
Problem: Logging operations taking too long
Solution: Tune performance parameters
# Increase batch size for throughput
cmake -DLOGGER_DEFAULT_BATCH_SIZE=500
# Increase buffer size for large messages
cmake -DLOGGER_DEFAULT_BUFFER_SIZE=65536
# Increase queue size to reduce drops
cmake -DLOGGER_DEFAULT_QUEUE_SIZE=50000
Best Practices
1. Use Result<T> for Error Handling
Always check Result<T> return values:
auto result = logger_builder().build();
if (!result) {
handle_error(result.error());
return;
}
auto logger = logger_builder().build().value();
2. Prefer Interface-Based Design
Use common interfaces for flexibility:
std::shared_ptr<common::interfaces::ILogger>
logger = create_logger();
std::shared_ptr<kcenon::logger::logger>
logger = create_logger();
3. Leverage DI for Testing
Use dependency injection for testability:
class MyService {
std::shared_ptr<common::interfaces::ILogger> logger_;
public:
MyService(std::shared_ptr<common::interfaces::ILogger>
logger)
: logger_(std::move(
logger)) {}
};
auto mock_logger = std::make_shared<MockLogger>();
MyService service(mock_logger);
4. Monitor Performance in Production
Enable metrics in production builds:
logger->enable_metrics_collection(
true);
auto metrics =
logger->get_current_metrics();
if (metrics.get_queue_utilization_percent() > 80) {
}
References
- logger_system README.md - Project overview
- STRUCTURE.md - Directory structure and organization
- common_system ARCHITECTURE.md - Common system architecture
- common_system INTEGRATION.md - Integration patterns