diff --git a/Cargo.lock b/Cargo.lock index b78c983..b26f85b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -238,6 +238,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anyhow" version = "1.0.42" @@ -456,17 +465,6 @@ dependencies = [ "syn", ] -[[package]] -name = "colored" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ffc801dacf156c5854b9df4f425a626539c3a6ef7893cc0c5084a23f0b6c59" -dependencies = [ - "atty", - "lazy_static", - "winapi", -] - [[package]] name = "const_fn" version = "0.4.8" @@ -1197,7 +1195,6 @@ dependencies = [ "serde_json", "serde_repr", "serde_yaml", - "simple_logger", "sodiumoxide", "sqlx", "tempfile", @@ -1205,6 +1202,9 @@ dependencies = [ "tokio", "tokio-stream", "tokio-util", + "tracing", + "tracing-futures", + "tracing-subscriber", "url", "vergen", ] @@ -1215,6 +1215,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + [[package]] name = "matches" version = "0.1.8" @@ -1604,6 +1613,15 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax", +] + [[package]] name = "regex-syntax" version = "0.6.25" @@ -1885,6 +1903,15 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "sharded-slab" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79c719719ee05df97490f80a45acfc99e5a30ce98a1e4fb67aee422745ae14e3" +dependencies = [ + "lazy_static", +] + [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -1900,19 +1927,6 @@ version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c19772be3c4dd2ceaacf03cb41d5885f2a02c4d8804884918e3a258480803335" -[[package]] -name = "simple_logger" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd57f17c093ead1d4a1499dc9acaafdd71240908d64775465543b8d9a9f1d198" -dependencies = [ - "atty", - "chrono", - "colored", - "log", - "winapi", -] - [[package]] name = "slab" version = "0.4.3" @@ -2232,6 +2246,15 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +dependencies = [ + "once_cell", +] + [[package]] name = "time" version = "0.1.43" @@ -2377,9 +2400,21 @@ checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tracing-core" version = "0.1.18" @@ -2389,6 +2424,60 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-log" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab69019741fca4d98be3c62d2b75254528b5432233fd8a4d2739fec20278de48" +dependencies = [ + "ansi_term", + "chrono", + "lazy_static", + "matchers", + "parking_lot", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + [[package]] name = "try-lock" version = "0.2.3" diff --git a/Cargo.toml b/Cargo.toml index 1e614f4..2b6ec32 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,13 +38,15 @@ serde = "1" serde_json = "1" serde_repr = "0.1" serde_yaml = "0.8" -simple_logger = "1" sodiumoxide = "0.2" sqlx = { version = "0.5", features = [ "runtime-actix-rustls", "sqlite", "time", "chrono", "macros", "offline" ] } thiserror = "1" tokio = { version = "1", features = [ "full", "parking_lot" ] } tokio-stream = { version = "0.1", features = [ "sync" ] } tokio-util = { version = "0.6", features = [ "codec" ] } +tracing = "0.1" +tracing-futures = "0.2" +tracing-subscriber = { version = "0.2", features = [ "parking_lot" ] } url = { version = "2", features = [ "serde" ] } [build-dependencies] diff --git a/src/cache/disk.rs b/src/cache/disk.rs index f86dc0e..589f085 100644 --- a/src/cache/disk.rs +++ b/src/cache/disk.rs @@ -10,7 +10,7 @@ use std::sync::Arc; use async_trait::async_trait; use futures::StreamExt; -use log::{debug, error, warn, LevelFilter}; +use log::LevelFilter; use md5::digest::generic_array::GenericArray; use md5::{Digest, Md5}; use sqlx::sqlite::SqliteConnectOptions; @@ -18,6 +18,7 @@ use sqlx::{ConnectOptions, Sqlite, SqlitePool, Transaction}; use tokio::fs::remove_file; use tokio::sync::mpsc::{channel, Receiver, Sender}; use tokio_stream::wrappers::ReceiverStream; +use tracing::{debug, error, warn}; use crate::units::Bytes; @@ -324,6 +325,8 @@ impl Cache for DiskCache { ) -> Option> { let channel = self.db_update_channel_sender.clone(); + // TODO: Check legacy path as well + let path = Arc::new(self.disk_path.clone().join(PathBuf::from(key))); let path_0 = Arc::clone(&path); diff --git a/src/cache/fs.rs b/src/cache/fs.rs index 61c43f0..5bffcf4 100644 --- a/src/cache/fs.rs +++ b/src/cache/fs.rs @@ -24,7 +24,6 @@ use std::task::{Context, Poll}; use actix_web::error::PayloadError; use bytes::Bytes; use futures::Future; -use log::{debug, warn}; use serde::{Deserialize, Serialize}; use sodiumoxide::crypto::secretstream::{ Header, Pull, Push, Stream as SecretStream, Tag, HEADERBYTES, @@ -33,6 +32,7 @@ use tokio::fs::{create_dir_all, remove_file, File}; use tokio::io::{AsyncRead, AsyncReadExt, AsyncSeekExt, AsyncWrite, AsyncWriteExt, ReadBuf}; use tokio::sync::mpsc::Sender; use tokio_util::codec::{BytesCodec, FramedRead}; +use tracing::{debug, warn}; use super::compat::LegacyImageMetadata; use super::{CacheKey, ImageMetadata, InnerStream, ENCRYPTION_KEY}; diff --git a/src/client.rs b/src/client.rs index 2734d3d..f7f7d8f 100644 --- a/src/client.rs +++ b/src/client.rs @@ -5,7 +5,6 @@ use std::time::Duration; use actix_web::http::{HeaderMap, HeaderName, HeaderValue}; use actix_web::web::Data; use bytes::Bytes; -use log::{debug, error, warn}; use once_cell::sync::Lazy; use parking_lot::RwLock; use reqwest::header::{ @@ -15,6 +14,7 @@ use reqwest::header::{ use reqwest::{Client, StatusCode}; use tokio::sync::watch::{channel, Receiver}; use tokio::sync::Notify; +use tracing::{debug, error, warn}; use crate::cache::{Cache, CacheKey, ImageMetadata}; diff --git a/src/config.rs b/src/config.rs index c66557d..49320fe 100644 --- a/src/config.rs +++ b/src/config.rs @@ -12,6 +12,7 @@ use clap::{crate_authors, crate_description, crate_version, Clap}; use log::LevelFilter; use serde::{Deserialize, Serialize}; use thiserror::Error; +use tracing::level_filters::LevelFilter as TracingLevelFilter; use url::Url; use crate::units::{KilobitsPerSecond, Mebibytes, Port}; @@ -78,7 +79,7 @@ pub struct Config { pub cache_type: CacheType, pub cache_path: PathBuf, pub shutdown_timeout: NonZeroU16, - pub log_level: LevelFilter, + pub log_level: TracingLevelFilter, pub client_secret: ClientSecret, pub port: Port, pub bind_address: SocketAddr, @@ -97,15 +98,23 @@ impl Config { let file_extended_options = file_args.extended_options.unwrap_or_default(); let log_level = match (cli_args.quiet, cli_args.verbose) { - (n, _) if n > 2 => LevelFilter::Off, - (2, _) => LevelFilter::Error, - (1, _) => LevelFilter::Warn, + (n, _) if n > 2 => TracingLevelFilter::OFF, + (2, _) => TracingLevelFilter::ERROR, + (1, _) => TracingLevelFilter::WARN, // Use log level from file if no flags were provided to CLI (0, 0) => file_extended_options .logging_level - .unwrap_or(LevelFilter::Info), - (_, 1) => LevelFilter::Debug, - (_, n) if n > 1 => LevelFilter::Trace, + .map(|filter| match filter { + LevelFilter::Off => TracingLevelFilter::OFF, + LevelFilter::Error => TracingLevelFilter::ERROR, + LevelFilter::Warn => TracingLevelFilter::WARN, + LevelFilter::Info => TracingLevelFilter::INFO, + LevelFilter::Debug => TracingLevelFilter::DEBUG, + LevelFilter::Trace => TracingLevelFilter::TRACE, + }) + .unwrap_or(TracingLevelFilter::INFO), + (_, 1) => TracingLevelFilter::DEBUG, + (_, n) if n > 1 => TracingLevelFilter::TRACE, // compiler can't figure it out _ => unsafe { unreachable_unchecked() }, }; diff --git a/src/main.rs b/src/main.rs index a9f4d87..b1fa3ce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,14 +15,13 @@ use actix_web::web::{self, Data}; use actix_web::{App, HttpResponse, HttpServer}; use cache::{Cache, DiskCache}; use config::Config; -use log::{debug, error, info, warn}; use parking_lot::RwLock; use rustls::{NoClientAuth, ServerConfig}; -use simple_logger::SimpleLogger; use sodiumoxide::crypto::secretstream::gen_key; use state::{RwLockServerState, ServerState}; use stop::send_stop; use thiserror::Error; +use tracing::{debug, error, info, warn}; use crate::cache::mem::{Lfu, Lru}; use crate::cache::{MemoryCache, ENCRYPTION_KEY}; @@ -80,7 +79,10 @@ async fn main() -> Result<(), Box> { // Logging and warnings // - SimpleLogger::new().with_level(config.log_level).init()?; + // SimpleLogger::new().with_level(config.log_level).init()?; + tracing_subscriber::fmt() + .with_max_level(config.log_level) + .init(); if let Err(e) = print_preamble_and_warnings(&config) { error!("{}", e); diff --git a/src/ping.rs b/src/ping.rs index 2366c5e..4f1af43 100644 --- a/src/ping.rs +++ b/src/ping.rs @@ -1,7 +1,6 @@ use std::sync::atomic::Ordering; use std::{io::BufReader, sync::Arc}; -use log::{debug, error, info, warn}; use rustls::internal::pemfile::{certs, rsa_private_keys}; use rustls::sign::{RSASigningKey, SigningKey}; use rustls::Certificate; @@ -9,6 +8,7 @@ use serde::de::{MapAccess, Visitor}; use serde::{Deserialize, Serialize}; use serde_repr::Deserialize_repr; use sodiumoxide::crypto::box_::PrecomputedKey; +use tracing::{debug, error, info, warn}; use url::Url; use crate::config::{ClientSecret, Config, UnstableOptions, VALIDATE_TOKENS}; diff --git a/src/routes.rs b/src/routes.rs index b6eb6dd..9c454e0 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -10,11 +10,11 @@ use base64::DecodeError; use bytes::Bytes; use chrono::{DateTime, Utc}; use futures::Stream; -use log::{debug, error, info, trace}; use prometheus::{Encoder, TextEncoder}; use serde::Deserialize; use sodiumoxide::crypto::box_::{open_precomputed, Nonce, PrecomputedKey, NONCEBYTES}; use thiserror::Error; +use tracing::{debug, error, info, trace}; use crate::cache::{Cache, CacheKey, ImageMetadata, UpstreamError}; use crate::client::{FetchResult, DEFAULT_HEADERS, HTTP_CLIENT}; diff --git a/src/state.rs b/src/state.rs index 8e3b542..61c9d4d 100644 --- a/src/state.rs +++ b/src/state.rs @@ -4,7 +4,6 @@ use std::sync::atomic::{AtomicBool, Ordering}; use crate::config::{ClientSecret, Config, UnstableOptions, OFFLINE_MODE, VALIDATE_TOKENS}; use crate::ping::{Request, Response, CONTROL_CENTER_PING_URL}; use arc_swap::ArcSwap; -use log::{error, info, warn}; use once_cell::sync::OnceCell; use parking_lot::RwLock; use rustls::sign::{CertifiedKey, SigningKey}; @@ -12,6 +11,7 @@ use rustls::Certificate; use rustls::{ClientHello, ResolvesServerCert}; use sodiumoxide::crypto::box_::{PrecomputedKey, PRECOMPUTEDKEYBYTES}; use thiserror::Error; +use tracing::{error, info, warn}; use url::Url; pub struct ServerState { diff --git a/src/stop.rs b/src/stop.rs index 5164ffa..b2e3e1b 100644 --- a/src/stop.rs +++ b/src/stop.rs @@ -1,6 +1,6 @@ -use log::{info, warn}; use reqwest::StatusCode; use serde::Serialize; +use tracing::{info, warn}; use crate::config::ClientSecret;