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 # Dev
config.yaml config.yaml
/logs *.txt
# npm # npm
/node_modules/ /node_modules/

33
Cargo.lock generated
View file

@ -239,10 +239,10 @@ dependencies = [
"lettre", "lettre",
"serde", "serde",
"serde_yaml", "serde_yaml",
"time",
"tokio", "tokio",
"tower-http", "tower-http",
"tracing", "tracing",
"tracing-appender",
"tracing-subscriber", "tracing-subscriber",
] ]
@ -255,25 +255,6 @@ dependencies = [
"cfg-if", "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]] [[package]]
name = "email-encoding" name = "email-encoding"
version = "0.2.0" version = "0.2.0"
@ -1185,17 +1166,6 @@ dependencies = [
"tracing-core", "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]] [[package]]
name = "tracing-attributes" name = "tracing-attributes"
version = "0.1.23" version = "0.1.23"
@ -1238,6 +1208,7 @@ dependencies = [
"sharded-slab", "sharded-slab",
"smallvec", "smallvec",
"thread_local", "thread_local",
"time",
"tracing-core", "tracing-core",
"tracing-log", "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"] } lettre = { version = "0.10", default-features = false, features = ["smtp-transport", "hostname", "rustls-tls", "pool", "builder"] }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_yaml = "0.9" serde_yaml = "0.9"
time = "0.3"
tokio = { version = "1.25", default-features = false, features = ["macros", "rt"] } tokio = { version = "1.25", default-features = false, features = ["macros", "rt"] }
tower-http = { version = "0.3", features = ["fs"] } tower-http = { version = "0.3", features = ["fs"] }
tracing = "0.1" tracing = "0.1"
tracing-appender = "0.2" tracing-subscriber = { version = "0.3", features = ["time"] }
tracing-subscriber = "0.3"

View file

@ -4,12 +4,6 @@ use std::env;
use std::fs::File; use std::fs::File;
use std::io::BufReader; use std::io::BufReader;
#[derive(Deserialize)]
pub struct SocketAddress {
pub address: [u8; 4],
pub port: u16,
}
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct EmailServer { pub struct EmailServer {
pub server_name: String, pub server_name: String,
@ -18,16 +12,9 @@ pub struct EmailServer {
} }
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct Address { pub struct UtcOffset {
pub name: String, pub hours: i8,
pub user: String, pub minutes: i8,
pub domain: String,
}
#[derive(Deserialize)]
pub struct Logging {
pub directory: String,
pub filename: String,
} }
#[derive(Deserialize)] #[derive(Deserialize)]
@ -59,11 +46,12 @@ pub struct Strings {
pub struct Config { pub struct Config {
pub lang: String, pub lang: String,
pub path_prefix: String, pub path_prefix: String,
pub socket_address: SocketAddress, pub socket_address: String,
pub email_server: EmailServer, pub email_server: EmailServer,
pub email_from: Address, pub email_from: String,
pub email_to: Address, pub email_to: String,
pub logging: Logging, pub log_file: String,
pub utc_offset: UtcOffset,
pub error_messages: ErrorMessages, pub error_messages: ErrorMessages,
pub strings: Strings, pub strings: Strings,
} }

View file

@ -1,17 +1,46 @@
use tracing_appender::non_blocking::WorkerGuard; use anyhow::{Context, Result};
use tracing_subscriber::filter::LevelFilter; 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 stdout_level_filter = if cfg!(debug_assertions) {
let file_appender = LevelFilter::DEBUG
tracing_appender::rolling::never(&logging_config.directory, &logging_config.filename); } else {
let (non_blocking, guard) = tracing_appender::non_blocking(file_appender); LevelFilter::INFO
};
let stdout_layer = fmt::layer()
.with_ansi(true)
.with_timer(timer.clone())
.with_filter(stdout_level_filter);
tracing_subscriber::fmt() let log_file = OpenOptions::new()
.with_max_level(LevelFilter::INFO) .create(true)
.with_writer(non_blocking) .append(true)
.init(); .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 anyhow::{Context, Result};
use lettre::address::Address; use lettre::{
use lettre::message::{Mailbox, MessageBuilder}; message::{Mailbox, MessageBuilder},
use lettre::transport::smtp::authentication::Credentials; transport::smtp::authentication::Credentials,
use lettre::Transport; Message, SmtpTransport, Transport,
use lettre::{Message, SmtpTransport}; };
use crate::config; use crate::config;
@ -25,16 +25,16 @@ impl Mailer {
.build(); .build();
let message_builder = Message::builder() let message_builder = Message::builder()
.from(Mailbox::new( .from(
Some(mem::take(&mut config.email_from.name)), config
Address::new(&config.email_from.user, &config.email_from.domain) .email_from
.context("Failed to create the From email address!")?, .parse()
)) .context("Failed to parse the From mailbox!")?,
.to(Mailbox::new( )
Some(mem::take(&mut config.email_to.name)), .to(config
Address::new(&config.email_to.user, &config.email_to.domain) .email_to
.context("Failed to create the To email address!")?, .parse()
)); .context("Failed to parse the To mailbox!")?);
Ok(Self { Ok(Self {
mailer, mailer,

View file

@ -14,12 +14,7 @@ use axum::{
routing::{get, get_service, Router}, routing::{get, get_service, Router},
Server, Server,
}; };
use std::{ use std::{future::ready, net::SocketAddr, process, sync::Arc};
future::ready,
net::{IpAddr, Ipv4Addr, SocketAddr},
process,
sync::Arc,
};
use tower_http::services::ServeDir; use tower_http::services::ServeDir;
use tracing::info; use tracing::info;
@ -28,15 +23,19 @@ async fn init() -> Result<()> {
let path_prefix = config.path_prefix.clone(); let path_prefix = config.path_prefix.clone();
let mailer = Arc::new(mailer::Mailer::new(&mut config)?); let mailer = Arc::new(mailer::Mailer::new(&mut config)?);
let address = config.socket_address.address; let socket_address = config
let socket_address = SocketAddr::new( .socket_address
IpAddr::V4(Ipv4Addr::new( .parse::<SocketAddr>()
address[0], address[1], address[2], address[3], .unwrap_or_else(|e| {
)), format!("Failed to parse the socket address: {e:?}");
config.socket_address.port, 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 config = Arc::new(config);
let captcha_solutions = Arc::new(captcha_solutions::SharedCaptchaSolutions::default()); let captcha_solutions = Arc::new(captcha_solutions::SharedCaptchaSolutions::default());