xref: /DragonOS/kernel/src/filesystem/procfs/log.rs (revision 8d72b68da9339ec97e1b8929bcf2946f0fd83cd5)
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