use std::{
fs::{read_dir, remove_file},
time::Instant,
};
use ftlog::appender::{Duration, FileAppender, Period};
pub fn setup() -> () {
let logger = ftlog::Builder::new()
.bounded(10000, true)
.root(FileAppender::new("./root.log"))
.filter("rotate", "rotate", None)
.appender("rotate", FileAppender::rotate("rotate.log", Period::Minute))
.filter("expire", "expire", None)
.appender(
"expire",
FileAppender::rotate_with_expire("expire.log", Period::Day, Duration::days(7)),
)
.build()
.expect("logger build failed");
logger.init().expect("set logger failed");
}
fn clean(dir: &str) {
for file in read_dir(dir)
.unwrap()
.into_iter()
.filter_map(|x| x.ok())
.filter(|f| f.file_type().unwrap().is_file())
{
if file
.path()
.extension()
.map(|x| x.to_string_lossy())
.unwrap_or_default()
== "log"
{
remove_file(file.path()).unwrap();
}
}
}
#[test]
fn test_speed() {
setup();
let elapsed1 = {
let now = Instant::now();
for i in 1..=1_000_000 {
ftlog::info!("file log {}", i);
}
ftlog::logger().flush();
let elapsed = now.elapsed();
println!("File elapsed: {}s", elapsed.as_secs_f64());
elapsed
};
let elapsed2 = {
let now = Instant::now();
for i in 1..=1_000_000 {
ftlog::info!(target:"rotate", "file log {}", i);
}
ftlog::logger().flush();
let elapsed = now.elapsed();
println!("Rotate file elapsed: {}s", elapsed.as_secs_f64());
elapsed
};
let elapsed3 = {
let now = Instant::now();
for i in 1..=1_000_000 {
ftlog::info!(target:"expire", "file log {}", i);
}
ftlog::logger().flush();
let elapsed = now.elapsed();
println!(
"Rotate file with expire elapsed: {}s",
elapsed.as_secs_f64()
);
elapsed
};
clean("./");
assert!(elapsed1.as_secs() < 8);
assert!(elapsed2.as_secs() < 8);
assert!(elapsed3.as_secs() < 8);
}