Skip to main content

reovim_driver_log/
lib.rs

1#![cfg_attr(coverage_nightly, allow(unused_features))]
2#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
3//! Logging driver for reovim.
4//!
5//! This driver implements the kernel's `Logger` trait using the tracing ecosystem.
6//! It bridges kernel `pr_*!` macros to tracing subscribers.
7//!
8//! # Architecture
9//!
10//! Following Linux kernel design (mechanism vs policy):
11//! - **Kernel provides mechanism**: `Logger` trait, `Level`, `Record`, `pr_*!` macros
12//! - **This driver provides policy**: Where logs go, formatting, filtering
13//!
14//! ```text
15//! ┌─────────────────────────────────────────────────────────────────┐
16//! │                         User Code                                │
17//! │   pr_info!("buffer {} opened", id);                              │
18//! └─────────────────────────────────────────────────────────────────┘
19//!                               │
20//!                               ▼
21//! ┌─────────────────────────────────────────────────────────────────┐
22//! │                     Kernel (printk/)                             │
23//! │   Level │ Record │ Logger trait │ Global OnceLock                │
24//! └─────────────────────────────────────────────────────────────────┘
25//!                               │
26//!                               ▼
27//! ┌─────────────────────────────────────────────────────────────────┐
28//! │                 Driver (drivers/log/)                            │
29//! │   TracingLogger │ LogConfig │ init_logging()                     │
30//! └─────────────────────────────────────────────────────────────────┘
31//!                               │
32//!                               ▼
33//! ┌─────────────────────────────────────────────────────────────────┐
34//! │                     tracing ecosystem                            │
35//! │   tracing │ tracing-subscriber │ tracing-appender                │
36//! └─────────────────────────────────────────────────────────────────┘
37//! ```
38//!
39//! # Usage
40//!
41//! ```rust,ignore
42//! use reovim_driver_log::{TracingLogger, init_logging, LogConfig};
43//! use reovim_kernel::api::v1::set_logger;
44//!
45//! // Step 1: Initialize tracing subscriber
46//! let config = LogConfig::default();
47//! init_logging(&config)?;
48//!
49//! // Step 2: Set TracingLogger as global kernel logger
50//! static LOGGER: TracingLogger = TracingLogger;
51//! set_logger(&LOGGER)?;
52//!
53//! // Step 3: Now pr_*! macros route to tracing
54//! pr_info!("editor started");
55//! pr_debug!("buffer count: {}", 5);
56//! ```
57//!
58//! # Environment Variable
59//!
60//! Set `REOVIM_LOG` to control log level (overrides `LogConfig.level`):
61//!
62//! ```bash
63//! REOVIM_LOG=debug reovim myfile.txt
64//! REOVIM_LOG=trace reovim --log=- myfile.txt
65//! REOVIM_LOG=reovim_kernel=trace,warn reovim myfile.txt  # Fine-grained control
66//! ```
67//!
68//! # Output Formats
69//!
70//! - **Plain**: `2024-01-15T10:30:00Z INFO file.rs:42 message`
71//! - **JSON**: `{"timestamp":"...","level":"INFO","target":"...","message":"..."}`
72//! - **Pretty**: Colorized output for terminal (development)
73//!
74//! # File Rotation
75//!
76//! When using `LogOutput::File`, log files can be rotated:
77//! - `RotationPolicy::Never` - Single file
78//! - `RotationPolicy::Daily` - Rotate at midnight UTC
79//! - `RotationPolicy::Hourly` - Rotate every hour
80
81mod config;
82mod logger;
83mod subscriber;
84
85// Configuration types
86pub use config::{LogConfig, LogFormat, LogOutput, RotationPolicy};
87
88// Logger implementation
89pub use logger::{TracingLogger, from_tracing_level, to_tracing_level};
90
91// Subscriber setup
92pub use subscriber::{LogError, init_logging};
93
94// Re-export kernel types for convenience
95pub use reovim_kernel::api::v1::{Level, Logger, set_logger};