]> OzVa Git service - ozva-cloud/commitdiff
feat: use custom logger with timestamp in rfc3339 (#67)
authorsigoden <sigoden@gmail.com>
Tue, 21 Jun 2022 13:19:51 +0000 (21:19 +0800)
committerGitHub <noreply@github.com>
Tue, 21 Jun 2022 13:19:51 +0000 (21:19 +0800)
Cargo.lock
Cargo.toml
src/logger.rs [new file with mode: 0644]
src/main.rs
tests/args.rs
tests/bind.rs
tests/fixtures.rs
tests/http.rs

index 556ff1eb296c64f4838b96fa2281f1cd39d5a9a9..db62cccf0bda0282e5f57cb9b8934ee04ac81a0b 100644 (file)
@@ -583,7 +583,6 @@ dependencies = [
  "chrono",
  "clap",
  "diqwest",
- "env_logger",
  "futures",
  "get_if_addrs",
  "headers",
@@ -629,16 +628,6 @@ dependencies = [
  "cfg-if",
 ]
 
-[[package]]
-name = "env_logger"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3"
-dependencies = [
- "humantime",
- "log",
-]
-
 [[package]]
 name = "event-listener"
 version = "2.5.2"
@@ -1033,12 +1022,6 @@ version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
 
-[[package]]
-name = "humantime"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
-
 [[package]]
 name = "hyper"
 version = "0.14.19"
index 5d27ad107a6bf0ca3f64d926b448447442343e57..1869ef1153c55b9d7feea75d61f3ac8dea2c65f3 100644 (file)
@@ -34,7 +34,6 @@ lazy_static = "1.4"
 uuid = { version = "1.1", features = ["v4", "fast-rng"] }
 urlencoding = "2.1"
 xml-rs = "0.8"
-env_logger = { version = "0.9", default-features = false, features = ["humantime"] }
 log = "0.4"
 socket2 = "0.4"
 async-stream = "0.3"
diff --git a/src/logger.rs b/src/logger.rs
new file mode 100644 (file)
index 0000000..bfa808e
--- /dev/null
@@ -0,0 +1,30 @@
+use chrono::{Local, SecondsFormat};
+use log::{Level, Metadata, Record};
+use log::{LevelFilter, SetLoggerError};
+
+struct SimpleLogger;
+
+impl log::Log for SimpleLogger {
+    fn enabled(&self, metadata: &Metadata) -> bool {
+        metadata.level() <= Level::Info
+    }
+
+    fn log(&self, record: &Record) {
+        if self.enabled(record.metadata()) {
+            let timestamp = Local::now().to_rfc3339_opts(SecondsFormat::Secs, true);
+            if record.level() < Level::Info {
+                eprintln!("{} {} - {}", timestamp, record.level(), record.args());
+            } else {
+                println!("{} {} - {}", timestamp, record.level(), record.args());
+            }
+        }
+    }
+
+    fn flush(&self) {}
+}
+
+static LOGGER: SimpleLogger = SimpleLogger;
+
+pub fn init() -> Result<(), SetLoggerError> {
+    log::set_logger(&LOGGER).map(|()| log::set_max_level(LevelFilter::Info))
+}
index 5af8add937ea0328a949ceef63242a49e0eeb62f..bf579f0905cb4ec3d54ae33dd5f4d9b82ac3ffa2 100644 (file)
@@ -1,5 +1,6 @@
 mod args;
 mod auth;
+mod logger;
 mod server;
 mod streamer;
 mod tls;
@@ -12,9 +13,8 @@ use crate::args::{matches, Args};
 use crate::server::{Request, Server};
 use crate::tls::{TlsAcceptor, TlsStream};
 
-use std::io::Write;
 use std::net::{IpAddr, SocketAddr, TcpListener as StdTcpListener};
-use std::{env, sync::Arc};
+use std::sync::Arc;
 
 use futures::future::join_all;
 use tokio::net::TcpListener;
@@ -32,16 +32,7 @@ async fn main() {
 }
 
 async fn run() -> BoxResult<()> {
-    if env::var("RUST_LOG").is_err() {
-        env::set_var("RUST_LOG", "info")
-    }
-    env_logger::builder()
-        .format(|buf, record| {
-            let timestamp = buf.timestamp_millis();
-            writeln!(buf, "[{} {}] {}", timestamp, record.level(), record.args())
-        })
-        .init();
-
+    logger::init().map_err(|e| format!("Failed to init logger, {}", e))?;
     let args = Args::parse(matches())?;
     let args = Arc::new(args);
     let handles = serve(args.clone())?;
index 81f7ecb155f17e267c1f2b11abb4ea675817b8b6..f2bec6334f6994fd527fa679905ccf83ca4aea25 100644 (file)
@@ -36,7 +36,6 @@ fn path_prefix_propfind(
 #[case("index.html")]
 fn serve_single_file(tmpdir: TempDir, port: u16, #[case] file: &str) -> Result<(), Error> {
     let mut child = Command::cargo_bin("dufs")?
-        .env("RUST_LOG", "false")
         .arg(tmpdir.path().join(file))
         .arg("-p")
         .arg(port.to_string())
index 4b9c8634645979c0bd396cbb09f2998832ed740e..517822e0ad949b01b906ae9b1fe7883c99ec5332 100644 (file)
@@ -6,14 +6,13 @@ use assert_cmd::prelude::*;
 use assert_fs::fixture::TempDir;
 use regex::Regex;
 use rstest::rstest;
-use std::io::{BufRead, BufReader};
+use std::io::Read;
 use std::process::{Command, Stdio};
 
 #[rstest]
 #[case(&["-b", "20.205.243.166"])]
 fn bind_fails(tmpdir: TempDir, port: u16, #[case] args: &[&str]) -> Result<(), Error> {
     Command::cargo_bin("dufs")?
-        .env("RUST_LOG", "false")
         .arg(tmpdir.path())
         .arg("-p")
         .arg(port.to_string())
@@ -51,7 +50,6 @@ fn bind_ipv4_ipv6(
 #[case(&["--path-prefix", "/prefix"])]
 fn validate_printed_urls(tmpdir: TempDir, port: u16, #[case] args: &[&str]) -> Result<(), Error> {
     let mut child = Command::cargo_bin("dufs")?
-        .env("RUST_LOG", "false")
         .arg(tmpdir.path())
         .arg("-p")
         .arg(port.to_string())
@@ -61,22 +59,23 @@ fn validate_printed_urls(tmpdir: TempDir, port: u16, #[case] args: &[&str]) -> R
 
     wait_for_port(port);
 
-    // WARN assumes urls list is terminated by an empty line
-    let url_lines = BufReader::new(child.stdout.take().unwrap())
+    let stdout = child.stdout.as_mut().expect("Failed to get stdout");
+    let mut buf = [0; 1000];
+    let buf_len = stdout.read(&mut buf)?;
+    let output = std::str::from_utf8(&buf[0..buf_len])?;
+    let url_lines = output
         .lines()
-        .map(|line| line.expect("Error reading stdout"))
         .take_while(|line| !line.is_empty()) /* non-empty lines */
-        .collect::<Vec<_>>();
-    let url_lines = url_lines.join("\n");
+        .collect::<Vec<_>>()
+        .join("\n");
 
     let urls = Regex::new(r"http://[a-zA-Z0-9\.\[\]:/]+")
         .unwrap()
         .captures_iter(url_lines.as_str())
-        .map(|caps| caps.get(0).unwrap().as_str())
+        .filter_map(|caps| caps.get(0).map(|v| v.as_str()))
         .collect::<Vec<_>>();
 
     assert!(!urls.is_empty());
-
     for url in urls {
         reqwest::blocking::get(url)?.error_for_status()?;
     }
index 5dab32f13da2f19e26d0dbc10de4587b9f90613a..f97276b03db09783d0bed3968335ea23a55b073a 100644 (file)
@@ -13,21 +13,7 @@ pub type Error = Box<dyn std::error::Error>;
 
 /// File names for testing purpose
 #[allow(dead_code)]
-pub static FILES: &[&str] = &[
-    "test.txt",
-    "test.html",
-    "index.html",
-    "test.mkv",
-    #[cfg(not(windows))]
-    "test \" \' & < >.csv",
-    "😀.data",
-    "⎙.mp4",
-    "#[]{}()@!$&'`+,;= %20.test",
-    #[cfg(unix)]
-    ":?#[]{}<>()@!$&'`|*+,;= %20.test",
-    #[cfg(not(windows))]
-    "foo\\bar.test",
-];
+pub static FILES: &[&str] = &["test.txt", "test.html", "index.html", "😀.bin"];
 
 /// Directory names for testing diretory don't exist
 #[allow(dead_code)]
@@ -41,10 +27,6 @@ pub static DIR_NO_INDEX: &str = "dir-no-index/";
 #[allow(dead_code)]
 pub static DIRECTORIES: &[&str] = &["dira/", "dirb/", "dirc/", DIR_NO_INDEX];
 
-/// Name of a deeply nested file
-#[allow(dead_code)]
-pub static DEEPLY_NESTED_FILE: &str = "very/deeply/nested/test.rs";
-
 /// Test fixture which creates a temporary directory with a few files and directories inside.
 /// The directories also contain files.
 #[fixture]
@@ -69,10 +51,6 @@ pub fn tmpdir() -> TempDir {
         }
     }
 
-    tmpdir
-        .child(&DEEPLY_NESTED_FILE)
-        .write_str("File in a deeply nested directory.")
-        .expect("Couldn't write to file");
     tmpdir
 }
 
@@ -96,7 +74,6 @@ where
     let tmpdir = tmpdir();
     let child = Command::cargo_bin("dufs")
         .expect("Couldn't find test binary")
-        .env("RUST_LOG", "false")
         .arg(tmpdir.path())
         .arg("-p")
         .arg(port.to_string())
@@ -124,7 +101,6 @@ where
     let tmpdir = tmpdir();
     let child = Command::cargo_bin("dufs")
         .expect("Couldn't find test binary")
-        .env("RUST_LOG", "false")
         .arg(tmpdir.path())
         .arg("-p")
         .arg(port.to_string())
index 38253fe4c2bcca61f2407d0ea30edd3e10c08125..daa8e22cf49025751cc7c6aab1a87e60f39ac563 100644 (file)
@@ -76,12 +76,12 @@ fn get_dir_search(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
 
 #[rstest]
 fn get_dir_search2(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
-    let resp = reqwest::blocking::get(format!("{}?q={}", server.url(), "😀.data"))?;
+    let resp = reqwest::blocking::get(format!("{}?q={}", server.url(), "😀.bin"))?;
     assert_eq!(resp.status(), 200);
     let paths = utils::retrive_index_paths(&resp.text()?);
     assert!(!paths.is_empty());
     for p in paths {
-        assert!(p.contains(&"😀.data"));
+        assert!(p.contains(&"😀.bin"));
     }
     Ok(())
 }