From 237ee00e7a1f2db99d55b135f1c1f50b35c489cc Mon Sep 17 00:00:00 2001 From: Antonio Souza Date: Mon, 26 Jan 2026 17:36:13 -0500 Subject: [PATCH 1/3] add log crate adapter behind feature flag Signed-off-by: Antonio Souza --- Cargo.lock | 1 + Cargo.toml | 6 ++++++ examples/log_adapter.rs | 13 +++++++++++++ src/level.rs | 28 ++++++++++++++++++++++++++++ src/lib.rs | 3 +++ src/log_adapter.rs | 20 ++++++++++++++++++++ src/logger.rs | 10 ++++++++++ 7 files changed, 81 insertions(+) create mode 100644 examples/log_adapter.rs create mode 100644 src/log_adapter.rs diff --git a/Cargo.lock b/Cargo.lock index 83986b5..f00905f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -158,6 +158,7 @@ name = "sheen" version = "0.2.0" dependencies = [ "chrono", + "log", "owo-colors", ] diff --git a/Cargo.toml b/Cargo.toml index 73978fc..0cdfe75 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,9 @@ categories = ["development-tools::debugging"] [dependencies] owo-colors = "4.2.3" chrono = { version = "0.4.43", default-features = false, features = ["clock"] } +# Log impl +log = { version = "0.4.29", optional = true, features = ["std"] } + + +[dev-dependencies] +log = "0.4.29" diff --git a/examples/log_adapter.rs b/examples/log_adapter.rs new file mode 100644 index 0000000..997b856 --- /dev/null +++ b/examples/log_adapter.rs @@ -0,0 +1,13 @@ +use sheen::{Level, Logger}; + +fn main() { + // sheen as the log backend + Logger::new().level(Level::Trace).init().unwrap(); + + // These are log crate macros, not sheen macros + log::trace!("starting up"); + log::debug!("loading configuration"); + log::info!("server listening on port 3000"); + log::warn!("cache is nearly full"); + log::error!("failed to connect to database"); +} diff --git a/src/level.rs b/src/level.rs index 2d9120d..cf3633a 100644 --- a/src/level.rs +++ b/src/level.rs @@ -19,6 +19,34 @@ impl Level { } } +// Converting log::Level to sheen::Level +#[cfg(feature = "log")] +impl From for Level { + fn from(level: log::Level) -> Self { + match level { + log::Level::Trace => Level::Trace, + log::Level::Debug => Level::Debug, + log::Level::Info => Level::Info, + log::Level::Warn => Level::Warn, + log::Level::Error => Level::Error, + } + } +} + +// reverse +#[cfg(feature = "log")] +impl From for log::LevelFilter { + fn from(level: Level) -> Self { + match level { + Level::Trace => log::LevelFilter::Trace, + Level::Debug => log::LevelFilter::Debug, + Level::Info => log::LevelFilter::Info, + Level::Warn => log::LevelFilter::Warn, + Level::Error => log::LevelFilter::Error, + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/lib.rs b/src/lib.rs index cc4422e..8388be3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,9 @@ mod level; mod logger; mod macros; +#[cfg(feature = "log")] +mod log_adapter; + pub use formatter::{Formatter, JsonFormatter, LogFmtFormatter, TextFormatter}; pub use global::{info, init, init_with}; pub use level::Level; diff --git a/src/log_adapter.rs b/src/log_adapter.rs new file mode 100644 index 0000000..24ebc03 --- /dev/null +++ b/src/log_adapter.rs @@ -0,0 +1,20 @@ +use crate::Logger; + +impl log::Log for Logger { + fn enabled(&self, metadata: &log::Metadata) -> bool { + self.enabled(metadata.level().into()) + } + fn log(&self, record: &log::Record) { + if !self.enabled(record.level().into()) { + return; + } + let msg = format!("{}", record.args()); + let target = record.target(); + self.log( + record.level().into(), + &msg, + &[("target", &target as &dyn std::fmt::Debug)], + ); + } + fn flush(&self) {} +} diff --git a/src/logger.rs b/src/logger.rs index d08d0b2..e8cb925 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -118,3 +118,13 @@ impl Default for Logger { } } } + +#[cfg(feature = "log")] +impl Logger { + pub fn init(self) -> Result<(), log::SetLoggerError> { + let max_level: log::LevelFilter = self.level.into(); + log::set_boxed_logger(Box::new(self))?; + log::set_max_level(max_level); + Ok(()) + } +} From ef5ab60acbc094c4696754fdb2ef0d838f14623c Mon Sep 17 00:00:00 2001 From: Antonio Souza Date: Mon, 26 Jan 2026 17:41:44 -0500 Subject: [PATCH 2/3] update readme and version bump Signed-off-by: Antonio Souza --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 29 ++++++++++++++++++++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f00905f..3b5138c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -155,7 +155,7 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "sheen" -version = "0.2.0" +version = "0.3.0" dependencies = [ "chrono", "log", diff --git a/Cargo.toml b/Cargo.toml index 0cdfe75..3da29d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sheen" -version = "0.2.0" +version = "0.3.0" edition = "2024" license = "MIT" repository = "https://github.com/arferreira/sheen" diff --git a/README.md b/README.md index 9394d11..46be54f 100644 --- a/README.md +++ b/README.md @@ -20,12 +20,20 @@ sheen is inspired by [charmbracelet/log](https://github.com/charmbracelet/log), - TTY detection (auto-disables colors when piped) - Builder pattern configuration - Zero config defaults +- `log` crate compatibility (optional feature flag) ## Installation ```toml [dependencies] -sheen = "0.2" +sheen = "0.3" +``` + +With `log` crate support: + +```toml +[dependencies] +sheen = { version = "0.3", features = ["log"] } ``` ## Quick Start @@ -90,6 +98,25 @@ Output: 14:32:15 INFO completed request_id="abc123" status=200 ``` +## Log Crate Integration + +Enable the `log` feature to use sheen as a backend for the [`log`](https://crates.io/crates/log) crate. This captures logs from any dependency that uses `log::info!()`, `log::warn!()`, etc. + +```rust +use sheen::{Logger, Level}; + +fn main() { + Logger::new() + .level(Level::Debug) + .init() + .unwrap(); + + // Standard log macros now go through sheen + log::info!("server started"); + log::warn!("cache nearly full"); +} +``` + ## Formatters ### Text (default) From 0b3f7b97fe8c30cbf84c7dd48708fa75e1817f7e Mon Sep 17 00:00:00 2001 From: Antonio Souza Date: Mon, 26 Jan 2026 17:45:14 -0500 Subject: [PATCH 3/3] add required features for example Signed-off-by: Antonio Souza --- Cargo.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 3da29d8..5f60565 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,3 +19,7 @@ log = { version = "0.4.29", optional = true, features = ["std"] } [dev-dependencies] log = "0.4.29" + +[[example]] +name = "log_adapter" +required-features = ["log"]