18d72b68dSJomo use core::fmt::{Display, Formatter, Result}; 28d72b68dSJomo 38d72b68dSJomo use alloc::string::String; 48d72b68dSJomo 5*6fc066acSJomo use crate::time::PosixTimeSpec; 68d72b68dSJomo 78d72b68dSJomo // /// 日志类型 88d72b68dSJomo // #[derive(Default, Clone, Debug)] 98d72b68dSJomo // pub enum LogType { 108d72b68dSJomo // /// 启动信息 118d72b68dSJomo // Startup, 128d72b68dSJomo // /// 驱动信息 138d72b68dSJomo // Driver, 148d72b68dSJomo // /// 系统信息 158d72b68dSJomo // System, 168d72b68dSJomo // /// 硬件信息 178d72b68dSJomo // Hardware, 188d72b68dSJomo // /// 内核模块信息 198d72b68dSJomo // KernelModule, 208d72b68dSJomo // /// 内核调试信息 218d72b68dSJomo // KernelDebug, 228d72b68dSJomo // #[default] 238d72b68dSJomo // Default, 248d72b68dSJomo // } 258d72b68dSJomo 268d72b68dSJomo /// 日志级别 278d72b68dSJomo #[derive(Default, Clone, PartialEq, Debug)] 288d72b68dSJomo pub enum LogLevel { 298d72b68dSJomo EMERG = 0, 308d72b68dSJomo ALERT = 1, 318d72b68dSJomo CRIT = 2, 328d72b68dSJomo ERR = 3, 338d72b68dSJomo WARN = 4, 348d72b68dSJomo NOTICE = 5, 358d72b68dSJomo INFO = 6, 368d72b68dSJomo DEBUG = 7, 378d72b68dSJomo #[default] 388d72b68dSJomo DEFAULT = 8, 398d72b68dSJomo } 408d72b68dSJomo 418d72b68dSJomo impl From<usize> for LogLevel { from(value: usize) -> Self428d72b68dSJomo fn from(value: usize) -> Self { 438d72b68dSJomo match value { 448d72b68dSJomo 0 => LogLevel::EMERG, 458d72b68dSJomo 1 => LogLevel::ALERT, 468d72b68dSJomo 2 => LogLevel::CRIT, 478d72b68dSJomo 3 => LogLevel::ERR, 488d72b68dSJomo 4 => LogLevel::WARN, 498d72b68dSJomo 5 => LogLevel::NOTICE, 508d72b68dSJomo 6 => LogLevel::INFO, 518d72b68dSJomo 7 => LogLevel::DEBUG, 528d72b68dSJomo _ => LogLevel::DEFAULT, 538d72b68dSJomo } 548d72b68dSJomo } 558d72b68dSJomo } 568d72b68dSJomo 578d72b68dSJomo /// 日志消息 588d72b68dSJomo #[derive(Default, Clone, Debug)] 598d72b68dSJomo pub struct LogMessage { 608d72b68dSJomo /// 时间戳 61*6fc066acSJomo timestamp: PosixTimeSpec, 628d72b68dSJomo /// 日志级别 638d72b68dSJomo level: LogLevel, 648d72b68dSJomo // /// 日志类型 658d72b68dSJomo // log_type: LogType, 668d72b68dSJomo /// 日志消息 678d72b68dSJomo message: String, 688d72b68dSJomo } 698d72b68dSJomo 708d72b68dSJomo impl LogMessage { new(timestamp: PosixTimeSpec, level: LogLevel, message: String) -> Self71*6fc066acSJomo pub fn new(timestamp: PosixTimeSpec, level: LogLevel, message: String) -> Self { 728d72b68dSJomo LogMessage { 738d72b68dSJomo timestamp, 748d72b68dSJomo level, 758d72b68dSJomo message, 768d72b68dSJomo } 778d72b68dSJomo } 788d72b68dSJomo level(&self) -> LogLevel798d72b68dSJomo pub fn level(&self) -> LogLevel { 808d72b68dSJomo self.level.clone() 818d72b68dSJomo } 828d72b68dSJomo } 838d72b68dSJomo 848d72b68dSJomo impl Display for LogMessage { fmt(&self, f: &mut Formatter<'_>) -> Result858d72b68dSJomo fn fmt(&self, f: &mut Formatter<'_>) -> Result { 868d72b68dSJomo let timestamp = &self.timestamp; 878d72b68dSJomo let level = match self.level { 888d72b68dSJomo LogLevel::EMERG => "EMERG", 898d72b68dSJomo LogLevel::ALERT => "ALERT", 908d72b68dSJomo LogLevel::CRIT => "CRIT", 918d72b68dSJomo LogLevel::ERR => "ERR", 928d72b68dSJomo LogLevel::WARN => "WARNING", 938d72b68dSJomo LogLevel::NOTICE => "NOTICE", 948d72b68dSJomo LogLevel::INFO => "INFO", 958d72b68dSJomo LogLevel::DEBUG => "DEBUG", 968d72b68dSJomo LogLevel::DEFAULT => "Default", 978d72b68dSJomo }; 988d72b68dSJomo 998d72b68dSJomo let message = &self.message; 1008d72b68dSJomo 1018d72b68dSJomo let res = format!( 1028d72b68dSJomo "<{}>[{}.{}] : {}\n", 1038d72b68dSJomo level, timestamp.tv_sec, timestamp.tv_nsec, message 1048d72b68dSJomo ); 1058d72b68dSJomo return write!(f, "{}", res); 1068d72b68dSJomo } 1078d72b68dSJomo } 108