1*8d72b68dSJomo use core::fmt::{Display, Formatter, Result}; 2*8d72b68dSJomo 3*8d72b68dSJomo use alloc::string::String; 4*8d72b68dSJomo 5*8d72b68dSJomo use crate::time::TimeSpec; 6*8d72b68dSJomo 7*8d72b68dSJomo // /// 日志类型 8*8d72b68dSJomo // #[derive(Default, Clone, Debug)] 9*8d72b68dSJomo // pub enum LogType { 10*8d72b68dSJomo // /// 启动信息 11*8d72b68dSJomo // Startup, 12*8d72b68dSJomo // /// 驱动信息 13*8d72b68dSJomo // Driver, 14*8d72b68dSJomo // /// 系统信息 15*8d72b68dSJomo // System, 16*8d72b68dSJomo // /// 硬件信息 17*8d72b68dSJomo // Hardware, 18*8d72b68dSJomo // /// 内核模块信息 19*8d72b68dSJomo // KernelModule, 20*8d72b68dSJomo // /// 内核调试信息 21*8d72b68dSJomo // KernelDebug, 22*8d72b68dSJomo // #[default] 23*8d72b68dSJomo // Default, 24*8d72b68dSJomo // } 25*8d72b68dSJomo 26*8d72b68dSJomo /// 日志级别 27*8d72b68dSJomo #[derive(Default, Clone, PartialEq, Debug)] 28*8d72b68dSJomo pub enum LogLevel { 29*8d72b68dSJomo EMERG = 0, 30*8d72b68dSJomo ALERT = 1, 31*8d72b68dSJomo CRIT = 2, 32*8d72b68dSJomo ERR = 3, 33*8d72b68dSJomo WARN = 4, 34*8d72b68dSJomo NOTICE = 5, 35*8d72b68dSJomo INFO = 6, 36*8d72b68dSJomo DEBUG = 7, 37*8d72b68dSJomo #[default] 38*8d72b68dSJomo DEFAULT = 8, 39*8d72b68dSJomo } 40*8d72b68dSJomo 41*8d72b68dSJomo impl From<usize> for LogLevel { 42*8d72b68dSJomo fn from(value: usize) -> Self { 43*8d72b68dSJomo match value { 44*8d72b68dSJomo 0 => LogLevel::EMERG, 45*8d72b68dSJomo 1 => LogLevel::ALERT, 46*8d72b68dSJomo 2 => LogLevel::CRIT, 47*8d72b68dSJomo 3 => LogLevel::ERR, 48*8d72b68dSJomo 4 => LogLevel::WARN, 49*8d72b68dSJomo 5 => LogLevel::NOTICE, 50*8d72b68dSJomo 6 => LogLevel::INFO, 51*8d72b68dSJomo 7 => LogLevel::DEBUG, 52*8d72b68dSJomo _ => LogLevel::DEFAULT, 53*8d72b68dSJomo } 54*8d72b68dSJomo } 55*8d72b68dSJomo } 56*8d72b68dSJomo 57*8d72b68dSJomo /// 日志消息 58*8d72b68dSJomo #[derive(Default, Clone, Debug)] 59*8d72b68dSJomo pub struct LogMessage { 60*8d72b68dSJomo /// 时间戳 61*8d72b68dSJomo timestamp: TimeSpec, 62*8d72b68dSJomo /// 日志级别 63*8d72b68dSJomo level: LogLevel, 64*8d72b68dSJomo // /// 日志类型 65*8d72b68dSJomo // log_type: LogType, 66*8d72b68dSJomo /// 日志消息 67*8d72b68dSJomo message: String, 68*8d72b68dSJomo } 69*8d72b68dSJomo 70*8d72b68dSJomo impl LogMessage { 71*8d72b68dSJomo pub fn new(timestamp: TimeSpec, level: LogLevel, message: String) -> Self { 72*8d72b68dSJomo LogMessage { 73*8d72b68dSJomo timestamp, 74*8d72b68dSJomo level, 75*8d72b68dSJomo message, 76*8d72b68dSJomo } 77*8d72b68dSJomo } 78*8d72b68dSJomo 79*8d72b68dSJomo pub fn level(&self) -> LogLevel { 80*8d72b68dSJomo self.level.clone() 81*8d72b68dSJomo } 82*8d72b68dSJomo } 83*8d72b68dSJomo 84*8d72b68dSJomo impl Display for LogMessage { 85*8d72b68dSJomo fn fmt(&self, f: &mut Formatter<'_>) -> Result { 86*8d72b68dSJomo let timestamp = &self.timestamp; 87*8d72b68dSJomo let level = match self.level { 88*8d72b68dSJomo LogLevel::EMERG => "EMERG", 89*8d72b68dSJomo LogLevel::ALERT => "ALERT", 90*8d72b68dSJomo LogLevel::CRIT => "CRIT", 91*8d72b68dSJomo LogLevel::ERR => "ERR", 92*8d72b68dSJomo LogLevel::WARN => "WARNING", 93*8d72b68dSJomo LogLevel::NOTICE => "NOTICE", 94*8d72b68dSJomo LogLevel::INFO => "INFO", 95*8d72b68dSJomo LogLevel::DEBUG => "DEBUG", 96*8d72b68dSJomo LogLevel::DEFAULT => "Default", 97*8d72b68dSJomo }; 98*8d72b68dSJomo 99*8d72b68dSJomo let message = &self.message; 100*8d72b68dSJomo 101*8d72b68dSJomo let res = format!( 102*8d72b68dSJomo "<{}>[{}.{}] : {}\n", 103*8d72b68dSJomo level, timestamp.tv_sec, timestamp.tv_nsec, message 104*8d72b68dSJomo ); 105*8d72b68dSJomo return write!(f, "{}", res); 106*8d72b68dSJomo } 107*8d72b68dSJomo } 108