Skip to content

Architecture

LogXide leverages Rust's performance and safety with Python's ease of use through a sophisticated async architecture.

Core Architecture

┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   Python API    │    │   Rust Core      │    │  Tokio Runtime  │
│                 │    │                  │    │                 │
│ ┌─────────────┐ │    │ ┌──────────────┐ │    │ ┌─────────────┐ │
│ │ PyLogger    │ │───▶│ │ LogRecord    │ │───▶│ │ Async       │ │
│ │ Methods     │ │    │ │ Creation     │ │    │ │ Handlers    │ │
│ └─────────────┘ │    │ └──────────────┘ │    │ └─────────────┘ │
│                 │    │                  │    │                 │
│ ┌─────────────┐ │    │ ┌──────────────┐ │    │ ┌─────────────┐ │
│ │ basicConfig │ │───▶│ │ Channel      │ │───▶│ │ Concurrent  │ │
│ │ flush()     │ │    │ │ Management   │ │    │ │ Processing  │ │
│ └─────────────┘ │    │ └──────────────┘ │    │ └─────────────┘ │
└─────────────────┘    └──────────────────┘    └─────────────────┘

Message Processing Flow

  1. Python Call → LogXide PyLogger methods
  2. Record Creation → Rust LogRecord with full metadata
  3. Async Channel → Non-blocking message passing to Tokio runtime
  4. Concurrent Processing → Multiple handlers execute in parallel
  5. Output → Formatted messages to files/streams/handlers

Key Components

PyO3 Integration

  • Zero-copy data transfer between Python and Rust
  • Native Python objects for seamless integration
  • Exception handling that preserves Python semantics

Async Message Processing

  • Non-blocking channels with 1024-capacity buffers
  • Tokio runtime with dedicated thread pool
  • Backpressure handling for high-throughput scenarios

Concurrent Handlers

  • Parallel execution for maximum throughput
  • Handler isolation prevents one handler from blocking others
  • Error resilience ensures continued operation

Memory Management

  • Rust's ownership system prevents memory leaks
  • Arc-based sharing for efficient data sharing
  • Minimal allocations in hot paths

Performance Optimizations

Lock-Free Design

  • Atomic operations for shared state
  • Channel-based communication eliminates locks
  • Thread-local buffers where possible

Efficient String Handling

  • Rust's formatter for fast string processing
  • String interning for repeated logger names
  • Copy-on-write semantics for format strings

Async I/O

  • Non-blocking file operations
  • Batched writes for improved throughput
  • Async flush operations

Thread Safety

LogXide is designed from the ground up for multi-threaded applications:

  • Thread-safe logger instances can be shared across threads
  • Async runtime handles concurrent access automatically
  • No global locks that could cause contention
  • Per-thread optimization where beneficial

Handler Architecture

┌─────────────────┐
│ Handler Registry│
├─────────────────┤
│ ┌─────────────┐ │
│ │FileHandler  │ │───┐
│ └─────────────┘ │   │
│ ┌─────────────┐ │   │    ┌──────────────┐
│ │StreamHandler│ │───┼───▶│ Concurrent   │
│ └─────────────┘ │   │    │ Execution    │
│ ┌─────────────┐ │   │    └──────────────┘
│ │CustomHandler│ │───┘
│ └─────────────┘ │
└─────────────────┘

Handler Types

  • ConsoleHandler: Optimized console output
  • FileHandler: Async file writing with buffering
  • RotatingFileHandler: Automatic log rotation
  • PythonHandler: Bridge to Python-based handlers

Memory Layout

Log Record Structure

pub struct LogRecord {
    pub logger_name: String,
    pub level: LogLevel,
    pub message: String,
    pub timestamp: SystemTime,
    pub thread_id: u64,
    pub thread_name: Option<String>,
    // ... additional metadata
}

Channel Architecture

// Unbounded channel for maximum throughput
crossbeam::channel::unbounded::<LogMessage>()

// Message types
enum LogMessage {
    Record(Box<LogRecord>),
    Flush(oneshot::Sender<()>),
}

Comparison with Standard Logging

Aspect Python logging LogXide
Threading Global locks Lock-free
I/O Synchronous Asynchronous
Memory GC overhead Zero-copy where possible
Error handling Exceptions can block Isolated error handling
Performance Single-threaded bottlenecks Concurrent processing

Future Architecture Plans

Planned Optimizations

  • SIMD string processing for format operations
  • Memory pooling for log record allocation
  • Adaptive batching based on throughput
  • Custom allocators for specific use cases

Plugin Architecture

  • Handler plugins for custom output formats
  • Filter plugins for advanced message filtering
  • Formatter plugins for domain-specific formatting

Best Practices

For High Performance

  1. Use async handlers when possible
  2. Avoid frequent logger creation
  3. Use appropriate buffer sizes
  4. Consider message batching for extreme throughput

For Reliability

  1. Handle handler errors gracefully
  2. Monitor channel capacity
  3. Use flush() for critical messages
  4. Test under load conditions

For Memory Efficiency

  1. Reuse logger instances
  2. Avoid large format strings
  3. Use string interning for repeated values
  4. Monitor memory usage in long-running processes