From e6b7c549e333e7955871f0f87c756abdcb7f4bae Mon Sep 17 00:00:00 2001 From: Mo8it Date: Thu, 23 Feb 2023 03:22:31 +0100 Subject: [PATCH] Simplify config and setup logging well --- .gitignore | 2 +- Cargo.lock | 33 ++----------------------------- Cargo.toml | 4 ++-- src/config.rs | 28 ++++++++------------------ src/logging.rs | 53 ++++++++++++++++++++++++++++++++++++++------------ src/mailer.rs | 30 ++++++++++++++-------------- src/main.rs | 27 +++++++++++++------------ 7 files changed, 82 insertions(+), 95 deletions(-) diff --git a/.gitignore b/.gitignore index 1d700af..5081d97 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ # Dev config.yaml -/logs +*.txt # npm /node_modules/ diff --git a/Cargo.lock b/Cargo.lock index 1e812d0..22d759f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -239,10 +239,10 @@ dependencies = [ "lettre", "serde", "serde_yaml", + "time", "tokio", "tower-http", "tracing", - "tracing-appender", "tracing-subscriber", ] @@ -255,25 +255,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" -dependencies = [ - "cfg-if", -] - [[package]] name = "email-encoding" version = "0.2.0" @@ -1185,17 +1166,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-appender" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e" -dependencies = [ - "crossbeam-channel", - "time", - "tracing-subscriber", -] - [[package]] name = "tracing-attributes" version = "0.1.23" @@ -1238,6 +1208,7 @@ dependencies = [ "sharded-slab", "smallvec", "thread_local", + "time", "tracing-core", "tracing-log", ] diff --git a/Cargo.toml b/Cargo.toml index b43df50..4e3b5dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,8 +15,8 @@ captcha = { version = "0.0.9", default-features = false } lettre = { version = "0.10", default-features = false, features = ["smtp-transport", "hostname", "rustls-tls", "pool", "builder"] } serde = { version = "1.0", features = ["derive"] } serde_yaml = "0.9" +time = "0.3" tokio = { version = "1.25", default-features = false, features = ["macros", "rt"] } tower-http = { version = "0.3", features = ["fs"] } tracing = "0.1" -tracing-appender = "0.2" -tracing-subscriber = "0.3" +tracing-subscriber = { version = "0.3", features = ["time"] } diff --git a/src/config.rs b/src/config.rs index 5121258..45fea36 100644 --- a/src/config.rs +++ b/src/config.rs @@ -4,12 +4,6 @@ use std::env; use std::fs::File; use std::io::BufReader; -#[derive(Deserialize)] -pub struct SocketAddress { - pub address: [u8; 4], - pub port: u16, -} - #[derive(Deserialize)] pub struct EmailServer { pub server_name: String, @@ -18,16 +12,9 @@ pub struct EmailServer { } #[derive(Deserialize)] -pub struct Address { - pub name: String, - pub user: String, - pub domain: String, -} - -#[derive(Deserialize)] -pub struct Logging { - pub directory: String, - pub filename: String, +pub struct UtcOffset { + pub hours: i8, + pub minutes: i8, } #[derive(Deserialize)] @@ -59,11 +46,12 @@ pub struct Strings { pub struct Config { pub lang: String, pub path_prefix: String, - pub socket_address: SocketAddress, + pub socket_address: String, pub email_server: EmailServer, - pub email_from: Address, - pub email_to: Address, - pub logging: Logging, + pub email_from: String, + pub email_to: String, + pub log_file: String, + pub utc_offset: UtcOffset, pub error_messages: ErrorMessages, pub strings: Strings, } diff --git a/src/logging.rs b/src/logging.rs index 2015161..f1e5fec 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -1,17 +1,46 @@ -use tracing_appender::non_blocking::WorkerGuard; -use tracing_subscriber::filter::LevelFilter; +use anyhow::{Context, Result}; +use std::fs::OpenOptions; +use time::{format_description::well_known::Rfc3339, UtcOffset}; +use tracing_subscriber::{ + filter::LevelFilter, + fmt::{self, time::OffsetTime}, + layer::SubscriberExt, + util::SubscriberInitExt, + Layer, +}; -use crate::config; +pub fn init_logger(log_file: &str, utc_offset_hours: i8, utc_offset_minutes: i8) -> Result<()> { + let timer = OffsetTime::new( + UtcOffset::from_hms(utc_offset_hours, utc_offset_minutes, 0) + .context("Failed to set the time offset from the given utc_hours_offset!")?, + Rfc3339, + ); -pub fn init_logger(logging_config: &config::Logging) -> WorkerGuard { - let file_appender = - tracing_appender::rolling::never(&logging_config.directory, &logging_config.filename); - let (non_blocking, guard) = tracing_appender::non_blocking(file_appender); + let stdout_level_filter = if cfg!(debug_assertions) { + LevelFilter::DEBUG + } else { + LevelFilter::INFO + }; + let stdout_layer = fmt::layer() + .with_ansi(true) + .with_timer(timer.clone()) + .with_filter(stdout_level_filter); - tracing_subscriber::fmt() - .with_max_level(LevelFilter::INFO) - .with_writer(non_blocking) - .init(); + let log_file = OpenOptions::new() + .create(true) + .append(true) + .open(log_file) + .context("Failed to open the log file in append mode!")?; + let file_layer = fmt::layer() + .with_writer(log_file) + .with_ansi(false) + .with_timer(timer) + .with_filter(LevelFilter::INFO); - guard + tracing_subscriber::registry() + .with(stdout_layer.and_then(file_layer)) + .try_init() + .context("Failed to initialize logging!")?; + + Ok(()) } diff --git a/src/mailer.rs b/src/mailer.rs index 8b43685..2c96d27 100644 --- a/src/mailer.rs +++ b/src/mailer.rs @@ -1,9 +1,9 @@ use anyhow::{Context, Result}; -use lettre::address::Address; -use lettre::message::{Mailbox, MessageBuilder}; -use lettre::transport::smtp::authentication::Credentials; -use lettre::Transport; -use lettre::{Message, SmtpTransport}; +use lettre::{ + message::{Mailbox, MessageBuilder}, + transport::smtp::authentication::Credentials, + Message, SmtpTransport, Transport, +}; use crate::config; @@ -25,16 +25,16 @@ impl Mailer { .build(); let message_builder = Message::builder() - .from(Mailbox::new( - Some(mem::take(&mut config.email_from.name)), - Address::new(&config.email_from.user, &config.email_from.domain) - .context("Failed to create the From email address!")?, - )) - .to(Mailbox::new( - Some(mem::take(&mut config.email_to.name)), - Address::new(&config.email_to.user, &config.email_to.domain) - .context("Failed to create the To email address!")?, - )); + .from( + config + .email_from + .parse() + .context("Failed to parse the From mailbox!")?, + ) + .to(config + .email_to + .parse() + .context("Failed to parse the To mailbox!")?); Ok(Self { mailer, diff --git a/src/main.rs b/src/main.rs index 173abee..1e3aa3c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,12 +14,7 @@ use axum::{ routing::{get, get_service, Router}, Server, }; -use std::{ - future::ready, - net::{IpAddr, Ipv4Addr, SocketAddr}, - process, - sync::Arc, -}; +use std::{future::ready, net::SocketAddr, process, sync::Arc}; use tower_http::services::ServeDir; use tracing::info; @@ -28,15 +23,19 @@ async fn init() -> Result<()> { let path_prefix = config.path_prefix.clone(); let mailer = Arc::new(mailer::Mailer::new(&mut config)?); - let address = config.socket_address.address; - let socket_address = SocketAddr::new( - IpAddr::V4(Ipv4Addr::new( - address[0], address[1], address[2], address[3], - )), - config.socket_address.port, - ); + let socket_address = config + .socket_address + .parse::() + .unwrap_or_else(|e| { + format!("Failed to parse the socket address: {e:?}"); + process::exit(1); + }); - let _tracing_gurad = logging::init_logger(&config.logging); + logging::init_logger( + &config.log_file, + config.utc_offset.hours, + config.utc_offset.minutes, + )?; let config = Arc::new(config); let captcha_solutions = Arc::new(captcha_solutions::SharedCaptchaSolutions::default());