diff options
Diffstat (limited to 'crates/rust-analyzer/src/bin/logger.rs')
-rw-r--r-- | crates/rust-analyzer/src/bin/logger.rs | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/crates/rust-analyzer/src/bin/logger.rs b/crates/rust-analyzer/src/bin/logger.rs index 3bcb1ae37..14887c5cc 100644 --- a/crates/rust-analyzer/src/bin/logger.rs +++ b/crates/rust-analyzer/src/bin/logger.rs | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | use std::{ | 5 | use std::{ |
6 | fs::File, | 6 | fs::File, |
7 | io::{BufWriter, Write}, | 7 | io::{self, BufWriter, Write}, |
8 | }; | 8 | }; |
9 | 9 | ||
10 | use env_logger::filter::{Builder, Filter}; | 10 | use env_logger::filter::{Builder, Filter}; |
@@ -14,10 +14,11 @@ use parking_lot::Mutex; | |||
14 | pub(crate) struct Logger { | 14 | pub(crate) struct Logger { |
15 | filter: Filter, | 15 | filter: Filter, |
16 | file: Option<Mutex<BufWriter<File>>>, | 16 | file: Option<Mutex<BufWriter<File>>>, |
17 | no_buffering: bool, | ||
17 | } | 18 | } |
18 | 19 | ||
19 | impl Logger { | 20 | impl Logger { |
20 | pub(crate) fn new(log_file: Option<File>, filter: Option<&str>) -> Logger { | 21 | pub(crate) fn new(log_file: Option<File>, no_buffering: bool, filter: Option<&str>) -> Logger { |
21 | let filter = { | 22 | let filter = { |
22 | let mut builder = Builder::new(); | 23 | let mut builder = Builder::new(); |
23 | if let Some(filter) = filter { | 24 | if let Some(filter) = filter { |
@@ -28,7 +29,7 @@ impl Logger { | |||
28 | 29 | ||
29 | let file = log_file.map(|it| Mutex::new(BufWriter::new(it))); | 30 | let file = log_file.map(|it| Mutex::new(BufWriter::new(it))); |
30 | 31 | ||
31 | Logger { filter, file } | 32 | Logger { filter, file, no_buffering } |
32 | } | 33 | } |
33 | 34 | ||
34 | pub(crate) fn install(self) { | 35 | pub(crate) fn install(self) { |
@@ -46,7 +47,8 @@ impl Log for Logger { | |||
46 | if !self.filter.matches(record) { | 47 | if !self.filter.matches(record) { |
47 | return; | 48 | return; |
48 | } | 49 | } |
49 | match &self.file { | 50 | |
51 | let should_flush = match &self.file { | ||
50 | Some(w) => { | 52 | Some(w) => { |
51 | let _ = writeln!( | 53 | let _ = writeln!( |
52 | w.lock(), | 54 | w.lock(), |
@@ -55,19 +57,32 @@ impl Log for Logger { | |||
55 | record.module_path().unwrap_or_default(), | 57 | record.module_path().unwrap_or_default(), |
56 | record.args(), | 58 | record.args(), |
57 | ); | 59 | ); |
60 | self.no_buffering | ||
61 | } | ||
62 | None => { | ||
63 | eprintln!( | ||
64 | "[{} {}] {}", | ||
65 | record.level(), | ||
66 | record.module_path().unwrap_or_default(), | ||
67 | record.args(), | ||
68 | ); | ||
69 | true // flush stderr unconditionally | ||
58 | } | 70 | } |
59 | None => eprintln!( | 71 | }; |
60 | "[{} {}] {}", | 72 | |
61 | record.level(), | 73 | if should_flush { |
62 | record.module_path().unwrap_or_default(), | 74 | self.flush(); |
63 | record.args(), | ||
64 | ), | ||
65 | } | 75 | } |
66 | } | 76 | } |
67 | 77 | ||
68 | fn flush(&self) { | 78 | fn flush(&self) { |
69 | if let Some(w) = &self.file { | 79 | match &self.file { |
70 | let _ = w.lock().flush(); | 80 | Some(w) => { |
81 | let _ = w.lock().flush(); | ||
82 | } | ||
83 | None => { | ||
84 | let _ = io::stderr().flush(); | ||
85 | } | ||
71 | } | 86 | } |
72 | } | 87 | } |
73 | } | 88 | } |