Simplify config and setup logging well
This commit is contained in:
parent
b7a3117ad8
commit
e6b7c549e3
7 changed files with 82 additions and 95 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
# Dev
|
# Dev
|
||||||
config.yaml
|
config.yaml
|
||||||
/logs
|
*.txt
|
||||||
|
|
||||||
# npm
|
# npm
|
||||||
/node_modules/
|
/node_modules/
|
||||||
|
|
33
Cargo.lock
generated
33
Cargo.lock
generated
|
@ -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",
|
||||||
]
|
]
|
||||||
|
|
|
@ -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"
|
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
27
src/main.rs
27
src/main.rs
|
@ -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());
|
||||||
|
|
Loading…
Reference in a new issue