summaryrefslogtreecommitdiff
path: root/cli/logger.rs
diff options
context:
space:
mode:
authorKitson Kelly <me@kitsonkelly.com>2021-05-11 14:54:10 +1000
committerGitHub <noreply@github.com>2021-05-11 14:54:10 +1000
commit81f8585643faf42edab45f9e8604a0c1d9c7486a (patch)
tree5c54fa0ac866786cabf83be34f49b96038b88e25 /cli/logger.rs
parent2b8bac3c85d90de44c00677b015f69fd445c1489 (diff)
feat(lsp): add internal debugging logging (#10438)
Ref: #10368
Diffstat (limited to 'cli/logger.rs')
-rw-r--r--cli/logger.rs92
1 files changed, 92 insertions, 0 deletions
diff --git a/cli/logger.rs b/cli/logger.rs
new file mode 100644
index 000000000..f3a12eec2
--- /dev/null
+++ b/cli/logger.rs
@@ -0,0 +1,92 @@
+// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
+
+use std::io::Write;
+use std::sync::atomic::AtomicBool;
+use std::sync::atomic::Ordering;
+use std::sync::Arc;
+
+lazy_static::lazy_static! {
+ pub static ref LSP_DEBUG_FLAG: Arc<AtomicBool> = Arc::new(AtomicBool::new(false));
+}
+
+struct CliLogger(env_logger::Logger);
+
+impl CliLogger {
+ pub fn new(logger: env_logger::Logger) -> Self {
+ Self(logger)
+ }
+
+ pub fn filter(&self) -> log::LevelFilter {
+ self.0.filter()
+ }
+}
+
+impl log::Log for CliLogger {
+ fn enabled(&self, metadata: &log::Metadata) -> bool {
+ if metadata.target() == "deno::lsp::performance"
+ && metadata.level() == log::Level::Debug
+ {
+ LSP_DEBUG_FLAG.load(Ordering::Relaxed)
+ } else {
+ self.0.enabled(metadata)
+ }
+ }
+
+ fn log(&self, record: &log::Record) {
+ if self.enabled(record.metadata()) {
+ self.0.log(record);
+ }
+ }
+
+ fn flush(&self) {
+ self.0.flush();
+ }
+}
+
+pub(crate) fn init(maybe_level: Option<log::Level>) {
+ let log_level = maybe_level.unwrap_or(log::Level::Info);
+ let logger = env_logger::Builder::from_env(
+ env_logger::Env::default()
+ .default_filter_or(log_level.to_level_filter().to_string()),
+ )
+ // https://github.com/denoland/deno/issues/6641
+ .filter_module("rustyline", log::LevelFilter::Off)
+ // wgpu crates (gfx_backend), have a lot of useless INFO and WARN logs
+ .filter_module("wgpu", log::LevelFilter::Error)
+ .filter_module("gfx", log::LevelFilter::Error)
+ // used to make available the lsp_debug which is then filtered out at runtime
+ // in the cli logger
+ .filter_module("deno::lsp::performance", log::LevelFilter::Debug)
+ .format(|buf, record| {
+ let mut target = record.target().to_string();
+ if let Some(line_no) = record.line() {
+ target.push(':');
+ target.push_str(&line_no.to_string());
+ }
+ if record.level() <= log::Level::Info
+ || (record.target() == "deno::lsp::performance"
+ && record.level() == log::Level::Debug)
+ {
+ // Print ERROR, WARN, INFO and lsp_debug logs as they are
+ writeln!(buf, "{}", record.args())
+ } else {
+ // Add prefix to DEBUG or TRACE logs
+ writeln!(
+ buf,
+ "{} RS - {} - {}",
+ record.level(),
+ target,
+ record.args()
+ )
+ }
+ })
+ .build();
+
+ let cli_logger = CliLogger::new(logger);
+ let max_level = cli_logger.filter();
+ let r = log::set_boxed_logger(Box::new(cli_logger));
+ if r.is_ok() {
+ log::set_max_level(max_level);
+ }
+ r.expect("Could not install logger.");
+}