diff --git a/Cargo.toml b/Cargo.toml index 9413c5943..e1b38c772 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ futures-io = "0.3.19" hdrhistogram = { version = "7.2", default-features = false } hex-literal = "0.4" lazy_static = "1" +log = "0.4" once_cell = "1.19" pin-project-lite = "0.2" rand = "0.8" diff --git a/quinn-proto/Cargo.toml b/quinn-proto/Cargo.toml index 5b790b0d2..5ce7e916d 100644 --- a/quinn-proto/Cargo.toml +++ b/quinn-proto/Cargo.toml @@ -20,7 +20,7 @@ ring = ["dep:ring"] # Enable rustls ring provider and direct ring usage # Provides `ClientConfig::with_platform_verifier()` convenience method platform-verifier = ["dep:rustls-platform-verifier"] -# Write logs via the `log` crate when no `tracing` subscriber exists +# Configure `tracing` to log events via `log` if no `tracing` subscriber exists. log = ["tracing/log"] [dependencies] diff --git a/quinn-udp/Cargo.toml b/quinn-udp/Cargo.toml index 293080297..f739f11e4 100644 --- a/quinn-udp/Cargo.toml +++ b/quinn-udp/Cargo.toml @@ -14,14 +14,16 @@ workspace = ".." all-features = true [features] -default = ["log"] -# Write logs via the `log` crate when no `tracing` subscriber exists +default = ["tracing", "log"] +# Configure `tracing` to log events via `log` if no `tracing` subscriber exists. log = ["tracing/log"] +direct-log = ["dep:log"] [dependencies] libc = "0.2.113" +log = { workspace = true, optional = true } socket2 = { workspace = true } -tracing = { workspace = true } +tracing = { workspace = true, optional = true } [target.'cfg(windows)'.dependencies] once_cell = { workspace = true } diff --git a/quinn-udp/src/lib.rs b/quinn-udp/src/lib.rs index 4d8c5d404..0337b9c05 100644 --- a/quinn-udp/src/lib.rs +++ b/quinn-udp/src/lib.rs @@ -37,6 +37,9 @@ use std::{ time::{Duration, Instant}, }; +#[cfg(all(feature = "direct-log", not(feature = "tracing")))] +use log::warn; +#[cfg(feature = "tracing")] use tracing::warn; #[cfg(any(unix, windows))] @@ -126,6 +129,7 @@ const IO_ERROR_LOG_INTERVAL: Duration = std::time::Duration::from_secs(60); /// /// Logging will only be performed if at least [`IO_ERROR_LOG_INTERVAL`] /// has elapsed since the last error was logged. +#[cfg(any(feature = "tracing", feature = "direct-log"))] fn log_sendmsg_error( last_send_error: &Mutex, err: impl core::fmt::Debug, @@ -141,6 +145,10 @@ fn log_sendmsg_error( } } +// No-op +#[cfg(not(any(feature = "tracing", feature = "direct-log")))] +fn log_sendmsg_error(_: &Mutex, _: impl core::fmt::Debug, _: &Transmit) {} + /// A borrowed UDP socket /// /// On Unix, constructible via `From`. On Windows, constructible via `From 1 { + #[cfg(any(feature = "tracing", feature = "direct-log"))] error!("got transmit error, halting segmentation offload"); state .max_gso_segments diff --git a/quinn/Cargo.toml b/quinn/Cargo.toml index db421b434..add7bb7ce 100644 --- a/quinn/Cargo.toml +++ b/quinn/Cargo.toml @@ -27,7 +27,7 @@ runtime-tokio = ["tokio/time", "tokio/rt", "tokio/net"] runtime-async-std = ["async-io", "async-std"] runtime-smol = ["async-io", "smol"] -# Write logs via the `log` crate when no `tracing` subscriber exists +# Configure `tracing` to log events via `log` if no `tracing` subscriber exists. log = ["tracing/log", "proto/log", "udp/log"] [dependencies] @@ -45,7 +45,7 @@ socket2 = { workspace = true } thiserror = { workspace = true } tracing = { workspace = true } tokio = { workspace = true } -udp = { package = "quinn-udp", path = "../quinn-udp", version = "0.5", default-features = false } +udp = { package = "quinn-udp", path = "../quinn-udp", version = "0.5", default-features = false, features = ["tracing"] } [dev-dependencies] anyhow = { workspace = true }