ouverture_core/
logger.rs

1use color_eyre::eyre::eyre;
2use color_eyre::{eyre::Report, eyre::WrapErr, Result, Section};
3use fern::colors::{Color, ColoredLevelConfig};
4use log::debug;
5use std::path::{Path, PathBuf};
6#[derive(Debug)]
7pub enum LogDestination {
8    File(PathBuf),
9    StdErr,
10}
11
12pub fn setup_logger(dest: LogDestination, level: log::LevelFilter) -> Result<()> {
13    // hide the 'info' from dependencies (postgresql, sqlx) when in 'info' log level
14    let level_for_dependencies = match level {
15        log::LevelFilter::Info => log::LevelFilter::Warn,
16        _ => level,
17    };
18    let colors = ColoredLevelConfig::default().debug(Color::Magenta);
19    let res = match dest {
20        LogDestination::File(path) => fern::Dispatch::new()
21            .format(move |out, message, record| {
22                out.finish(format_args!(
23                    "{color_line}[{date}][{target}][{level}{color_line}] {message}\x1B[0m",
24                    color_line =
25                        format_args!("\x1B[{}m", colors.get_color(&record.level()).to_fg_str()),
26                    date = chrono::Local::now().format("%Y-%m-%d %H:%M:%S"),
27                    target = record.target(),
28                    level = colors.color(record.level()),
29                    message = message,
30                ))
31            })
32            .level(level)
33            .level_for("pg_embed", level_for_dependencies)
34            .level_for("sqlx", level_for_dependencies)
35            .chain(fern::log_file(path)?)
36            .apply(),
37        LogDestination::StdErr => fern::Dispatch::new()
38            .format(move |out, message, record| {
39                out.finish(format_args!(
40                    "{color_line}[{date}][{target}][{level}{color_line}] {message}\x1B[0m",
41                    color_line =
42                        format_args!("\x1B[{}m", colors.get_color(&record.level()).to_fg_str()),
43                    date = chrono::Local::now().format("%H:%M:%S"),
44                    target = record.target(),
45                    level = colors.color(record.level()),
46                    message = message,
47                ))
48            })
49            .level(level)
50            .level_for("pg_embed", level_for_dependencies)
51            .level_for("sqlx", level_for_dependencies)
52            .level_for("naga", log::LevelFilter::Error)
53            .level_for("gfx_backend_vulkan", log::LevelFilter::Error)
54            .level_for("tracing", log::LevelFilter::Error)
55            .level_for("wgpu_core", log::LevelFilter::Error)
56            .level_for("wgpu", log::LevelFilter::Error)
57            .level_for("winit", log::LevelFilter::Error)
58            .level_for("iced_wgpu", log::LevelFilter::Warn)
59            .chain(std::io::stderr())
60            .apply(),
61    };
62    debug!("setup logging: {:?}", res);
63    match res {
64        Ok(_) => Ok(()),
65        Err(_) => Err(eyre!(
66            "Failed to set up the logger, is the log destination a valid path?"
67        )),
68    }
69}