diff --git a/Cargo.lock b/Cargo.lock index b861650..e1d250c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -260,6 +260,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -460,6 +469,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.21.2" @@ -546,11 +570,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "baee610e9452a8f6f0a1b6194ec09ff9e2d85dea54432acdae41aa0761c95d70" dependencies = [ "jobserver", + "libc", + "shlex", ] [[package]] @@ -581,6 +607,33 @@ dependencies = [ "stacker", ] +[[package]] +name = "color-eyre" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + [[package]] name = "concurrent-queue" version = "2.2.0" @@ -815,6 +868,16 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "fastrand" version = "1.9.0" @@ -995,6 +1058,12 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + [[package]] name = "gloo-timers" version = "0.2.6" @@ -1190,6 +1259,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "1.9.3" @@ -1256,9 +1331,9 @@ checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] @@ -1509,6 +1584,12 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "mutually_exclusive_features" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94e1e6445d314f972ff7395df2de295fe51b71821694f0b0e1e79c4f12c8577" + [[package]] name = "native-tls" version = "0.2.11" @@ -1575,6 +1656,15 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -1640,6 +1730,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + [[package]] name = "parking" version = "2.1.0" @@ -1687,6 +1783,26 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pin-project" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.43", +] + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -1913,6 +2029,12 @@ dependencies = [ "winreg", ] +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + [[package]] name = "rustc_version" version = "0.4.0" @@ -2091,6 +2213,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -2208,6 +2336,7 @@ dependencies = [ "actix-rt", "actix-web", "async-std", + "color-eyre", "env_logger", "futures", "futures-util", @@ -2221,6 +2350,7 @@ dependencies = [ "serde", "serde_json", "tracing", + "tracing-actix-web", "tracing-appender", "tracing-subscriber", "uuid", @@ -2369,6 +2499,19 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-actix-web" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b87073920bcce23e9f5cb0d2671e9f01d6803bb5229c159b2f5ce6806d73ffc" +dependencies = [ + "actix-web", + "mutually_exclusive_features", + "pin-project", + "tracing", + "uuid", +] + [[package]] name = "tracing-appender" version = "0.2.3" @@ -2402,6 +2545,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber", +] + [[package]] name = "tracing-log" version = "0.2.0" @@ -2515,6 +2668,9 @@ name = "uuid" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +dependencies = [ + "getrandom", +] [[package]] name = "v_htmlescape" diff --git a/Cargo.toml b/Cargo.toml index e659460..02061c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,3 +28,5 @@ tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["fmt", "std", "chrono", "time", "local-time", "env-filter"] } tracing-appender = "0.2.3" actix-files = "0.6.6" +tracing-actix-web = "0.7.14" +color-eyre = "0.6.3" diff --git a/src/main.rs b/src/main.rs index cc75864..9566677 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,9 @@ mod api; use actix_files::Files; use actix_multipart::form::tempfile::TempFileConfig; -use actix_web::{middleware, App, HttpServer}; +use actix_web::body::MessageBody; +use actix_web::dev::{ServiceRequest, ServiceResponse}; +use actix_web::{App, Error, HttpServer}; use api::camp_form::camp_form; use api::church_form::church_form; use api::health_form::health_form; @@ -10,25 +12,51 @@ use api::local_trip_form::local_form; use api::mt_form::mt_form; use api::parent_form::parent_form; use api::teacher_form::teacher_form; -use tracing::info; +use color_eyre::eyre::Context; +use color_eyre::Result; use tracing::level_filters::LevelFilter; +use tracing::{info, Span}; +use tracing_actix_web::{RootSpanBuilder, TracingLogger}; +use tracing_appender::rolling::{RollingFileAppender, Rotation}; use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Layer}; +pub struct DomainRootSpanBuilder; + +impl RootSpanBuilder for DomainRootSpanBuilder { + fn on_request_start(request: &ServiceRequest) -> Span { + let method = request.method(); + let info = request.connection_info(); + let ip = info.realip_remote_addr().expect("hi"); + let location = request.path(); + info!(?method, ip, location); + tracing_actix_web::root_span!(request) + + // let client_id: &str = todo!("Somehow extract it from the authorization header"); + } + + fn on_request_end(_span: Span, _outcome: &Result, Error>) {} +} + #[actix_web::main] async fn main() -> std::io::Result<()> { let timer = tracing_subscriber::fmt::time::ChronoLocal::new("%Y-%m-%d_%I:%M:%S%.6f %P".to_owned()); - let logfile = tracing_appender::rolling::daily("./tmp", "api.log"); + let logfile = RollingFileAppender::builder() + .rotation(Rotation::DAILY) + .filename_prefix("api") + .filename_suffix("log") + .build("./tmp") + .expect("Shouldn't"); let filter = EnvFilter::builder() .with_default_directive(LevelFilter::WARN.into()) .parse_lossy("tfcapi=debug"); let logfile_layer = tracing_subscriber::fmt::layer() - .pretty() .with_writer(logfile) .with_line_number(true) .with_level(true) .with_target(true) + .with_ansi(false) .with_timer(timer.clone()); let stdout_layer = tracing_subscriber::fmt::layer() .pretty() @@ -39,18 +67,19 @@ async fn main() -> std::io::Result<()> { let filter = EnvFilter::builder() .with_default_directive(LevelFilter::WARN.into()) .parse_lossy("tfcapi=debug"); - tracing_subscriber::registry().with(logfile_layer.with_filter(filter).and_then(stdout_layer)); + let subscriber = tracing_subscriber::registry() + .with(logfile_layer.with_filter(filter).and_then(stdout_layer)); + let _ = tracing::subscriber::set_global_default(subscriber).wrap_err("Tracing broked"); - info!("creating temporary upload directory"); std::fs::create_dir_all("./tmp")?; info!("starting HTTP server at http://localhost:4242"); HttpServer::new(|| { App::new() - .wrap(middleware::Logger::default()) + .wrap(TracingLogger::::new()) .app_data(TempFileConfig::default().directory("./tmp")) - .service(Files::new("/", "./public").show_files_listing()) + .service(Files::new("/", "./public").index_file("index.html")) .service(mt_form) .service(health_form) .service(parent_form)