diff --git a/Cargo.lock b/Cargo.lock index 27304b1..59615f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -452,6 +452,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", + "regex", +] + [[package]] name = "env_home" version = "0.1.0" @@ -627,6 +637,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1068,6 +1087,7 @@ dependencies = [ "futures", "julid-rs", "local-ip-address", + "log", "mime", "mime_guess", "native-dialog", @@ -1083,6 +1103,7 @@ dependencies = [ "tracing", "tracing-error", "tracing-subscriber", + "tui-logger", ] [[package]] @@ -2543,6 +2564,24 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tui-logger" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ea457a31a3fff1073f83e5c9e1c61a7805c435b2476b1df3a78f934adebabe" +dependencies = [ + "chrono", + "env_filter", + "fxhash", + "lazy_static", + "log", + "parking_lot", + "ratatui", + "tracing", + "tracing-subscriber", + "unicode-segmentation", +] + [[package]] name = "typenum" version = "1.18.0" diff --git a/Cargo.toml b/Cargo.toml index 50c5e79..36f6623 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ figment = { version = "0.10", features = ["toml", "test", "env"] } futures = "0.3" julid-rs = { version = "1", default-features = false, features = ["serde"] } local-ip-address = "0.6" +log = "0.4" mime = "0.3" mime_guess = "2" native-dialog = "0.9" @@ -27,3 +28,4 @@ tower-http = { version = "0.6", features = ["limit"] } tracing = "0.1.41" tracing-error = "0.2.1" tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } +tui-logger = { version = "0.17.3", features = ["crossterm", "tracing-support"] } diff --git a/src/discovery.rs b/src/discovery.rs index 8f9b16d..067c7ea 100644 --- a/src/discovery.rs +++ b/src/discovery.rs @@ -8,6 +8,7 @@ use axum::{ Json, extract::{ConnectInfo, State}, }; +use log::{error, warn}; use tokio::net::UdpSocket; use crate::{Config, JoecalState, RunningState, models::Device}; @@ -47,7 +48,7 @@ impl JoecalState { self.process_device(&received_msg, src, config).await; } Err(e) => { - eprintln!("Error receiving message: {e}"); + error!("Error receiving message: {e}"); } } } @@ -79,13 +80,13 @@ impl JoecalState { if let Err(e) = announce_multicast(&device, config.multicast_addr, self.socket.clone()).await { - eprintln!("Error during multicast announcement: {e}"); + warn!("Error during multicast announcement: {e}"); } if let Err(e) = announce_http(&device, Some(src), self.client.clone()).await { - eprintln!("Error during HTTP announcement: {e}"); + warn!("Error during HTTP announcement: {e}"); }; } else { - eprintln!("Received invalid message: {message}"); + error!("Received invalid message: {message}"); } } } diff --git a/src/frontend/mod.rs b/src/frontend/mod.rs index bcecc34..c8aa6c6 100644 --- a/src/frontend/mod.rs +++ b/src/frontend/mod.rs @@ -7,6 +7,7 @@ use joecalsend::{ error::{LocalSendError, Result}, models::Device, }; +use log::{error, info}; use native_dialog::MessageDialogBuilder; use ratatui::{ DefaultTerminal, @@ -235,14 +236,14 @@ async fn shutdown(handles: &mut JoinSet) { join_result = handles.join_next() => { match join_result { Some(handle) => match handle { - Ok(h) => println!("Stopped {h:?}"), - Err(e) => println!("Got error {e:?}"), + Ok(h) => info!("Stopped {h:?}"), + Err(e) => error!("Got error {e:?}"), } None => break, } } _ = alarm.tick() => { - println!("Exit timeout reached, aborting all unjoined tasks"); + info!("Exit timeout reached, aborting all unjoined tasks"); handles.abort_all(); break; }, diff --git a/src/lib.rs b/src/lib.rs index 4390da8..446e549 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,6 +11,7 @@ use std::{ }; use julid::Julid; +use log::error; use models::Device; use serde::{Deserialize, Serialize}; use tokio::{ @@ -97,7 +98,7 @@ impl JoecalState { let _ = self.shutdown_sender.set(tx); async move { if let Err(e) = state.start_http_server(shutdown_rx, &konfig).await { - eprintln!("HTTP server error: {e}"); + error!("HTTP server error: {e}"); } Listeners::Http } @@ -107,7 +108,7 @@ impl JoecalState { handles.spawn({ async move { if let Err(e) = state.listen_multicast(&konfig).await { - eprintln!("UDP listener error: {e}"); + error!("UDP listener error: {e}"); } Listeners::Multicast } @@ -123,7 +124,7 @@ impl JoecalState { break; } if let Err(e) = state.announce(None, &config).await { - eprintln!("Announcement error: {e}"); + error!("Announcement error: {e}"); } tokio::time::sleep(std::time::Duration::from_secs(5)).await; } diff --git a/src/transfer.rs b/src/transfer.rs index 4f71ced..e5c454a 100644 --- a/src/transfer.rs +++ b/src/transfer.rs @@ -8,6 +8,7 @@ use axum::{ response::IntoResponse, }; use julid::Julid; +use log::{debug, info, warn}; use serde::{Deserialize, Serialize}; use tokio::sync::mpsc::unbounded_channel; @@ -77,7 +78,7 @@ impl JoecalState { .send() .await?; - println!("Response: {response:?}"); + debug!("Response: {response:?}"); let response: PrepareUploadResponse = response.json().await?; @@ -123,11 +124,11 @@ impl JoecalState { session.receiver.protocol, session.addr)) .body(body); - println!("Uploading file: {request:?}"); + debug!("Uploading file: {request:?}"); let response = request.send().await?; if response.status() != 200 { - println!("Upload failed: {response:?}"); + warn!("Upload failed: {response:?}"); return Err(LocalSendError::UploadFailed); } @@ -193,7 +194,7 @@ pub async fn register_prepare_upload( ConnectInfo(addr): ConnectInfo, Json(req): Json, ) -> impl IntoResponse { - println!("Received upload request from alias: {}", req.info.alias); + info!("Received upload request from alias: {}", req.info.alias); let id = Julid::new(); let (tx, mut rx) = unbounded_channel();