1#[macro_use]
25extern crate colored;
26use chrono::Utc;
27use colored::*;
28
29#[derive(Copy, Clone,PartialEq)]
30pub enum LogLevel {
31 Debug,
32 Info,
33 Error,
34 Warn,
35 Fatal,
36 Critical,
37}
38
39#[derive(Copy, Clone,PartialEq)]
40pub struct Logger {
41 level: LogLevel,
42}
43
44impl Logger {
45 pub fn new(level: LogLevel) -> Self {
46 Logger { level }
47 }
48
49 fn log(&self, level: LogLevel, message: &str) {
50 if level as u8 >= self.level as u8 && level != LogLevel::Error {
51 let now = Utc::now();
52 println!("[{}] {} - {}", level_to_string(level.clone()), now, message);
53 }else {
54 let now = Utc::now();
55 eprintln!("[{}] {} - {}", level_to_string(level.clone()), now, message);
56 }
57 }
58
59 pub fn debug(&self, message: &str) {
60 self.log(LogLevel::Debug, message);
61 }
62
63 pub fn info(&self, message: &str) {
64 self.log(LogLevel::Info, message);
65 }
66
67 pub fn error(&self, message: &str) {
68 self.log(LogLevel::Error, message);
69 }
70
71 pub fn warn(&self, message: &str) {
72 self.log(LogLevel::Warn, message);
73 }
74
75 pub fn fatal(&self, message: &str) {
76 self.log(LogLevel::Fatal, message);
77 }
78 pub fn critical(&self, message: &str) {
79 self.log(LogLevel::Critical, message);
80 }
81}
82#[macro_export]
83macro_rules! debug {
84 ($logger:expr, $message:expr) => {
85 $logger.debug($message);
86 };
87}
88#[macro_export]
89macro_rules! warn {
90 ($logger:expr, $message:expr) => {
91 $logger.warn($message);
92 };
93}
94#[macro_export]
95macro_rules! error {
96 ($logger:expr, $message:expr) => {
97 $logger.error($message);
98 };
99}
100#[macro_export]
101macro_rules! info {
102 ($logger:expr, $message:expr) => {
103 $logger.info($message);
104 };
105}
106#[macro_export]
107macro_rules! fatal {
108 ($logger:expr, $message:expr) => {
109 $logger.fatal($message);
110 };
111}
112#[macro_export]
113macro_rules! critical {
114 ($logger:expr, $message:expr) => {
115 $logger.critical($message);
116 };
117}
118
119fn level_to_string(level: LogLevel) -> String {
120 match level {
121 LogLevel::Debug => format!("{}", "DEBUG".cyan().italic().underline()),
122 LogLevel::Info => format!("{}", "INFO".green().bold()),
123 LogLevel::Error => format!("{}", "ERROR".red().italic().bold()),
124 LogLevel::Warn => format!("{}", "WARN".yellow().on_yellow().bold().dimmed()),
125 LogLevel::Fatal => format!("{}", "FATAL".on_bright_red().white().bold().underline()),
126 LogLevel::Critical => format!("{}", "CRITICAL".bright_red().bold().italic().underline()),
127 }
128}