From a23c5217d19439d69f07ec683c1f34ceab3c2f60 Mon Sep 17 00:00:00 2001 From: Fabian Stamm Date: Wed, 5 Nov 2025 22:29:21 +0100 Subject: [PATCH] Switch to tracing from log --- Cargo.lock | 141 ++++++++++++++++++++++++++++++++++++++++++++------ Cargo.toml | 4 +- src/config.rs | 2 +- src/consul.rs | 5 +- src/main.rs | 47 +++++++++++------ src/tcp.rs | 2 +- src/udp.rs | 4 +- 7 files changed, 162 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 68eec48..5f6bd08 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -17,6 +17,15 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -172,15 +181,6 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" -[[package]] -name = "fern" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69ff9c9d5fb3e6da8ac2f77ab76fe7e8087d512ce095200f8f29ac5b656cf6dc" -dependencies = [ - "log", -] - [[package]] name = "fnv" version = "1.0.7" @@ -560,6 +560,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.162" @@ -594,6 +600,15 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + [[package]] name = "memchr" version = "2.7.4" @@ -644,6 +659,15 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -825,6 +849,23 @@ dependencies = [ "bitflags", ] +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + [[package]] name = "reqwest" version = "0.12.9" @@ -904,14 +945,14 @@ version = "0.1.13" dependencies = [ "async-trait", "chrono", - "fern", - "log", "rand", "reqwest", "serde", "serde_json", "serde_yaml", "tokio", + "tracing", + "tracing-subscriber", ] [[package]] @@ -1015,6 +1056,15 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1096,6 +1146,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + [[package]] name = "tinystr" version = "0.7.6" @@ -1153,21 +1212,63 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", + "tracing-attributes", "tracing-core", ] [[package]] -name = "tracing-core" -version = "0.1.32" +name = "tracing-attributes" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", ] [[package]] @@ -1211,6 +1312,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/Cargo.toml b/Cargo.toml index bf259ba..28431ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,14 +16,14 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" serde_yaml = "0.9" rand = "0.8" -log = "0.4" -fern = "0.7" chrono = "0.4" async-trait = "0.1" reqwest = { version = "0.12", optional = true, features = [ "json", "default-tls", ], default-features = false } +tracing = "0.1.41" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } [profile.release] opt-level = 3 # Optimize for size. diff --git a/src/config.rs b/src/config.rs index 3e02b78..2335898 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,8 +1,8 @@ use std::{fs::File, path::Path}; -use log::info; use serde::Deserialize; use tokio::signal::unix::Signal; +use tracing::info; use crate::Result; diff --git a/src/consul.rs b/src/consul.rs index 505b8b5..0a37b9b 100644 --- a/src/consul.rs +++ b/src/consul.rs @@ -2,12 +2,9 @@ use std::collections::HashMap; -use log::debug; -use log::info; -use log::trace; -use log::warn; use reqwest::header::HeaderMap; use serde::{Deserialize, Serialize}; +use tracing::{debug, info, trace, warn}; use crate::config::Config; use crate::config::ConfigProvider; diff --git a/src/main.rs b/src/main.rs index 442df27..71a0755 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,11 +8,12 @@ mod udp; mod consul; use config::ConfigProvider; -use log::{debug, error, info, warn}; use std::collections::{HashMap, HashSet}; use std::error::Error; use std::sync::Arc; use tokio::sync::{broadcast, RwLock}; +use tracing::{debug, error, info, warn}; +use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; pub type Result = std::result::Result>; @@ -25,21 +26,35 @@ struct ActiveListener { #[tokio::main] async fn main() -> Result<()> { - fern::Dispatch::new() - .format(|out, message, record| { - out.finish(format_args!( - "{}[{}][{}] {}", - chrono::Local::now().format("[%Y-%m-%d][%H:%M:%S]"), - record.target(), - record.level(), - message - )) - }) - // Add blanket level filter - - .level(log::LevelFilter::Info) - .level_for("rustocat", log::LevelFilter::Debug) - .chain(std::io::stdout()) - .apply()?; + std::panic::set_hook(Box::new(|panic| { + // Get a backtrace! + let backtrace = std::backtrace::Backtrace::capture(); + + // If the panic has a source location, record it as structured fields. + if let Some(location) = panic.location() { + // On nightly Rust, where the `PanicInfo` type also exposes a + // `message()` method returning just the message, we could record + // just the message instead of the entire `fmt::Display` + // implementation, avoiding the duplicated location + tracing::error!( + message = %panic, + panic.file = location.file(), + panic.line = location.line(), + panic.column = location.column(), + panic.backtrace = %backtrace + ); + } else { + tracing::error!(message = %panic, panic.backtrace = %backtrace); + } + })); + + tracing_subscriber::registry() + .with( + tracing_subscriber::filter::EnvFilter::try_from_default_env() + .unwrap_or_else(|_| "info".into()), + ) + .with(tracing_subscriber::fmt::layer()) + .init(); let listeners: HashMap = HashMap::new(); let text_config_provider = config::FileConfigProvider::new(); diff --git a/src/tcp.rs b/src/tcp.rs index db76552..673b4c1 100644 --- a/src/tcp.rs +++ b/src/tcp.rs @@ -1,8 +1,8 @@ use crate::listener::Listener; -use log::{error, info, trace, warn}; use rand::seq::SliceRandom; use std::error::Error; use tokio::net::{TcpListener, TcpStream}; +use tracing::{error, info, trace, warn}; #[derive(Debug)] struct TcpHandler { diff --git a/src/udp.rs b/src/udp.rs index 762b722..77e8e72 100644 --- a/src/udp.rs +++ b/src/udp.rs @@ -2,8 +2,8 @@ use std::collections::HashMap; use std::sync::atomic::AtomicI32; use std::sync::Arc; -use log::{debug, error, info, trace, warn}; use rand::seq::SliceRandom; +use tracing::{debug, error, info, trace, warn}; use tokio::net::UdpSocket; use tokio::sync::Mutex; @@ -104,7 +104,7 @@ impl UDPChannel { let num_bytes = tokio::select! { res = upstream_listener.recv(&mut buf) => res.unwrap(), _ = shutdown_receiver.recv() => { - info!("Exiting"); + debug!("Exiting upstream_listener"); return; } };