Files
OxideJS-New/crates/oxide_log/src/subsystem.rs
T
2026-08-05 21:46:47 +08:00

82 lines
2.9 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! 子系统标识与日志级别解析。
//!
//! 引擎日志按子系统划分(VM / IC / Kernel / Builtins),各子系统可独立设置
//! 级别。`parse_level` 把字符串解析为 [`Level`];`apply_env_levels` 读取
//! `OXIDE_LOG` 环境变量并按 `oxide=<level>` 形式的指令批量覆盖级别。
use crate::level::Level;
/// 引擎子系统标识。
///
/// `repr(usize)` 的值同时用作 [`SubsystemFilter`](crate::SubsystemFilter)
/// 内部原子级别数组的下标,故枚举顺序不可随意调整。
#[repr(usize)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SubsystemId {
/// 虚拟机执行循环(字节码解释器)。
Vm = 0,
/// 内联缓存(inline cache)相关路径。
Ic = 1,
/// 内核:对象模型、GC、运行时服务。
Kernel = 2,
/// 内置对象与内置函数实现。
Builtins = 3,
}
/// 子系统总数,即 [`SubsystemId`] 变体个数,也是 `SubsystemFilter` 级别数组长度。
pub const SUBSYSTEM_COUNT: usize = 4;
/// 把级别字符串解析为 [`Level`],大小写不敏感。
///
/// 接受 `off` / `error` / `warn` / `info` / `debug` / `trace`,未知字符串返回
/// `None`。
pub fn parse_level(s: &str) -> Option<Level> {
if s.eq_ignore_ascii_case("off") {
Some(Level::Off)
} else if s.eq_ignore_ascii_case("error") {
Some(Level::Error)
} else if s.eq_ignore_ascii_case("warn") {
Some(Level::Warn)
} else if s.eq_ignore_ascii_case("info") {
Some(Level::Info)
} else if s.eq_ignore_ascii_case("debug") {
Some(Level::Debug)
} else if s.eq_ignore_ascii_case("trace") {
Some(Level::Trace)
} else {
None
}
}
/// 从环境变量 `OXIDE_LOG` 应用启动时级别覆盖。
///
/// 指令格式为逗号分隔的 `target=level` 列表,如 `oxide::vm=debug,oxide::ic=info`;
/// `oxide=<level>` 为所有子系统的快捷写法。无效指令被静默跳过,
/// 若环境变量缺失则直接返回。
pub fn apply_env_levels() {
let Ok(spec) = std::env::var("OXIDE_LOG") else {
return;
};
for directive in spec.split(',') {
let Some((target, level_str)) = directive.split_once('=') else {
continue;
};
let Some(level) = parse_level(level_str.trim()) else {
continue;
};
match target.trim() {
"oxide" => {
crate::set_level(SubsystemId::Vm, level);
crate::set_level(SubsystemId::Ic, level);
crate::set_level(SubsystemId::Kernel, level);
crate::set_level(SubsystemId::Builtins, level);
}
"oxide::vm" => crate::set_level(SubsystemId::Vm, level),
"oxide::ic" => crate::set_level(SubsystemId::Ic, level),
"oxide::kernel" => crate::set_level(SubsystemId::Kernel, level),
"oxide::builtins" => crate::set_level(SubsystemId::Builtins, level),
_ => {}
}
}
}