diff --git a/Cargo.toml b/Cargo.toml index baaac697..e217f732 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,5 +26,7 @@ path = "src/bin/dfstore/main.rs" clap = { version = "4.1.13", features = [ "derive" ] } home = "0.5.4" tracing = "0.1" -tracing-subscriber = "0.3" +tracing-log = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +tracing-appender = "0.2" humantime = "2.1.0" diff --git a/src/bin/dfget/main.rs b/src/bin/dfget/main.rs index d5e95cec..3a79cde3 100644 --- a/src/bin/dfget/main.rs +++ b/src/bin/dfget/main.rs @@ -122,5 +122,5 @@ struct Args { fn main() { let args = Args::parse(); - print!("{:?}", args.output); + println!("{:?}", args.output); } diff --git a/src/logging/mod.rs b/src/logging/mod.rs index c81dd8ba..440626da 100644 --- a/src/logging/mod.rs +++ b/src/logging/mod.rs @@ -13,3 +13,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +use tracing::Level; +use tracing_appender::non_blocking::WorkerGuard; +use tracing_appender::rolling::{RollingFileAppender, Rotation}; +use tracing_log::LogTracer; +use tracing_subscriber::{fmt::Layer, prelude::*, EnvFilter, Registry}; + +pub fn init_logging(name: &str, dir: &str, level: Level) -> Vec { + let mut guards = vec![]; + LogTracer::init().expect("failed to init LogTracer"); + + // Setup stdout layer. + let (stdout_writer, stdout_guard) = tracing_appender::non_blocking(std::io::stdout()); + let stdout_logging_layer = Layer::new().with_writer(stdout_writer); + guards.push(stdout_guard); + + // Setup file layer. + let rolling_appender = RollingFileAppender::new(Rotation::DAILY, dir, name); + let (rolling_writer, rolling_writer_guard) = tracing_appender::non_blocking(rolling_appender); + let file_logging_layer = Layer::new().with_writer(rolling_writer); + guards.push(rolling_writer_guard); + + let env_filter = + EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(level.to_string())); + + let subscriber = Registry::default() + .with(env_filter) + .with(stdout_logging_layer) + .with(file_logging_layer); + + tracing::subscriber::set_global_default(subscriber).expect("failed to set global subscriber"); + + guards +}