mod channel_logger;
mod result_extensions;
#[cfg(feature = "setup")]
mod multi_logger;
#[cfg(feature = "setup")]
mod setup;
#[cfg(all(feature = "setup", target_arch = "wasm32"))]
mod web_logger;
pub use log::{Level, LevelFilter};
pub use result_extensions::ResultExt;
pub use tracing::{debug, error, info, trace, warn};
pub use log_once::{debug_once, error_once, info_once, log_once, trace_once, warn_once};
pub use channel_logger::*;
#[cfg(feature = "setup")]
pub use multi_logger::{add_boxed_logger, add_logger, MultiLoggerNotSetupError};
#[cfg(feature = "setup")]
pub use setup::setup_logging;
pub mod external {
pub use log;
}
const CRATES_AT_ERROR_LEVEL: &[&str] = &[
"zune_jpeg",
#[cfg(not(debug_assertions))]
"rustls",
];
const CRATES_AT_WARN_LEVEL: &[&str] = &[
"naga",
"wgpu_core",
"wgpu_hal",
];
const CRATES_AT_INFO_LEVEL: &[&str] = &[
"h2",
"hyper",
"ureq",
#[cfg(debug_assertions)]
"rustls",
];
#[cfg(not(target_arch = "wasm32"))]
pub fn default_log_filter() -> String {
let mut rust_log = std::env::var("RUST_LOG").unwrap_or_else(|_| {
if cfg!(debug_assertions) {
"debug".to_owned()
} else {
"info".to_owned()
}
});
for crate_name in crate::CRATES_AT_ERROR_LEVEL {
if !rust_log.contains(&format!("{crate_name}=")) {
rust_log += &format!(",{crate_name}=error");
}
}
for crate_name in crate::CRATES_AT_WARN_LEVEL {
if !rust_log.contains(&format!("{crate_name}=")) {
rust_log += &format!(",{crate_name}=warn");
}
}
for crate_name in crate::CRATES_AT_INFO_LEVEL {
if !rust_log.contains(&format!("{crate_name}=")) {
rust_log += &format!(",{crate_name}=info");
}
}
rust_log
}
fn is_log_enabled(filter: log::LevelFilter, metadata: &log::Metadata<'_>) -> bool {
if CRATES_AT_ERROR_LEVEL
.iter()
.any(|crate_name| metadata.target().starts_with(crate_name))
{
return metadata.level() <= log::LevelFilter::Error;
}
if CRATES_AT_WARN_LEVEL
.iter()
.any(|crate_name| metadata.target().starts_with(crate_name))
{
return metadata.level() <= log::LevelFilter::Warn;
}
if CRATES_AT_INFO_LEVEL
.iter()
.any(|crate_name| metadata.target().starts_with(crate_name))
{
return metadata.level() <= log::LevelFilter::Info;
}
metadata.level() <= filter
}
#[allow(dead_code)] fn shorten_file_path(file_path: &str) -> &str {
if let Some(i) = file_path.rfind("/src/") {
if let Some(prev_slash) = file_path[..i].rfind('/') {
&file_path[prev_slash + 1..]
} else {
file_path
}
} else {
file_path
}
}
#[test]
fn test_shorten_file_path() {
for (before, after) in [
("/Users/emilk/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.24.1/src/runtime/runtime.rs", "tokio-1.24.1/src/runtime/runtime.rs"),
("crates/rerun/src/main.rs", "rerun/src/main.rs"),
("/rustc/d5a82bbd26e1ad8b7401f6a718a9c57c96905483/library/core/src/ops/function.rs", "core/src/ops/function.rs"),
("/weird/path/file.rs", "/weird/path/file.rs"),
]
{
assert_eq!(shorten_file_path(before), after);
}
}