Skip to content

Commit 60adba7

Browse files
authored
Merge pull request #13084 from gitbutlerapp/dp-log-file-flag
2 parents 5277c49 + 7945769 commit 60adba7

5 files changed

Lines changed: 36 additions & 8 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/but/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ syntect = { version = "5.3.0", default-features = false, features = [
150150
"metadata",
151151
"html",
152152
] }
153+
tracing-appender = "0.2.4"
153154

154155
[dev-dependencies]
155156
but-graph.workspace = true

crates/but/src/args/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ pub struct Args {
2121
/// Repeat up to 4 times for increasingly verbose output.
2222
#[clap(short = 't', long, action = clap::ArgAction::Count, hide = true, env = "BUT_TRACE")]
2323
pub trace: u8,
24+
/// Log to this file instead of stderr.
25+
///
26+
/// If the file does not exist it will be created. If it does exist it will be truncated.
27+
#[clap(long, hide = true)]
28+
pub log_file: Option<PathBuf>,
2429
/// Run as if gitbutler-cli was started in PATH instead of the current working directory.
2530
#[clap(short = 'C', long, default_value = ".", value_name = "PATH")]
2631
pub current_dir: PathBuf,

crates/but/src/lib.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,11 @@ pub async fn handle_args(args: impl Iterator<Item = OsString>) -> Result<()> {
118118
}) => file_or_hunk.is_some(),
119119
_ => false,
120120
};
121-
if args.trace > 0 {
122-
trace::init(args.trace)?;
123-
}
121+
let _tracing_appender_worker_guard = if args.trace > 0 {
122+
trace::init(args.trace, args.log_file.as_deref())?
123+
} else {
124+
None
125+
};
124126
let _span =
125127
tracing::info_span!("CLI", cmd = ?args.cmd.as_ref().map(|cmd| cmd.to_metrics_command()))
126128
.entered();

crates/but/src/trace.rs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1+
use std::path::Path;
2+
3+
use anyhow::Context;
14
use tracing::Level;
5+
use tracing_appender::non_blocking::WorkerGuard;
26
use tracing_subscriber::{
3-
Layer, filter::DynFilterFn, fmt::format::FmtSpan, layer::SubscriberExt, util::SubscriberInitExt,
7+
Layer,
8+
filter::DynFilterFn,
9+
fmt::{format::FmtSpan, writer::BoxMakeWriter},
10+
layer::SubscriberExt,
11+
util::SubscriberInitExt,
412
};
513

6-
pub fn init(level: u8) -> anyhow::Result<()> {
14+
pub fn init(level: u8, log_file_path: Option<&Path>) -> anyhow::Result<Option<WorkerGuard>> {
715
let level_t = match level {
816
1 => Level::INFO,
917
2 => Level::DEBUG,
@@ -33,25 +41,36 @@ pub fn init(level: u8) -> anyhow::Result<()> {
3341
false
3442
});
3543

44+
let (make_writer, with_ansi, guard) = if let Some(log_file_path) = log_file_path {
45+
let file = std::fs::File::create(log_file_path)
46+
.with_context(|| format!("failed to open log file path {}", log_file_path.display()))?;
47+
let (non_blocking, guard) = tracing_appender::non_blocking(file);
48+
(BoxMakeWriter::new(non_blocking), false, Some(guard))
49+
} else {
50+
(BoxMakeWriter::new(std::io::stderr), true, None)
51+
};
52+
3653
if level >= 4 {
3754
tracing_subscriber::registry()
3855
.with(
3956
tracing_subscriber::fmt::layer()
4057
.compact()
4158
.with_span_events(FmtSpan::CLOSE)
42-
.with_writer(std::io::stderr)
59+
.with_writer(make_writer)
60+
.with_ansi(with_ansi)
4361
.with_filter(filter),
4462
)
4563
.init()
4664
} else {
4765
tracing_subscriber::registry()
4866
.with(
4967
tracing_forest::ForestLayer::from(
50-
tracing_forest::printer::PrettyPrinter::new().writer(std::io::stderr),
68+
tracing_forest::printer::PrettyPrinter::new().writer(make_writer),
5169
)
5270
.with_filter(filter),
5371
)
5472
.init();
5573
}
56-
Ok(())
74+
75+
Ok(guard)
5776
}

0 commit comments

Comments
 (0)