1use std::fs;
2use std::sync::Once;
3use log4rs::append::console::ConsoleAppender;
4use log4rs::Config;
5use log4rs::config::{Appender, Root};
6use log4rs::encode::pattern::PatternEncoder;
7use log::{error, info, LevelFilter};
8
9static INIT: Once = Once::new();
10
11pub struct HappyLog {
12}
13
14impl HappyLog {
15 pub fn init_default_log(level: LevelFilter) {
16 INIT.call_once(|| {
17 HappyLog::_init_default_log(level);
18 });
19 }
20
21 pub fn init(path: &str) {
22 INIT.call_once(|| {
23 HappyLog::_init(path);
24 });
25 }
26
27 fn _init_default_log(level: LevelFilter) {
28 let stdout = ConsoleAppender::builder()
29 .encoder(Box::new(
30 PatternEncoder::new("{d(%Y-%m-%d %H:%M:%S)} {P} [{l}] {m}{n}")
31 )).build();
32
33 let default_log_config = Config::builder()
34 .appender(
35 Appender::builder().build("stdout", Box::new(stdout)))
36 .build(
37 Root::builder().appender("stdout").build(level),
38 ).unwrap();
39
40 match log4rs::init_config(default_log_config) {
41 Ok(_) => {
42 info!("HappyLog->未启用日志配置文件,加载默认设置。当前运行在【控制台输出】模式下......");
43 }
44 Err(e) => {
45 error!("HappyLog->未启用日志配置文件,加载默认设置出现错误:{}", e);
46 }
47 }
48 }
49
50 fn _init(path: &str) {
51 if fs::metadata(path).is_ok() {
52 match log4rs::init_file(path, Default::default()) {
53 Ok(_) => {
54 info!("HappyLog->加载日志配置文件成功:{}", path);
55 }
56 Err(e) => {
57 error!("HappyLog->加载日志配置文件出现错误:{}", e);
58 }
59 }
60 } else {
61 Self::_init_default_log(LevelFilter::Info);
62 }
63 }
64}
65
66#[macro_export]
67macro_rules! hlenter_fn {
68 ($fn_name:tt) => {
69 log::trace!("Enter function: {}", $fn_name);
70 };
71}
72
73#[macro_export]
74macro_rules! hlinput {
75 ($name:tt, $value:tt) => {
76 log::trace!("input->{}={}", $name, $value);
77 };
78
79 ($name:tt, $($arg:tt)+) => {
80 log::trace!("input->{}={}", $name, format!("{}", format_args!($($arg)+)).as_str());
81 };
82}
83
84#[macro_export]
85macro_rules! hlvar {
86 ($name:tt, $value:tt) => {
87 log::trace!("var->{}={}", $name, $value);
88 };
89
90 ($name:tt, $($arg:tt)+) => {
91 log::trace!("var->{}={}", $name, format!("{}", format_args!($($arg)+)).as_str());
92 };
93}
94
95#[macro_export]
96macro_rules! hlerror {
97 ($($arg:tt)+) => {
98 log::trace!("{}", format_args!($($arg)+));
99 };
100}
101
102#[macro_export]
103macro_rules! hlwarn {
104 ($($arg:tt)+) => {
105 log::warn!("{}", format_args!($($arg)+));
106 };
107}
108
109#[macro_export]
110macro_rules! hlinfo {
111 ($($arg:tt)+) => {
112 log::info!("{}", format_args!($($arg)+));
113 };
114}
115
116#[macro_export]
117macro_rules! hldebug {
118 ($($arg:tt)+) => {
119 log::debug!("{}", format_args!($($arg)+));
120 };
121}
122
123#[macro_export]
124macro_rules! hltrace {
125 ($($arg:tt)+) => {
126 log::trace!("{}", format_args!($($arg)+));
127 };
128}
129
130#[macro_export]
131macro_rules! hloutput {
132 ($name:tt, $value:tt) => {
133 log::trace!("output->{}={}", $name, $value);
134 };
135
136 ($name:tt, $($arg:tt)+) => {
137 log::trace!("output->{}={}", $name, format!("{}", format_args!($($arg)+)).as_str());
138 };
139}
140
141#[macro_export]
142macro_rules! hlexit_fn {
143 ($fn_name:tt) => {
144 log::trace!("Exit function: {}", $fn_name);
145 };
146}