diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2021-09-04 14:29:00 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2021-09-04 14:29:00 +0100 |
commit | e11811d6425a8caced83fd2d5ebce55b04c6c1c2 (patch) | |
tree | a097f4350b19edea2a8c3c90e29ef03c9624a5f8 /src | |
parent | aa06f2658bdc2af1d3561fff32faa17191d1eb6e (diff) | |
download | subplot-e11811d6425a8caced83fd2d5ebce55b04c6c1c2.tar.gz |
chore: Enable tracing
Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/subplot.rs | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/src/bin/subplot.rs b/src/bin/subplot.rs index 867ffb2..28dcd74 100644 --- a/src/bin/subplot.rs +++ b/src/bin/subplot.rs @@ -8,6 +8,7 @@ use structopt::StructOpt; use subplot::{ generate_test_program, resource, template_spec, DataFile, Document, MarkupOpts, Style, }; +use tracing::{event, span, Level}; use std::convert::TryFrom; use std::ffi::OsString; @@ -140,6 +141,8 @@ impl Extract { } fn run(&self) -> Result<()> { + let span = span!(Level::TRACE, "extract"); + let _enter = span.enter(); let doc = cli::load_document(&self.filename, Style::default())?; let files: Vec<&DataFile> = if self.embedded.is_empty() { @@ -194,6 +197,8 @@ impl Filter { } fn run(&self) -> Result<()> { + let span = span!(Level::TRACE, "filter"); + let _enter = span.enter(); let mut buffer = String::new(); if let Some(filename) = &self.input { File::open(filename)?.read_to_string(&mut buffer)?; @@ -242,6 +247,8 @@ impl Metadata { } fn run(&self) -> Result<()> { + let span = span!(Level::TRACE, "metadata"); + let _enter = span.enter(); let mut doc = cli::load_document(&self.filename, Style::default())?; let meta = cli::Metadata::try_from(&mut doc)?; match self.output_format { @@ -276,6 +283,8 @@ impl Docgen { } fn run(&self) -> Result<()> { + let span = span!(Level::TRACE, "docgen"); + let _enter = span.enter(); let mut style = Style::default(); if self.output.extension() == Some(&OsString::from("pdf")) { style.typeset_links_as_notes(); @@ -376,6 +385,8 @@ impl Codegen { } fn run(&self) -> Result<()> { + let span = span!(Level::TRACE, "codegen"); + let _enter = span.enter(); let mut doc = cli::load_document(&self.filename, Style::default())?; doc.lint()?; if !doc.check_named_files_exist()? { @@ -408,7 +419,8 @@ impl Codegen { } } -fn main() { +fn real_main() { + event!(Level::TRACE, "Starting Subplot"); let argparser = Toplevel::clap(); let version = long_version().unwrap(); let argparser = argparser.long_version(version.as_str()); @@ -416,10 +428,54 @@ fn main() { let args = Toplevel::from_clap(&args); args.handle_special_args(); match args.run() { - Ok(_) => {} + Ok(_) => { + event!(Level::TRACE, "Finished successfully"); + } Err(e) => { + event!(Level::DEBUG, error = ?e, "Failed: {:?}", e); eprintln!("Failure: {:?}", e); process::exit(1); } } } + +fn main() { + let filter = match tracing_subscriber::EnvFilter::try_from_env("SUBPLOT_LOG") { + Ok(f) => f, + Err(e) => { + if std::env::var_os("SUBPLOT_LOG").is_none() { + // Missing SUBPLOT_LOG, default filter should be INFO + tracing_subscriber::EnvFilter::new("info") + } else { + eprintln!("Unable to parse log directive from SUBPLOT_LOG: {:?}", e); + process::exit(1); + } + } + }; + match std::env::var("SUBPLOT_TRACE_LOG").ok().as_deref() { + Some("") | Some("-") => { + let subscriber = tracing_subscriber::fmt() + .with_env_filter(filter) + .pretty() + .finish(); + tracing::subscriber::with_default(subscriber, real_main); + } + Some(fname) => { + let curdir = std::path::Component::CurDir; + let location = PathBuf::from(fname); + let parent = location.parent().unwrap_or_else(|| curdir.as_ref()); + let fname = location + .file_name() + .expect("No filename given in SUBPLOT_TRACE_LOG"); + let appender = tracing_appender::rolling::never(parent, fname); + let (non_blocking, _guard) = tracing_appender::non_blocking(appender); + let subscriber = tracing_subscriber::fmt() + .with_writer(non_blocking) + .with_env_filter(filter) + .pretty() + .finish(); + tracing::subscriber::with_default(subscriber, real_main); + } + None => real_main(), + } +} |