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};