LogCore

Struct LogCore 

Source
pub struct LogCore {
    buffer: GlobalLogBuffer,
    global_level: AtomicU8,
    console_level: AtomicU8,
}
Expand description

核心日志系统

封装了环形缓冲区和过滤状态。可以为测试目的而实例化, 或在生产环境中用作全局单例。

§线程安全性

所有方法都使用原子操作进行同步,使得整个结构体在 线程之间安全共享,无需外部加锁。

Fields§

§buffer: GlobalLogBuffer

用于日志存储的无锁环形缓冲区

§global_level: AtomicU8

全局日志级别阈值(控制日志是否缓冲)

§console_level: AtomicU8

控制台输出级别阈值(控制是否立即打印)

Implementations§

Source§

impl LogCore

Source

pub const fn default() -> Self

使用默认日志级别创建新的 LogCore 实例

这是一个 const fn,可以在编译时进行评估, 从而实现零开销的静态初始化。

使用配置中的默认级别:

  • 全局级别: Info (Debug 级别的日志将被过滤)
  • 控制台级别: Warning (只打印 Warning 和 Error 级别的日志)
§示例
// 全局单例 (编译时初始化)
static GLOBAL_LOG: LogCore = LogCore::default();
Source

pub fn new(global_level: LogLevel, console_level: LogLevel) -> Self

使用自定义日志级别创建新的 LogCore 实例

此构造函数允许在创建时指定全局和控制台日志级别, 这对于测试尤其有用。

§参数
  • global_level - 日志被缓冲的最低级别
  • console_level - 日志被打印到控制台的最低级别
§示例
// 启用 Debug 级别的测试实例
let test_log = LogCore::new(LogLevel::Debug, LogLevel::Warning);

// 使用自定义级别的生产实例
let log = LogCore::new(LogLevel::Info, LogLevel::Error);
Source

pub fn _log(&self, level: LogLevel, args: Arguments<'_>)

核心日志记录实现

此方法由生产宏(通过 GLOBAL_LOG)和测试代码(通过本地实例)调用。

§无锁操作
  1. 原子读取 global_level (Acquire)
  2. 如果被过滤,则提前返回
  3. 收集上下文 (时间戳、CPU ID、任务 ID)
  4. 创建日志条目 (栈分配)
  5. 原子缓冲区写入 (无锁)
  6. 可选的控制台输出 (如果满足 console_level)
§参数
  • level - 日志级别 (Emergency 到 Debug)
  • args - 来自 format_args! 的格式化参数
Source

pub fn _read_log(&self) -> Option<LogEntry>

从缓冲区读取下一个日志条目

如果没有可用条目,则返回 None。这是一个无锁的 单消费者操作。

Source

pub fn _peek_log(&self, index: usize) -> Option<LogEntry>

非破坏性读取:按索引 peek 日志条目,不移动读指针

Source

pub fn _log_reader_index(&self) -> usize

获取当前可读取的起始索引

Source

pub fn _log_writer_index(&self) -> usize

获取当前写入位置

Source

pub fn _log_len(&self) -> usize

返回未读日志条目的数量

Source

pub fn _log_unread_bytes(&self) -> usize

返回未读日志的总字节数(格式化后)

Source

pub fn _log_dropped_count(&self) -> usize

返回由于缓冲区溢出而丢弃的日志计数

Source

pub fn _set_global_level(&self, level: LogLevel)

设置全局日志级别阈值

级别 > 阈值的日志将被丢弃。

§内存顺序

使用 Release 顺序以确保新级别对所有核心可见。

Source

pub fn _get_global_level(&self) -> LogLevel

获取当前全局日志级别

Source

pub fn _set_console_level(&self, level: LogLevel)

设置控制台输出级别阈值

只有级别 <= 阈值的日志才会立即打印。

Source

pub fn _get_console_level(&self) -> LogLevel

获取当前控制台输出级别

Source

fn is_level_enabled(&self, level: LogLevel) -> bool

检查日志级别是否启用 (全局过滤器)

Source

fn is_console_level(&self, level: LogLevel) -> bool

检查日志是否应该打印到控制台

Source

fn direct_print_entry(&self, entry: &LogEntry)

使用 ANSI 颜色直接将日志条目打印到控制台(无堆分配)

此方法在早期启动时即可使用,因为它仅使用栈和 core::fmt::Write, 不依赖堆分配器。

重要: 此函数的格式化逻辑必须与 format_log_entrybuffer::calculate_formatted_length 保持一致。 如果修改了日志输出格式,需要同步更新三处:

  • direct_print_entry (此函数) - 用于早期启动的控制台输出
  • format_log_entry - 用于 syslog 系统调用
  • buffer::calculate_formatted_length - 用于精确字节计数

Trait Implementations§

Source§

impl Sync for LogCore

Auto Trait Implementations§

§

impl !Freeze for LogCore

§

impl RefUnwindSafe for LogCore

§

impl Send for LogCore

§

impl Unpin for LogCore

§

impl UnwindSafe for LogCore

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.