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
|
||||
config.yaml
|
||||
/logs
|
||||
*.txt
|
||||
|
||||
# npm
|
||||
/node_modules/
|
||||
|
|
33
Cargo.lock
generated
33
Cargo.lock
generated
|
@ -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",
|
||||
]
|
||||
|
|
|
@ -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"] }
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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(())
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
27
src/main.rs
27
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::<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());
|
||||
|
|
Loading…
Reference in a new issue