From 85de24f1786cd12b0d7206dce241809daaee221c Mon Sep 17 00:00:00 2001 From: s1idewhist1e <trombonedude05@gmail.com> Date: Wed, 17 May 2023 14:13:41 -0700 Subject: [PATCH] add event handling to logger --- packages/backend/Cargo.lock | 238 +++++++++++++++++++-- packages/backend/crates/logging/Cargo.toml | 3 +- packages/backend/crates/logging/src/lib.rs | 101 +++++++-- packages/backend/crates/server/Cargo.toml | 2 + packages/backend/crates/server/src/lib.rs | 8 +- packages/backend/src/main.rs | 28 ++- 6 files changed, 331 insertions(+), 49 deletions(-) diff --git a/packages/backend/Cargo.lock b/packages/backend/Cargo.lock index e3b73eeb0e..7e640eb5dc 100644 --- a/packages/backend/Cargo.lock +++ b/packages/backend/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.71" @@ -96,18 +105,45 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bumpalo" +version = "3.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" + [[package]] name = "bytes" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-integer", + "num-traits", + "time", + "wasm-bindgen", + "winapi", +] + [[package]] name = "config" version = "0.1.0" @@ -119,6 +155,31 @@ dependencies = [ "url", ] +[[package]] +name = "console" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.42.0", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "fnv" version = "1.0.7" @@ -239,6 +300,29 @@ dependencies = [ "want", ] +[[package]] +name = "iana-time-zone" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "idna" version = "0.3.0" @@ -265,6 +349,15 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +[[package]] +name = "js-sys" +version = "0.3.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -300,8 +393,9 @@ dependencies = [ name = "logging" version = "0.1.0" dependencies = [ + "chrono", "config", - "termcolor", + "console", "thiserror", "tracing", "tracing-subscriber", @@ -341,7 +435,7 @@ checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.45.0", ] @@ -355,6 +449,25 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.15.0" @@ -559,8 +672,10 @@ dependencies = [ "anyhow", "axum", "config", + "logging", "macros", "tokio", + "tracing", ] [[package]] @@ -614,15 +729,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - [[package]] name = "thiserror" version = "1.0.40" @@ -653,6 +759,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -812,6 +929,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + [[package]] name = "unsafe-libyaml" version = "0.2.8" @@ -845,12 +968,72 @@ dependencies = [ "try-lock", ] +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" + [[package]] name = "winapi" version = "0.3.9" @@ -867,21 +1050,36 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-sys" version = "0.45.0" diff --git a/packages/backend/crates/logging/Cargo.toml b/packages/backend/crates/logging/Cargo.toml index c3b8bd7c69..2b3d4a5909 100644 --- a/packages/backend/crates/logging/Cargo.toml +++ b/packages/backend/crates/logging/Cargo.toml @@ -6,8 +6,9 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +chrono = "0.4.24" config = { path = "../config" } -termcolor = "1.2.0" +console = "0.15.5" thiserror = "1.0.40" tracing = "0.1.37" tracing-subscriber = "0.3.17" diff --git a/packages/backend/crates/logging/src/lib.rs b/packages/backend/crates/logging/src/lib.rs index 03949c6542..a9b785b588 100644 --- a/packages/backend/crates/logging/src/lib.rs +++ b/packages/backend/crates/logging/src/lib.rs @@ -1,53 +1,118 @@ +use console::{pad_str, style, Style}; use std::{ - io::{stdout, Stdout, Write}, - sync::{Arc, RwLock}, + io::Write, + num::NonZeroU64, + sync::{Arc, Mutex, RwLock}, }; -use tracing::{span, Level, Subscriber}; +use tracing::{field::Visit, span, Level, Subscriber}; #[derive(thiserror::Error, Debug)] -pub struct Logger<T: Write> { +pub struct Logger<T> +where + T: Write, +{ log_level: Level, writer: Arc<RwLock<T>>, + log_id: Mutex<NonZeroU64>, } -impl<T: Write> Logger<T> { +impl<T> Logger<T> +where + T: Write, +{ pub fn new(log_level: Level, writer: T) -> Self { Self { log_level, writer: RwLock::new(writer).into(), + log_id: NonZeroU64::new(1).unwrap().into(), } } } -impl<T: Write + 'static> Subscriber for Logger<T> { +impl<T> Subscriber for Logger<T> +where + T: Write + 'static, +{ fn enabled(&self, metadata: &tracing::Metadata<'_>) -> bool { - &self.log_level <= metadata.level() + &self.log_level >= metadata.level() } - fn new_span(&self, span: &span::Attributes<'_>) -> span::Id { - todo!() + fn new_span(&self, _span: &span::Attributes<'_>) -> span::Id { + let id = match self.log_id.lock() { + Ok(mut v) => { + *v = v.checked_add(1).unwrap(); + *v + } + Err(_) => NonZeroU64::new(1).unwrap(), + }; + span::Id::from_non_zero_u64(id) } - fn record(&self, span: &span::Id, values: &span::Record<'_>) { - todo!() + fn record(&self, _span: &span::Id, _values: &span::Record<'_>) { + //todo!() } - fn record_follows_from(&self, span: &span::Id, follows: &span::Id) { - todo!() + fn record_follows_from(&self, _span: &span::Id, _followss: &span::Id) { + //todo!() } fn event(&self, event: &tracing::Event<'_>) { let mut out_buffer = self.writer.write().unwrap(); + //let mut out_buffer = Ansi::new(out_buffer.deref_mut()); - writeln!(out_buffer, "{:#?}", event.metadata()).unwrap(); + //_ = out_buffer.write_all( + + let level = *event.metadata().level(); + + let header = Style::new(); + let s = pad_str(level.as_str(), 5, console::Alignment::Left, None); + let header = match level { + Level::ERROR => header.red(), + Level::WARN => header.yellow(), + Level::INFO => header.white(), + Level::DEBUG => header.cyan(), + Level::TRACE => header.bright().black(), + }; + + let mut visitor = V(String::new(), true); + event.record(&mut visitor); + + let message = header.apply_to(format!( + "{}: [{}] {}", + s, + style(chrono::offset::Local::now()).bright(), + visitor.0 + )); + + _ = writeln!(out_buffer, "{message}"); + + // ); + + _ = out_buffer.flush(); + + //write!(out_buffer, "{:#?}", event.metadata()).unwrap(); + + /// A visitor for determining the contents of the fields + #[derive(Default)] + struct V(String, bool); + + impl Visit for V { + fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) { + self.0.push_str(&if self.1 { + format!("{}={:#?}", field.name(), value) + } else { + format!("{}={:?}", field.name(), value) + }); + } + } } - fn enter(&self, span: &span::Id) { - todo!() + fn enter(&self, _span: &span::Id) { + //todo!() } - fn exit(&self, span: &span::Id) { - todo!() + fn exit(&self, _span: &span::Id) { + //todo!() } } diff --git a/packages/backend/crates/server/Cargo.toml b/packages/backend/crates/server/Cargo.toml index b8af2d44db..f9aff5565e 100644 --- a/packages/backend/crates/server/Cargo.toml +++ b/packages/backend/crates/server/Cargo.toml @@ -10,4 +10,6 @@ axum = "0.6.18" tokio = { version = "1.28.1", features = ["full"] } config = { path = "../config" } macros = { path = "../macros" } +logging = { path = "../logging" } anyhow = "1.0.71" +tracing = "0.1.37" diff --git a/packages/backend/crates/server/src/lib.rs b/packages/backend/crates/server/src/lib.rs index 3dfe84592b..a687e48b65 100644 --- a/packages/backend/crates/server/src/lib.rs +++ b/packages/backend/crates/server/src/lib.rs @@ -3,6 +3,8 @@ use axum::Router; use config::get_config; use tokio::runtime; +use tracing::info; + pub mod api { pub mod routes; } @@ -11,6 +13,7 @@ pub enum Error {} pub fn init() -> anyhow::Result<()> { // initialize tokio runtime + info!("Initializing tokio runtime"); let mut rt = runtime::Builder::new_multi_thread(); let rt = rt.enable_all(); @@ -23,12 +26,13 @@ pub fn init() -> anyhow::Result<()> { let app = Router::new().nest("/api", api::routes::routes()); + type Result = anyhow::Result<()>; + rt.block_on(async { axum::Server::bind(&format!("127.0.0.1:{}", get_config()?.port).parse()?) .serve(app.into_make_service()) .await?; - anyhow::Result::<()>::Ok(()) // FIXME: for some reason I can't figure out the syntax for a - // return type on an `async {}` block + Result::Ok(()) })?; Ok(()) diff --git a/packages/backend/src/main.rs b/packages/backend/src/main.rs index f9d869f53b..f9efd8c6fe 100644 --- a/packages/backend/src/main.rs +++ b/packages/backend/src/main.rs @@ -1,8 +1,9 @@ use std::{ env, fmt, - path::{Path, PathBuf}, io::stdout, + io::stdout, + path::{Path, PathBuf}, }; -use tracing::debug; +use tracing::{debug, error}; #[macro_use] extern crate macros; @@ -17,14 +18,23 @@ fn main() -> anyhow::Result<()> { ); // logging - let subscriber = logging::Logger::new(if is_release!() { - tracing::Level::INFO - } else { - tracing::Level::DEBUG - }, stdout()); + let subscriber = logging::Logger::new( + if is_release!() { + tracing::Level::INFO + } else { + tracing::Level::TRACE + }, + stdout(), + ); tracing::subscriber::set_global_default(subscriber)?; + tracing::info!("info"); + tracing::trace!("trace"); + tracing::debug!("debug"); + tracing::warn!("warn"); + tracing::error!("error"); + // bootstrap // ENV @@ -39,7 +49,9 @@ fn main() -> anyhow::Result<()> { debug!(config_file = ?config::get_config()); - server::init()?; + if let Err(e) = server::init() { + error!("Fatal error in server core: {}", e); + } Ok(()) }