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 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}