]> git.lizzy.rs Git - rust.git/commitdiff
Add --no-buffering flag for the file logging.
authorvsrs <vit@conrlab.com>
Sun, 24 Jan 2021 14:06:55 +0000 (17:06 +0300)
committervsrs <vit@conrlab.com>
Mon, 25 Jan 2021 14:46:03 +0000 (17:46 +0300)
crates/rust-analyzer/src/bin/args.rs
crates/rust-analyzer/src/bin/logger.rs
crates/rust-analyzer/src/bin/main.rs

index 7d917946e3327a655087419c31ba57f8d2c8eed1..4ec755769322953a3f9bd35ace816ab1eaa9ca24 100644 (file)
@@ -14,6 +14,7 @@
 pub(crate) struct Args {
     pub(crate) verbosity: Verbosity,
     pub(crate) log_file: Option<PathBuf>,
+    pub(crate) no_buffering: bool,
     pub(crate) command: Command,
 }
 
@@ -47,7 +48,8 @@ pub(crate) enum Command {
     -vv, --spammy
     -q,  --quiet      Set verbosity
 
-    --log-file <PATH> Log to the specified filed instead of stderr
+    --log-file <PATH> Log to the specified file instead of stderr
+    --no-buffering    Flush log records to the file immediatly
 
 ENVIRONMENTAL VARIABLES:
     RA_LOG            Set log filter in env_logger format
@@ -114,6 +116,7 @@ pub(crate) fn parse() -> Result<Args> {
                 verbosity: Verbosity::Normal,
                 log_file: None,
                 command: Command::Version,
+                no_buffering: false,
             });
         }
 
@@ -130,21 +133,22 @@ pub(crate) fn parse() -> Result<Args> {
             (false, true, true) => bail!("Invalid flags: -q conflicts with -v"),
         };
         let log_file = matches.opt_value_from_str("--log-file")?;
+        let no_buffering = matches.contains("--no-buffering");
 
         if matches.contains(["-h", "--help"]) {
             eprintln!("{}", HELP);
-            return Ok(Args { verbosity, log_file: None, command: Command::Help });
+            return Ok(Args { verbosity, log_file: None, command: Command::Help, no_buffering });
         }
 
         if matches.contains("--print-config-schema") {
-            return Ok(Args { verbosity, log_file, command: Command::PrintConfigSchema });
+            return Ok(Args { verbosity, log_file, command: Command::PrintConfigSchema, no_buffering }, );
         }
 
         let subcommand = match matches.subcommand()? {
             Some(it) => it,
             None => {
                 finish_args(matches)?;
-                return Ok(Args { verbosity, log_file, command: Command::RunServer });
+                return Ok(Args { verbosity, log_file, command: Command::RunServer, no_buffering });
             }
         };
         let command = match subcommand.as_str() {
@@ -219,11 +223,11 @@ pub(crate) fn parse() -> Result<Args> {
             },
             _ => {
                 eprintln!("{}", HELP);
-                return Ok(Args { verbosity, log_file: None, command: Command::Help });
+                return Ok(Args { verbosity, log_file: None, command: Command::Help, no_buffering });
             }
         };
         finish_args(matches)?;
-        Ok(Args { verbosity, log_file, command })
+        Ok(Args { verbosity, log_file, command, no_buffering })
     }
 }
 
index 3bcb1ae37d4c77a99ff4202672f7359930de8e05..4ea4ffafb66cad7267f9efb6434bb7e55f248570 100644 (file)
@@ -2,10 +2,7 @@
 //! filter syntax. Amusingly, there's no crates.io crate that can do this and
 //! only this.
 
-use std::{
-    fs::File,
-    io::{BufWriter, Write},
-};
+use std::{borrow::BorrowMut, fs::File, io::{BufWriter, Write}};
 
 use env_logger::filter::{Builder, Filter};
 use log::{Log, Metadata, Record};
 pub(crate) struct Logger {
     filter: Filter,
     file: Option<Mutex<BufWriter<File>>>,
+    no_buffering: bool,
 }
 
 impl Logger {
-    pub(crate) fn new(log_file: Option<File>, filter: Option<&str>) -> Logger {
+    pub(crate) fn new(log_file: Option<File>, no_buffering: bool, filter: Option<&str>) -> Logger {
         let filter = {
             let mut builder = Builder::new();
             if let Some(filter) = filter {
@@ -28,7 +26,7 @@ pub(crate) fn new(log_file: Option<File>, filter: Option<&str>) -> Logger {
 
         let file = log_file.map(|it| Mutex::new(BufWriter::new(it)));
 
-        Logger { filter, file }
+        Logger { filter, file, no_buffering }
     }
 
     pub(crate) fn install(self) {
@@ -55,6 +53,10 @@ fn log(&self, record: &Record) {
                     record.module_path().unwrap_or_default(),
                     record.args(),
                 );
+
+                if self.no_buffering {
+                    w.lock().borrow_mut().flush().unwrap();
+                }
             }
             None => eprintln!(
                 "[{} {}] {}",
index 1d6e5478bc4d38969dd64cb20edc45747d1556e6..9a54193f60f6468c5771f354e98a6049161cae16 100644 (file)
@@ -28,7 +28,7 @@ fn main() {
 
 fn try_main() -> Result<()> {
     let args = args::Args::parse()?;
-    setup_logging(args.log_file)?;
+    setup_logging(args.log_file, args.no_buffering)?;
     match args.command {
         args::Command::RunServer => run_server()?,
         args::Command::PrintConfigSchema => {
@@ -56,7 +56,7 @@ fn try_main() -> Result<()> {
     Ok(())
 }
 
-fn setup_logging(log_file: Option<PathBuf>) -> Result<()> {
+fn setup_logging(log_file: Option<PathBuf>, flush_file: bool) -> Result<()> {
     env::set_var("RUST_BACKTRACE", "short");
 
     let log_file = match log_file {
@@ -69,7 +69,7 @@ fn setup_logging(log_file: Option<PathBuf>) -> Result<()> {
         None => None,
     };
     let filter = env::var("RA_LOG").ok();
-    logger::Logger::new(log_file, filter.as_deref()).install();
+    logger::Logger::new(log_file, flush_file, filter.as_deref()).install();
 
     tracing_setup::setup_tracing()?;