Simplify config and setup logging well

This commit is contained in:
Mo 2023-02-23 03:22:31 +01:00
parent b7a3117ad8
commit e6b7c549e3
7 changed files with 82 additions and 95 deletions

2
.gitignore vendored
View file

@ -3,7 +3,7 @@
# Dev
config.yaml
/logs
*.txt
# npm
/node_modules/

33
Cargo.lock generated
View file

@ -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",
]

View file

@ -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"] }

View file

@ -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,
}

View file

@ -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(())
}

View file

@ -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,

View file

@ -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::<SocketAddr>()
.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());