summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2021-09-04 14:29:00 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2021-09-04 14:29:00 +0100
commite11811d6425a8caced83fd2d5ebce55b04c6c1c2 (patch)
treea097f4350b19edea2a8c3c90e29ef03c9624a5f8 /src
parentaa06f2658bdc2af1d3561fff32faa17191d1eb6e (diff)
downloadsubplot-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.rs60
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(),
+ }
+}