Skip to content

Commit 3349d02

Browse files
davidbarskyfacebook-github-bot
authored andcommitted
rust-project: add json logging option; refactor tracing setup
Summary: To support rust-lang/rust-analyzer#17246, I've added an argument for logging using JSON to that rust-analyzer can use these fields for progress reporting. Reviewed By: Wilfred Differential Revision: D57924551 fbshipit-source-id: 992e9e096fdea1eefe2b199d8dd84be7b247a732
1 parent c009cce commit 3349d02

File tree

4 files changed

+66
-41
lines changed

4 files changed

+66
-41
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ tower = "0.4"
280280
tower-layer = "0.3.1"
281281
tower-service = "0.3.2"
282282
tracing = "0.1.22"
283-
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
283+
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
284284
triomphe = "0.1.11"
285285
trybuild = "1.0.56"
286286
twox-hash = "1.6.1"

integrations/rust-project/src/cli/develop.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ impl Develop {
8080
relative_paths,
8181
mode,
8282
check_cycles,
83+
log_json: _,
8384
} = command
8485
{
8586
let out = if stdout {

integrations/rust-project/src/main.rs

Lines changed: 60 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ use std::path::PathBuf;
2424
use clap::ArgAction;
2525
use clap::Parser;
2626
use clap::Subcommand;
27+
use progress::ProgressLayer;
2728
use tracing_subscriber::filter::LevelFilter;
2829
use tracing_subscriber::layer::SubscriberExt;
29-
use tracing_subscriber::reload;
3030
use tracing_subscriber::EnvFilter;
3131
use tracing_subscriber::Layer;
3232

@@ -79,6 +79,10 @@ enum Command {
7979
#[clap(long = "stdout", conflicts_with = "out")]
8080
stdout: bool,
8181

82+
/// Log in a JSON format.
83+
#[clap(long, default_value = "false")]
84+
log_json: bool,
85+
8286
/// Use a `rustup`-managed sysroot instead of a `.buckconfig`-managed sysroot.
8387
///
8488
/// This option requires the presence of `rustc` in the `$PATH`, as rust-project
@@ -123,46 +127,79 @@ enum Command {
123127
}
124128

125129
fn main() -> Result<(), anyhow::Error> {
130+
let opt = Opt::parse();
131+
126132
let filter = EnvFilter::builder()
127133
.with_default_directive(LevelFilter::INFO.into())
128134
.from_env()?;
129135

130-
let fmt = tracing_subscriber::fmt::layer()
131-
.with_ansi(io::stderr().is_terminal())
132-
.with_writer(io::stderr);
133-
134-
let (layer, reload_handle) = reload::Layer::new(vec![fmt.with_filter(filter).boxed()]);
135-
136-
let subscriber = tracing_subscriber::registry().with(layer);
137-
tracing::subscriber::set_global_default(subscriber)?;
138-
139-
let cli = Opt::parse();
140-
141-
if cli.version {
136+
if opt.version {
142137
println!("{}", build_info());
143138
return Ok(());
144139
}
145140

146-
let Some(command) = cli.command else {
141+
let Some(command) = opt.command else {
147142
eprintln!("Expected a subcommand, see --help for more information.");
148143
return Ok(());
149144
};
150145

146+
let fmt = tracing_subscriber::fmt::layer()
147+
.with_ansi(io::stderr().is_terminal())
148+
.with_writer(io::stderr);
149+
151150
match command {
152-
Command::New { name, kind, path } => cli::New { name, kind, path }.run(),
153-
Command::Check {
154-
mode,
155-
use_clippy,
156-
saved_file,
157-
} => cli::Check::new(mode, use_clippy, saved_file).run(),
158-
c @ Command::Develop { .. } => {
151+
c @ Command::Develop { log_json, .. } => {
152+
if log_json {
153+
let subscriber =
154+
tracing_subscriber::registry().with(fmt.json().with_filter(filter));
155+
tracing::subscriber::set_global_default(subscriber)?;
156+
} else {
157+
let subscriber = tracing_subscriber::registry().with(fmt.with_filter(filter));
158+
tracing::subscriber::set_global_default(subscriber)?;
159+
};
160+
159161
let (develop, input, out) = cli::Develop::from_command(c);
160-
develop.run_as_cli(input, out)
162+
match develop.run_as_cli(input, out) {
163+
Ok(_) => Ok(()),
164+
Err(e) => {
165+
tracing::error!(
166+
error = <anyhow::Error as AsRef<
167+
dyn std::error::Error + Send + Sync + 'static,
168+
>>::as_ref(&e),
169+
source = e.source()
170+
);
171+
Ok(())
172+
}
173+
}
161174
}
162175
Command::LspServer => {
163-
let state = server::State::new(reload_handle)?;
176+
let state = server::State::new()?;
177+
let sender = state.server.sender.clone();
178+
179+
let progress = ProgressLayer::new(sender);
180+
181+
let subscriber = tracing_subscriber::registry()
182+
.with(fmt.with_filter(filter))
183+
.with(progress);
184+
tracing::subscriber::set_global_default(subscriber)?;
185+
164186
state.run()
165187
}
188+
Command::New { name, kind, path } => {
189+
let subscriber = tracing_subscriber::registry().with(fmt.with_filter(filter));
190+
tracing::subscriber::set_global_default(subscriber)?;
191+
192+
cli::New { name, kind, path }.run()
193+
}
194+
Command::Check {
195+
mode,
196+
use_clippy,
197+
saved_file,
198+
} => {
199+
let subscriber = tracing_subscriber::registry().with(fmt.with_filter(filter));
200+
tracing::subscriber::set_global_default(subscriber)?;
201+
cli::Check::new(mode, use_clippy, saved_file).run()
202+
}
166203
}
167204
}
168205

integrations/rust-project/src/server.rs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,20 @@ use serde::Deserialize;
2525
use serde::Serialize;
2626
use tracing::info;
2727
use tracing::warn;
28-
use tracing_subscriber::reload::Handle;
29-
use tracing_subscriber::Layer;
30-
use tracing_subscriber::Registry;
3128

3229
use crate::cli::Develop;
3330
use crate::json_project::Crate;
3431
use crate::json_project::JsonProject;
35-
use crate::progress::ProgressLayer;
3632
use crate::target::Target;
3733

3834
pub(crate) struct State {
39-
server: Server,
35+
pub(crate) server: Server,
4036
projects: Vec<JsonProject>,
4137
io_threads: IoThreads,
4238
}
4339

4440
impl State {
45-
pub(crate) fn new(
46-
handle: Handle<Vec<Box<dyn Layer<Registry> + Send + Sync + 'static>>, Registry>,
47-
) -> Result<Self, anyhow::Error> {
41+
pub(crate) fn new() -> Result<Self, anyhow::Error> {
4842
let (connection, io_threads) = Connection::stdio();
4943

5044
// Run the server and wait for the two threads to end (typically by trigger LSP Exit event).
@@ -62,13 +56,6 @@ impl State {
6256
req_queue: ReqQueue::default(),
6357
};
6458

65-
handle
66-
.modify(|layers| {
67-
let progress = ProgressLayer::new(sender);
68-
layers.push(progress.boxed())
69-
})
70-
.expect("Unable to update subscriber");
71-
7259
let state = State {
7360
server,
7461
io_threads,
@@ -239,8 +226,8 @@ impl NotificationDispatch<'_> {
239226
}
240227
}
241228

242-
struct Server {
243-
sender: Sender<lsp_server::Message>,
229+
pub(crate) struct Server {
230+
pub(crate) sender: Sender<lsp_server::Message>,
244231
receiver: Receiver<lsp_server::Message>,
245232
req_queue: ReqQueue<(String, Instant), ReqHandler>,
246233
}

0 commit comments

Comments
 (0)