Skip to content

Commit 17d1952

Browse files
committed
feat: add separate log files for debug and trace
1 parent 9322a13 commit 17d1952

File tree

2 files changed

+85
-40
lines changed

2 files changed

+85
-40
lines changed

src/files/config.rs

+73-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
use log::LevelFilter;
12
use serde::{Deserialize, Serialize};
23
use std::error::Error;
4+
use std::str::FromStr;
35

46
use crate::files::variables::AppConfig;
57
use crate::serialization::{parse_json, save_json};
@@ -11,21 +13,84 @@ pub struct Root {
1113

1214
#[derive(Serialize, Deserialize, Debug)]
1315
pub struct Logs {
14-
pub level: String,
15-
pub strategy: String,
16+
#[serde(default)]
17+
pub enabled: bool,
18+
pub level: Level,
19+
pub strategy: Strategy,
20+
}
21+
22+
#[derive(Serialize, Deserialize, Debug)]
23+
#[serde(rename_all = "lowercase")]
24+
pub enum Level {
25+
Trace,
26+
Debug,
27+
Info,
28+
Warn,
29+
Error,
30+
}
31+
32+
#[derive(Serialize, Deserialize, Debug, PartialEq)]
33+
#[serde(rename_all = "lowercase")]
34+
pub enum Strategy {
35+
Truncate,
36+
Append,
37+
}
38+
39+
impl Logs {
40+
pub fn new() -> Self {
41+
Self {
42+
enabled: false,
43+
level: Level::Info,
44+
strategy: Strategy::Append,
45+
}
46+
}
47+
}
48+
49+
impl Level {
50+
pub fn to_level_filter(&self) -> LevelFilter {
51+
match self {
52+
Level::Info => LevelFilter::Info,
53+
Level::Warn => LevelFilter::Warn,
54+
Level::Debug => LevelFilter::Debug,
55+
Level::Trace => LevelFilter::Trace,
56+
_ => LevelFilter::Info,
57+
}
58+
}
59+
}
60+
61+
impl FromStr for Level {
62+
type Err = ();
63+
64+
fn from_str(input: &str) -> Result<Level, Self::Err> {
65+
match input {
66+
"trace" => Ok(Level::Trace),
67+
"debug" => Ok(Level::Debug),
68+
"info" => Ok(Level::Info),
69+
"warn" => Ok(Level::Warn),
70+
"error" => Ok(Level::Error),
71+
_ => Err(()),
72+
}
73+
}
74+
}
75+
76+
impl FromStr for Strategy {
77+
type Err = ();
78+
79+
fn from_str(input: &str) -> Result<Strategy, Self::Err> {
80+
match input {
81+
"truncate" => Ok(Strategy::Truncate),
82+
"append" => Ok(Strategy::Append),
83+
_ => Err(()),
84+
}
85+
}
1686
}
1787

1888
pub fn get_config() -> Result<Root, Box<dyn Error>> {
1989
let config = AppConfig::new();
2090
if config.config_path().exists() {
2191
parse_json(&config.config_path())
2292
} else {
23-
let root = Root {
24-
logs: Logs {
25-
level: "info".to_owned(),
26-
strategy: "append".to_owned(),
27-
},
28-
};
93+
let root = Root { logs: Logs::new() };
2994
save_json(&root, &config.config_path())?;
3095
Ok(root)
3196
}

src/logging.rs

+12-32
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use crate::files::config::get_config;
1+
use crate::files::config::Strategy::{Append, Truncate};
2+
use crate::files::config::{get_config, Logs};
23
use crate::files::variables::AppConfig;
34
use chrono::Local;
45
use log::{Level, LevelFilter, Log, Metadata, Record};
@@ -8,20 +9,7 @@ use std::io::Write;
89
use std::sync::{Arc, Mutex};
910

1011
pub fn setup_logger() -> Result<(), Box<dyn Error>> {
11-
let (log_level, log_strategy) = if let Ok(config) = get_config() {
12-
(
13-
match config.logs.level.to_lowercase().as_str() {
14-
"info" => LevelFilter::Info,
15-
"warn" => LevelFilter::Warn,
16-
"debug" => LevelFilter::Debug,
17-
"trace" => LevelFilter::Trace,
18-
_ => LevelFilter::Error,
19-
},
20-
config.logs.strategy,
21-
)
22-
} else {
23-
(LevelFilter::Info, "truncate".to_string())
24-
};
12+
let logs_config = get_config().map_or_else(|_| Logs::new(), |config| config.logs);
2513

2614
let config = AppConfig::new();
2715
let log_file_path = config.logs_path();
@@ -35,25 +23,27 @@ pub fn setup_logger() -> Result<(), Box<dyn Error>> {
3523
let file = OpenOptions::new()
3624
.create(true)
3725
.write(true)
38-
.truncate(log_strategy == "truncate")
39-
.append(log_strategy == "append")
26+
.truncate(logs_config.strategy == Truncate)
27+
.append(logs_config.strategy == Append)
4028
.open(log_file_path)?;
4129

4230
let file = Arc::new(Mutex::new(file));
4331

4432
// Set the logger
4533
log::set_boxed_logger(Box::new(Logger {
4634
file: file.clone(),
47-
level: log_level,
35+
level: logs_config.level.to_level_filter(),
36+
enabled: logs_config.enabled,
4837
}))?;
49-
log::set_max_level(log_level);
38+
log::set_max_level(logs_config.level.to_level_filter());
5039

5140
Ok(())
5241
}
5342

5443
struct Logger {
5544
file: Arc<Mutex<File>>,
5645
level: LevelFilter,
46+
enabled: bool,
5747
}
5848

5949
impl Log for Logger {
@@ -82,29 +72,19 @@ impl Log for Logger {
8272
record.args()
8373
);
8474

85-
if self.level <= LevelFilter::Debug
86-
&& (record.level() == Level::Info
87-
|| record.level() == Level::Warn
88-
|| record.level() == Level::Error)
89-
{
75+
if self.enabled {
9076
let mut file = self.file.lock().unwrap();
9177
writeln!(file, "{}", log_line).unwrap();
9278
}
9379

9480
match record.level() {
95-
Level::Trace | Level::Debug => {
96-
let mut file = self.file.lock().unwrap();
97-
writeln!(file, "{}", log_line).unwrap();
98-
}
99-
Level::Info => {
100-
println!("{}", record.args());
101-
}
102-
Level::Warn => {
81+
Level::Info | Level::Warn => {
10382
println!("{}", record.args());
10483
}
10584
Level::Error => {
10685
eprintln!("{}", record.args());
10786
}
87+
_ => ()
10888
}
10989
}
11090

0 commit comments

Comments
 (0)