1#![warn(missing_docs)]
34#![warn(rustdoc::missing_crate_level_docs)]
35#![allow(unused_imports)]
36#[macro_use]
37extern crate log;
38extern crate chrono;
39use log::{Metadata, Record, SetLoggerError};
40
41pub use log::LevelFilter;
43
44use std::env;
45use std::str::FromStr;
46
47pub mod prelude {
52 pub use super::GalactaLogger;
54 pub use log::debug;
56 pub use log::error;
58 pub use log::info;
60 pub use log::trace;
62 pub use log::warn;
64 pub use log::LevelFilter;
66 pub use super::gdebug;
68 pub use super::gerror;
70 pub use super::ginfo;
72 pub use super::gtrace;
74 pub use super::gwarn;
76}
77
78#[macro_export]
80macro_rules! gdebug {
81 ( $($x:expr),* ) => {{
82 let _result = GalactaLogger::init(LevelFilter::Trace);
83 struct Dummy {}
84 let tmp = std::any::type_name::<Dummy>();
85 let target: &str = &tmp[..tmp.len()-7];
86 debug!(target: target,$($x),*)
87 }}
88}
89
90#[macro_export]
92macro_rules! gerror {
93 ( $($x:expr),* ) => {{
94 let _result = GalactaLogger::init(LevelFilter::Trace);
95 struct Dummy {}
96 let tmp = std::any::type_name::<Dummy>();
97 let target: &str = &tmp[..tmp.len()-7];
98 error!(target: target,$($x),*)
99 }}
100}
101
102#[macro_export]
104macro_rules! ginfo {
105 ( $($x:expr),* ) => {{
106 let _result = GalactaLogger::init(LevelFilter::Trace);
107 struct Dummy {}
108 let tmp = std::any::type_name::<Dummy>();
109 let target: &str = &tmp[..tmp.len()-7];
110 info!(target: target,$($x),*)
111 }}
112}
113
114#[macro_export]
116macro_rules! gtrace {
117 ( $($x:expr),* ) => {{
118 let _result = GalactaLogger::init(LevelFilter::Trace);
119 struct Dummy {}
120 let tmp = std::any::type_name::<Dummy>();
121 let target: &str = &tmp[..tmp.len()-7];
122 trace!(target: target,$($x),*)
123 }}
124}
125
126#[macro_export]
128macro_rules! gwarn {
129 ( $($x:expr),* ) => {{
130 let _result = GalactaLogger::init(LevelFilter::Trace);
131 struct Dummy {}
132 let tmp = std::any::type_name::<Dummy>();
133 let target: &str = &tmp[..tmp.len()-7];
134 warn!(target: target,$($x),*)
135 }}
136}
137
138pub struct GalactaLogger;
140
141impl GalactaLogger {
142 pub fn init(default_max_level: LevelFilter) -> Result<(), SetLoggerError> {
150 match env::var("G_LOG_LEVEL") {
151 Ok(val) => {
152 let env_max_level =
153 LevelFilter::from_str(val.as_str()).unwrap_or_else(|_| LevelFilter::max());
154 log::set_max_level(env_max_level);
155 log::set_boxed_logger(Box::new(GalactaLogger))
156 }
157 Err(_) => {
158 log::set_max_level(default_max_level);
159 log::set_boxed_logger(Box::new(GalactaLogger))
160 }
161 }
162 }
163}
164
165impl log::Log for GalactaLogger {
167 fn enabled(&self, metadata: &Metadata) -> bool {
168 metadata.level() <= log::STATIC_MAX_LEVEL
169 }
170
171 fn log(&self, record: &Record) {
172 if self.enabled(record.metadata()) {
173 let timedate: String = chrono::Local::now().format("%F %T").to_string();
174 let module_path: String = record.module_path().unwrap_or("Unknown module").to_string();
175 let level: String = record.level().to_string();
176 let message = record.args();
177 let file_path: String = record.file().unwrap_or("Unknown file").to_string();
178 let line: String = record.line().unwrap_or(0).to_string();
179 let target:String = record.target().to_string();
180 let log_massage: String = format!(
182 "\n[{}] [{}] {}\n{}\n{} ({}:{})\n",
183 timedate, level,target, message, module_path, file_path, line,
184 );
185 eprintln!("{}", log_massage);
186 }
187 }
188
189 fn flush(&self) {}
190}
191
192#[cfg(test)]
193mod tests {
194 use super::*;
195
196 mod another_module {
197 pub fn another_function() {
198 info!("This is from another function");
199 }
200 }
201 #[test]
202 fn test_log_first_use() {
203 let _result = GalactaLogger::init(LevelFilter::Trace);
204 info!("This is first log test");
205 another_module::another_function();
206 info!("This is info");
207 warn!("This is warn");
208 }
209
210 #[test]
211 fn test_log_env_level_max() {
212 let _result = GalactaLogger::init(LevelFilter::Trace);
213 error!(target: "test_log_env_level_max()","This is error");
214 warn!(target: "test_log_env_level_max()","This is warning");
215 info!(target: "test_log_env_level_max()","This is information");
216 debug!(target: "test_log_env_level_max()","This is debug information");
217 trace!(target: "test_log_env_level_max()","This is trace information");
218 }
219
220 #[test]
221 fn test_gdebug() {
222 fn errfunc() {
223 gerror!("This is gerror");
224 }
225 errfunc();
226 gdebug!("This is gdebug");
227 gwarn!("This is gwarn");
228 ginfo!("This is ginfo");
229 gtrace!("This is gtrace");
230
231 }
232}