Setup Logging with tracing
tracing
およびいくつかの関連依存関係をインストールする必要があります。
cargo add tracing-error tracingcargo add tracing-subscriber --features env-filtercargo add directories lazy_static color-eyre # (optional)
プロジェクトの任意のモジュールに次の貼り付けができます。
use std::path::PathBuf;
use color_eyre::eyre::{Context, Result};use directories::ProjectDirs;use lazy_static::lazy_static;use tracing::error;use tracing_error::ErrorLayer;use tracing_subscriber::{self, layer::SubscriberExt, util::SubscriberInitExt, Layer};
lazy_static! { pub static ref PROJECT_NAME: String = env!("CARGO_CRATE_NAME").to_uppercase().to_string(); pub static ref DATA_FOLDER: Option<PathBuf> = std::env::var(format!("{}_DATA", PROJECT_NAME.clone())).ok().map(PathBuf::from); pub static ref LOG_ENV: String = format!("{}_LOGLEVEL", PROJECT_NAME.clone()); pub static ref LOG_FILE: String = format!("{}.log", env!("CARGO_PKG_NAME"));}
fn project_directory() -> Option<ProjectDirs> { ProjectDirs::from("com", "kdheepak", env!("CARGO_PKG_NAME"))}
pub fn get_data_dir() -> PathBuf { let directory = if let Some(s) = DATA_FOLDER.clone() { s } else if let Some(proj_dirs) = project_directory() { proj_dirs.data_local_dir().to_path_buf() } else { PathBuf::from(".").join(".data") }; directory}
pub fn initialize_logging() -> Result<()> { let directory = get_data_dir(); std::fs::create_dir_all(directory.clone())?; let log_path = directory.join(LOG_FILE.clone()); let log_file = std::fs::File::create(log_path)?; std::env::set_var( "RUST_LOG", std::env::var("RUST_LOG") .or_else(|_| std::env::var(LOG_ENV.clone())) .unwrap_or_else(|_| format!("{}=info", env!("CARGO_CRATE_NAME"))), ); let file_subscriber = tracing_subscriber::fmt::layer() .with_file(true) .with_line_number(true) .with_writer(log_file) .with_target(false) .with_ansi(false) .with_filter(tracing_subscriber::filter::EnvFilter::from_default_env()); tracing_subscriber::registry().with(file_subscriber).with(ErrorLayer::default()).init(); Ok(())}
/// Similar to the `std::dbg!` macro, but generates `tracing` events rather/// than printing to stdout.////// By default, the verbosity level for the generated events is `DEBUG`, but/// this can be customized.#[macro_export]macro_rules! trace_dbg { (target: $target:expr, level: $level:expr, $ex:expr) => {{ match $ex { value => { tracing::event!(target: $target, $level, ?value, stringify!($ex)); value } } }}; (level: $level:expr, $ex:expr) => { trace_dbg!(target: module_path!(), level: $level, $ex) }; (target: $target:expr, $ex:expr) => { trace_dbg!(target: $target, level: tracing::Level::DEBUG, $ex) }; ($ex:expr) => { trace_dbg!(level: tracing::Level::DEBUG, $ex) };}
main()
関数で initialize_logging()?
を呼び出します。
ログレベルは、 ${YOUR_CRATE_NAME}_LOGLEVEL
環境変数 (デフォルト= log::LevelFilter::Info
) によって決定されます。
さらに、ログファイルの場所は環境変数によって決定されます。詳細については、 the section on XDG directories を参照してください。