实现内核日志系统 (#489)

* 实现写日志和读取日志,并且能够在用户态下执行dmesg命令查看日志

* 通过klogctl实现dmesg

* 改用ConstGenericRingBuffer作内核缓冲区

* 更改缓冲区容量

* 将能够输出到控制台的日志级别改为日志级别枚举类,使用SpinLock控制KMSG,使用枚举类定义SYSLOG_ACTION,将do_syslog系统调用接口放在syscall.rs

* fix warning

* 完善do_syslog注释

* 将KMSG接入kinfo、kdebug等

* fix warning

* 修复显示的秒数不正确,·以及无法通过CI的问题
This commit is contained in:
Jomo
2024-01-24 16:13:15 +08:00
committed by GitHub
parent d46c6d2794
commit 8d72b68da9
27 changed files with 763 additions and 26 deletions

View File

@ -1,7 +1,17 @@
use core::fmt::{self, Write};
use alloc::string::ToString;
use super::lib_ui::textui::{textui_putstr, FontColor};
use crate::{
filesystem::procfs::{
kmsg::KMSG,
log::{LogLevel, LogMessage},
},
time::TimeSpec,
};
#[macro_export]
macro_rules! print {
($($arg:tt)*) => ($crate::libs::printk::__printk(format_args!($($arg)*)));
@ -30,14 +40,15 @@ macro_rules! printk_color {
#[macro_export]
macro_rules! kdebug {
($($arg:tt)*) => {
$crate::libs::printk::Logger.log(7,format_args!("({}:{})\t {}\n", file!(), line!(),format_args!($($arg)*)));
$crate::libs::printk::PrintkWriter.__write_fmt(format_args!("[ DEBUG ] ({}:{})\t {}\n", file!(), line!(),format_args!($($arg)*)))
}
}
#[macro_export]
macro_rules! kinfo {
($($arg:tt)*) => {
$crate::libs::printk::Logger.log(6,format_args!("({}:{})\t {}\n", file!(), line!(),format_args!($($arg)*)));
$crate::libs::printk::PrintkWriter.__write_fmt(format_args!("[ INFO ] ({}:{})\t {}\n", file!(), line!(),format_args!($($arg)*)))
}
}
@ -45,6 +56,7 @@ macro_rules! kinfo {
#[macro_export]
macro_rules! kwarn {
($($arg:tt)*) => {
$crate::libs::printk::Logger.log(4,format_args!("({}:{})\t {}\n", file!(), line!(),format_args!($($arg)*)));
$crate::libs::printk::PrintkWriter.__write_string_color($crate::libs::lib_ui::textui::FontColor::YELLOW, $crate::libs::lib_ui::textui::FontColor::BLACK, "[ WARN ] ");
$crate::libs::printk::PrintkWriter.__write_fmt(format_args!("({}:{})\t {}\n", file!(), line!(),format_args!($($arg)*)));
}
@ -53,6 +65,7 @@ macro_rules! kwarn {
#[macro_export]
macro_rules! kerror {
($($arg:tt)*) => {
$crate::libs::printk::Logger.log(3,format_args!("({}:{})\t {}\n", file!(), line!(),format_args!($($arg)*)));
$crate::libs::printk::PrintkWriter.__write_string_color($crate::libs::lib_ui::textui::FontColor::RED, $crate::libs::lib_ui::textui::FontColor::BLACK, "[ ERROR ] ");
$crate::libs::printk::PrintkWriter.__write_fmt(format_args!("({}:{})\t {}\n", file!(), line!(),format_args!($($arg)*)));
}
@ -61,6 +74,7 @@ macro_rules! kerror {
#[macro_export]
macro_rules! kBUG {
($($arg:tt)*) => {
$crate::libs::printk::Logger.log(1,format_args!("({}:{})\t {}\n", file!(), line!(),format_args!($($arg)*)));
$crate::libs::printk::PrintkWriter.__write_string_color($crate::libs::lib_ui::textui::FontColor::RED, $crate::libs::lib_ui::textui::FontColor::BLACK, "[ BUG ] ");
$crate::libs::printk::PrintkWriter.__write_fmt(format_args!("({}:{})\t {}\n", file!(), line!(),format_args!($($arg)*)));
}
@ -97,3 +111,17 @@ impl fmt::Write for PrintkWriter {
pub fn __printk(args: fmt::Arguments) {
PrintkWriter.write_fmt(args).unwrap();
}
pub struct Logger;
impl Logger {
pub fn log(&self, log_level: usize, message: fmt::Arguments) {
if unsafe { !KMSG.is_none() } {
let timestamp: TimeSpec = TimeSpec::now();
let log_level = LogLevel::from(log_level.clone());
let log_message = LogMessage::new(timestamp, log_level, message.to_string());
unsafe { KMSG.as_ref().unwrap().lock_irqsave().push(log_message) };
}
}
}