diff --git a/Cargo.lock b/Cargo.lock index 05d45c08e..af46ad330 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,6 +81,7 @@ name = "aster-block" version = "0.1.0" dependencies = [ "align_ext", + "aster-logger", "aster-util", "bitflags 1.3.2", "bitvec", @@ -108,6 +109,7 @@ dependencies = [ name = "aster-framebuffer" version = "0.1.0" dependencies = [ + "aster-logger", "component", "font8x8", "log", @@ -120,6 +122,7 @@ name = "aster-input" version = "0.1.0" dependencies = [ "ascii", + "aster-logger", "aster-rights", "aster-util", "bitflags 1.3.2", @@ -130,12 +133,26 @@ dependencies = [ "spin 0.9.8", ] +[[package]] +name = "aster-logger" +version = "0.1.0" +dependencies = [ + "aster-console", + "cfg-if", + "component", + "log", + "ostd", + "owo-colors 3.5.0", + "spin 0.9.8", +] + [[package]] name = "aster-network" version = "0.1.0" dependencies = [ "align_ext", "aster-bigtcp", + "aster-logger", "aster-rights", "aster-util", "bitflags 1.3.2", @@ -158,6 +175,7 @@ dependencies = [ "aster-console", "aster-framebuffer", "aster-input", + "aster-logger", "aster-network", "aster-rights", "aster-rights-proc", @@ -223,6 +241,7 @@ dependencies = [ name = "aster-softirq" version = "0.1.0" dependencies = [ + "aster-logger", "component", "intrusive-collections", "ostd", @@ -233,6 +252,7 @@ dependencies = [ name = "aster-time" version = "0.1.0" dependencies = [ + "aster-logger", "aster-util", "chrono", "component", @@ -261,6 +281,7 @@ dependencies = [ "aster-block", "aster-console", "aster-input", + "aster-logger", "aster-network", "aster-rights", "aster-util", @@ -1153,7 +1174,6 @@ dependencies = [ "ostd-macros", "ostd-pod", "ostd-test", - "owo-colors 3.5.0", "riscv", "sbi-rt", "smallvec", diff --git a/Cargo.toml b/Cargo.toml index 34420f2fe..b0c65eead 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ members = [ "kernel/comps/input", "kernel/comps/network", "kernel/comps/softirq", + "kernel/comps/logger", "kernel/comps/time", "kernel/comps/virtio", "kernel/libs/cpio-decoder", diff --git a/Components.toml b/Components.toml index 69ef6519a..866bd652b 100644 --- a/Components.toml +++ b/Components.toml @@ -6,6 +6,7 @@ input = { name = "aster-input" } block = { name = "aster-block" } console = { name = "aster-console" } softirq = { name = "aster-softirq" } +logger = { name = "aster-logger" } time = { name = "aster-time" } framebuffer = { name = "aster-framebuffer" } network = { name = "aster-network" } diff --git a/Makefile b/Makefile index c15aa79f1..309eb9ace 100644 --- a/Makefile +++ b/Makefile @@ -145,6 +145,7 @@ OSDK_CRATES := \ kernel/comps/input \ kernel/comps/network \ kernel/comps/softirq \ + kernel/comps/logger \ kernel/comps/time \ kernel/comps/virtio \ kernel/libs/aster-util \ diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index 1443b9436..1f46db4b9 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -13,6 +13,7 @@ aster-network = { path = "comps/network" } aster-console = { path = "comps/console" } aster-framebuffer = { path = "comps/framebuffer" } aster-softirq = { path = "comps/softirq" } +aster-logger = { path = "comps/logger" } aster-time = { path = "comps/time" } aster-virtio = { path = "comps/virtio" } aster-rights = { path = "libs/aster-rights" } diff --git a/kernel/comps/block/Cargo.toml b/kernel/comps/block/Cargo.toml index 6dc5351eb..9360b4893 100644 --- a/kernel/comps/block/Cargo.toml +++ b/kernel/comps/block/Cargo.toml @@ -11,6 +11,7 @@ spin = "0.9.4" ostd = { path = "../../../ostd" } align_ext = { path = "../../../ostd/libs/align_ext" } aster-util = { path = "../../libs/aster-util" } +aster-logger = { path = "../logger" } int-to-c-enum = { path = "../../libs/int-to-c-enum" } component = { path = "../../libs/comp-sys/component" } log = "0.4" diff --git a/kernel/comps/framebuffer/Cargo.toml b/kernel/comps/framebuffer/Cargo.toml index f7feb99af..b1382d837 100644 --- a/kernel/comps/framebuffer/Cargo.toml +++ b/kernel/comps/framebuffer/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" [dependencies] ostd = { path = "../../../ostd" } component = { path = "../../libs/comp-sys/component" } +aster-logger = { path = "../logger" } log = "0.4" spin = "0.9.4" font8x8 = { version = "0.2.5", default-features = false, features = [ diff --git a/kernel/comps/input/Cargo.toml b/kernel/comps/input/Cargo.toml index ea4d55c61..2a653c495 100644 --- a/kernel/comps/input/Cargo.toml +++ b/kernel/comps/input/Cargo.toml @@ -11,6 +11,7 @@ spin = "0.9.4" ostd = { path = "../../../ostd" } aster-util = { path = "../../libs/aster-util" } aster-rights = { path = "../../libs/aster-rights" } +aster-logger = { path = "../logger" } component = { path = "../../libs/comp-sys/component" } int-to-c-enum = { path = "../../libs/int-to-c-enum" } log = "0.4" diff --git a/kernel/comps/logger/Cargo.toml b/kernel/comps/logger/Cargo.toml new file mode 100644 index 000000000..b8e432961 --- /dev/null +++ b/kernel/comps/logger/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "aster-logger" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +component = { path = "../../libs/comp-sys/component" } +aster-console = { path = "../console" } +log = "0.4" +ostd = { path = "../../../ostd" } +spin = "0.9.4" +owo-colors = { version = "3", optional = true } +cfg-if = "1.0" + +[features] +default = ["log_color"] +log_color = ["dep:owo-colors"] diff --git a/kernel/comps/logger/src/aster_logger.rs b/kernel/comps/logger/src/aster_logger.rs new file mode 100644 index 000000000..126292eef --- /dev/null +++ b/kernel/comps/logger/src/aster_logger.rs @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MPL-2.0 + +use log::{Metadata, Record}; +use ostd::timer::Jiffies; + +/// The logger used for Asterinas. +struct AsterLogger; + +static LOGGER: AsterLogger = AsterLogger; + +impl log::Log for AsterLogger { + fn enabled(&self, _metadata: &Metadata) -> bool { + true + } + + fn log(&self, record: &Record) { + let timestamp = Jiffies::elapsed().as_duration().as_secs_f64(); + + // Use a global lock to prevent interleaving of log messages. + use ostd::sync::SpinLock; + static RECORD_LOCK: SpinLock<()> = SpinLock::new(()); + let _lock = RECORD_LOCK.disable_irq().lock(); + + print_logs(record, timestamp); + } + + fn flush(&self) {} +} + +#[cfg(feature = "log_color")] +fn print_logs(record: &Record, timestamp: f64) { + use owo_colors::Style; + + let timestamp_style = Style::new().green(); + let record_style = Style::new().default_color(); + let level_style = match record.level() { + log::Level::Error => Style::new().red(), + log::Level::Warn => Style::new().bright_yellow(), + log::Level::Info => Style::new().blue(), + log::Level::Debug => Style::new().bright_green(), + log::Level::Trace => Style::new().bright_black(), + }; + + super::_print(format_args!( + "{} {:<5}: {}\n", + timestamp_style.style(format_args!("[{:>10.3}]", timestamp)), + level_style.style(record.level()), + record_style.style(record.args()) + )); +} + +#[cfg(not(feature = "log_color"))] +fn print_logs(record: &Record, timestamp: f64) { + super::_print(format_args!( + "{} {:<5}: {}\n", + format_args!("[{:>10.3}]", timestamp), + record.level(), + record.args() + )); +} + +pub(super) fn init() { + ostd::logger::inject_logger(&LOGGER); +} diff --git a/kernel/src/console.rs b/kernel/comps/logger/src/console.rs similarity index 89% rename from kernel/src/console.rs rename to kernel/comps/logger/src/console.rs index 5b66dbdad..9ece9fd69 100644 --- a/kernel/src/console.rs +++ b/kernel/comps/logger/src/console.rs @@ -27,7 +27,7 @@ pub fn _print(args: Arguments) { #[macro_export] macro_rules! print { ($($arg:tt)*) => {{ - $crate::console::_print(format_args!($($arg)*)); + $crate::_print(format_args!($($arg)*)); }}; } @@ -38,6 +38,6 @@ macro_rules! println { $crate::print!("\n") }; ($($arg:tt)*) => {{ - $crate::console::_print(format_args_nl!($($arg)*)); + $crate::_print(format_args_nl!($($arg)*)); }}; } diff --git a/kernel/comps/logger/src/lib.rs b/kernel/comps/logger/src/lib.rs new file mode 100644 index 000000000..2423430e1 --- /dev/null +++ b/kernel/comps/logger/src/lib.rs @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MPL-2.0 + +//! The logger implementation for Asterinas. +//! +//! This logger now has the most basic logging functionality, controls the output +//! based on the globally set log level. Different log levels will be represented +//! with different colors if enabling `log_color` feature. +//! +//! This logger guarantees _atomicity_ under concurrency: messages are always +//! printed in their entirety without being mixed with messages generated +//! concurrently on other cores. +//! +//! IRQs are disabled while printing. So do not print long log messages. +#![no_std] +#![deny(unsafe_code)] + +extern crate alloc; + +use component::{init_component, ComponentInitError}; + +mod aster_logger; +mod console; + +pub use console::_print; + +#[init_component] +fn init() -> Result<(), ComponentInitError> { + aster_logger::init(); + Ok(()) +} diff --git a/kernel/comps/network/Cargo.toml b/kernel/comps/network/Cargo.toml index 1c2ece6dd..c5d054990 100644 --- a/kernel/comps/network/Cargo.toml +++ b/kernel/comps/network/Cargo.toml @@ -10,6 +10,7 @@ align_ext = { path = "../../../ostd/libs/align_ext" } aster-util = { path = "../../libs/aster-util" } aster-rights = { path = "../../libs/aster-rights" } aster-bigtcp = { path = "../../libs/aster-bigtcp" } +aster-logger = { path = "../logger" } bitflags = "1.3" bitvec = { version = "1.0.1", default-features = false, features = ["alloc"] } component = { path = "../../libs/comp-sys/component" } diff --git a/kernel/comps/softirq/Cargo.toml b/kernel/comps/softirq/Cargo.toml index b21ba72ec..044013a13 100644 --- a/kernel/comps/softirq/Cargo.toml +++ b/kernel/comps/softirq/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" [dependencies] ostd = { path = "../../../ostd" } component = { path = "../../libs/comp-sys/component" } +aster-logger = { path = "../logger" } intrusive-collections = "0.9.5" spin = "0.9.4" diff --git a/kernel/comps/time/Cargo.toml b/kernel/comps/time/Cargo.toml index 7c9f2d070..24a9a1a06 100644 --- a/kernel/comps/time/Cargo.toml +++ b/kernel/comps/time/Cargo.toml @@ -9,6 +9,7 @@ edition = "2021" ostd = { path = "../../../ostd" } aster-util = { path = "../../libs/aster-util" } component = { path = "../../libs/comp-sys/component" } +aster-logger = { path = "../logger" } log = "0.4" spin = "0.9.4" diff --git a/kernel/comps/virtio/Cargo.toml b/kernel/comps/virtio/Cargo.toml index a287ac166..fbd0ed2e7 100644 --- a/kernel/comps/virtio/Cargo.toml +++ b/kernel/comps/virtio/Cargo.toml @@ -12,6 +12,7 @@ bytes = { version = "1.4.0", default-features = false } align_ext = { path = "../../../ostd/libs/align_ext" } aster-input = { path = "../input" } aster-block = { path = "../block" } +aster-logger = { path = "../logger" } aster-network = { path = "../network" } aster-console = { path = "../console" } aster-util = { path = "../../libs/aster-util" } diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index fd6aea1b4..bc19e2cec 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -51,7 +51,6 @@ extern crate controlled; extern crate getset; pub mod arch; -pub mod console; pub mod context; pub mod cpu; pub mod device; diff --git a/kernel/src/prelude.rs b/kernel/src/prelude.rs index 490d625ae..c5e52471c 100644 --- a/kernel/src/prelude.rs +++ b/kernel/src/prelude.rs @@ -47,11 +47,12 @@ macro_rules! current_thread { }; } +pub(crate) use aster_logger::{print, println}; + pub(crate) use crate::{ context::{Context, CurrentUserSpace, ReadCString}, current, current_thread, error::{Errno, Error}, - print, println, process::signal::Pause, time::{wait::WaitTimeout, Clock}, };