1use std::{env, sync::Arc, time::Duration};
2
3use spdlog::{
4 prelude::*,
5 sink::{FileSink, Sink},
6};
7
8fn main() -> Result<(), Box<dyn std::error::Error>> {
9 let default_logger = spdlog::default_logger();
12 default_logger.set_level_filter(LevelFilter::All);
13
14 let path = env::current_exe()?.with_file_name("all.log");
16 let file_sink = FileSink::builder().path(path).build_arc()?;
17
18 let new_logger = Logger::builder()
19 .level_filter(LevelFilter::All)
20 .flush_level_filter(LevelFilter::MoreSevereEqual(Level::Warn))
21 .sink(file_sink.clone())
22 .build_arc()?;
23 new_logger.set_flush_period(Some(Duration::from_secs(3)));
24 spdlog::set_default_logger(new_logger);
25
26 info!("this log will be written to the file `all.log`");
27
28 let db = AppDatabase::new(file_sink)?;
31 db.write_i32(114514);
32
33 Ok(())
34}
35
36struct AppDatabase {
37 logger: Logger,
38}
39
40impl AppDatabase {
41 fn new(all_log_sink: Arc<dyn Sink>) -> Result<Self, Box<dyn std::error::Error>> {
42 let path = env::current_exe()?.with_file_name("db.log");
43 let db_file_sink = FileSink::builder().path(path).build_arc()?;
44
45 let logger = Logger::builder()
46 .name("database")
47 .level_filter(LevelFilter::All)
48 .flush_level_filter(LevelFilter::MoreSevereEqual(Level::Warn))
49 .sinks([all_log_sink, db_file_sink])
50 .build()?;
51 Ok(Self { logger })
52 }
53
54 fn write_i32(&self, value: i32) {
55 trace!(logger: self.logger, "writing value {} to the database", value);
57 }
58}