use config_plus::Configuration;
use serde::Deserialize;
#[derive(Deserialize, Configuration)]
#[config(
file(path = "tracing-log.yml"),
file(path = "tracing-log.yaml"),
file(path = "tracing-log.toml"),
env(name = "TRACING_LOG_FILE"),
environment = false
)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct TracingLog {
pub(crate) min_level: Option<String>,
#[serde(default)]
pub(crate) console: Console,
#[serde(default)]
pub(crate) file: Vec<FileAppender>,
}
#[derive(Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct Console {
pub(crate) level: String,
#[serde(default = "thread_default")]
pub(crate) thread: bool,
#[serde(default = "format_default")]
pub(crate) format: String,
#[serde(default)]
pub(crate) line_number: bool,
}
impl Default for Console {
fn default() -> Self {
Console {
level: "info".to_string(),
thread: true,
format: "%Y-%m-%d %H:%M:%S".to_string(),
line_number: false,
}
}
}
#[derive(Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) struct FileAppender {
pub(crate) level: String,
#[serde(default)]
pub(crate) only_level: bool,
#[serde(default = "thread_default")]
pub(crate) thread: bool,
#[serde(default = "format_default")]
pub(crate) format: String,
#[serde(default)]
pub(crate) line_number: bool,
#[serde(default = "max_files_default")]
pub(crate) max_files: usize,
#[serde(default = "rotation_default")]
pub(crate) rotation: String,
pub(crate) prefix: String,
#[serde(default = "suffix_default")]
pub(crate) suffix: String,
#[serde(default = "directory_default")]
pub(crate) directory: String,
#[serde(default = "target_default")]
pub(crate) target: String,
}
fn thread_default() -> bool {
true
}
fn format_default() -> String {
String::from("%Y-%m-%d %H:%M:%S")
}
fn max_files_default() -> usize {
30
}
fn rotation_default() -> String {
String::from("daily")
}
fn suffix_default() -> String {
String::from("log")
}
fn directory_default() -> String {
String::from("./logs")
}
fn target_default() -> String {
String::from("")
}