03_logger/
03-logger.rs

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    // `spdlog-rs` has a global default logger and logs will be processed by it
10    // by default, You can configure it.
11    let default_logger = spdlog::default_logger();
12    default_logger.set_level_filter(LevelFilter::All);
13
14    // Or completely replace it with a new one.
15    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    // In addition to having the global default logger, more loggers are allowed to
29    // be configured, stored and used independently.
30    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        // This log will be written to both files `all.log` and `db.log`.
56        trace!(logger: self.logger, "writing value {} to the database", value);
57    }
58}