custom_utils/util_logger/
mod.rs

1use crate::util_logger::builder::{DebugLevel, LoggerBuilder, LoggerFeatureBuilder};
2use builder::{simple_colored_with_thread_target, LoggerBuilder2};
3use flexi_logger::{LogSpecBuilder, LogSpecification, Logger, LoggerHandle, WriteMode};
4use log::LevelFilter;
5use std::fs;
6use std::path::PathBuf;
7
8mod builder;
9
10/// 简单,纯粹想输出日志而已。适用于临时
11/// 控制台输出日志
12/// logger_stdout("info,custom_utils=warn")
13pub fn logger_stdout(level: impl Into<DebugLevel>) {
14    let specification = match level.into() {
15        DebugLevel::Filter(debug_level) => {
16            let mut log_spec_builder = LogSpecBuilder::new();
17            log_spec_builder.default(debug_level);
18            log_spec_builder.build()
19        }
20        DebugLevel::Env(default) => LogSpecification::env_or_parse(default).unwrap(),
21    };
22    Box::leak(Box::new(
23        Logger::with(specification)
24            .format(simple_colored_with_thread_target)
25            .write_mode(WriteMode::Direct)
26            .log_to_stdout()
27            .start()
28            .unwrap(),
29    ));
30}
31
32pub fn logger_stdout_debug() {
33    let _res = LoggerBuilder::default(LevelFilter::Debug)
34        .build_default()
35        .log_to_stdout()
36        ._start();
37}
38pub fn logger_stdout_info() {
39    let _res = LoggerBuilder::default(LevelFilter::Info)
40        .build_default()
41        .log_to_stdout()
42        ._start();
43}
44
45///
46/// let _ = custom_utils::logger::logger_feature("lapce", "warn,wgpu_core=error,lapce_app::keypress::loader=info", log::LevelFilter::Info, true)
47///         .build();
48/// let _ = custom_utils::logger::logger_feature("lapce", log::LevelFilter::Debug, log::LevelFilter::Info, true)
49///         .build();
50///
51/// 根据feature来确定日志输出
52///     log_etc_reset 配置文件每次重启都重置
53///     dev:控制台输出
54///     prod:在目录{user_home}/log/{app}输出日志;
55///         每天或大小达到10m更换日志文件;
56///         维持10个日志文件;
57///         生成{user_home}/etc/{app}/logspecification.toml的动态配置文件
58pub fn logger_feature(
59    app: &str,
60    debug_level: impl Into<DebugLevel>,
61    prod_level: LevelFilter,
62    log_etc_reset: bool,
63) -> LoggerFeatureBuilder {
64    let home = home::home_dir().unwrap();
65    let log_etc_path: PathBuf = home.join("etc");
66    if !log_etc_path.exists() {
67        std::fs::create_dir_all(&log_etc_path);
68    }
69    let log_path: PathBuf = home.join("log");
70    if !log_path.exists() {
71        std::fs::create_dir_all(&log_path);
72    }
73    logger_feature_with_path(
74        app,
75        debug_level,
76        prod_level,
77        log_etc_path,
78        log_etc_reset,
79        log_path,
80    )
81}
82
83/// log_etc_reset 配置文件每次重启都重置
84pub fn logger_feature_with_path(
85    app: &str,
86    debug_level: impl Into<DebugLevel>,
87    prod_level: LevelFilter,
88    log_etc_path: PathBuf,
89    log_etc_reset: bool,
90    log_path: PathBuf,
91) -> LoggerFeatureBuilder {
92    if log_etc_reset && log_etc_path.exists() && log_etc_path.is_file() {
93        fs::remove_file(log_etc_path.clone()).unwrap();
94    }
95    LoggerFeatureBuilder::default(app, debug_level.into(), prod_level, log_etc_path, log_path)
96}