跳到主要内容

日志

通过 LogManager::instance() 访问全局日志管理器。

主站底层运行日志推送到 LogManager,在初始化时自动注册。

快速开始

use ethercat::logging::{LogManager, LogCategory};

let log_mgr = LogManager::instance();

// 绑定到控制台输出
log_mgr.default_view().set_on_updated(|entry| {
println!("{}", entry);
});

// 只看错误和警告
log_mgr.default_view().set_filter(&[LogCategory::Error, LogCategory::Warning]);

// 添加自定义日志
log_mgr.add_log(LogCategory::Message, "主站已初始化");

日志类别

#[repr(i32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum LogCategory {
Error = 0, // 系统错误和异常
Warning = 1, // 潜在问题
Message = 2, // 一般信息
Mailbox = 3, // 邮箱通信(默认关闭)
PDO = 4, // PDO 数据变化(默认关闭)
Debug = 5, // 详细调试(默认关闭)
Local = 6, // 控制台输出捕获
}

日志管理器

LogManager::instance()

pub fn instance() -> &'static LogManager

获取全局日志管理器单例。

default_view()

pub fn default_view(&self) -> &LogView

获取默认日志视图。

add_log()

pub fn add_log(&self, category: LogCategory, message: &str)

添加一条日志。

clear()

pub fn clear(&self)

清空所有日志。

日志条目

pub struct LogEntry {
pub timestamp: SystemTime, // 日志时间戳
pub category: LogCategory, // 日志类别
pub message: String, // 日志消息内容
}

日志视图

set_on_updated()

pub fn set_on_updated<F>(&self, callback: F)
where F: Fn(&LogEntry) + Send + Sync + 'static

日志数据变化时触发。回调参数为新增的日志条目。

set_filter()

pub fn set_filter(&self, categories: &[LogCategory])

设置过滤器,只显示指定类别的日志。

reset_filter()

pub fn reset_filter(&self)

重置过滤器(显示所有类别)。

get_all()

pub fn get_all(&self) -> Vec<LogEntry>

获取所有日志条目(无视过滤器)。

get_filtered()

pub fn get_filtered(&self) -> Vec<LogEntry>

获取过滤后的日志条目。

count()

pub fn count(&self) -> usize

当前过滤后的日志条数。

set_retain_count() / retain_count()

pub fn set_retain_count(&self, count: usize)
pub fn retain_count(&self) -> usize

设置/获取最大保留条数(0 = 使用默认上限 10000)。

容量与保留策略

日志列表设有上限,超出时自动移除最旧的条目。

自动保留模式: 进入 SafeOp/OP 状态后,日志自动切换为保留模式 -- 运行时事件(从站离线、PDO 丢帧、DC 同步丢失等)不会被后续操作清空。退出 SafeOp/OP 后恢复为普通模式。

日志开关

通过 EtherCATMaster 静态方法控制底层日志输出:

/// 启用 PDO 日志
pub fn set_pdo_logging(enable: bool)

/// 启用邮箱日志
pub fn set_mailbox_logging(enable: bool)

/// 启用调试日志
pub fn set_debug_logging(enable: bool)

完整示例

use ethercat::logging::{LogManager, LogCategory};
use ethercat::EtherCATMaster;

let log_mgr = LogManager::instance();
let view = log_mgr.default_view();

// 1. 绑定控制台输出
view.set_on_updated(|entry| {
println!("{}", entry);
});

// 2. 启用调试日志
EtherCATMaster::set_debug_logging(true);
EtherCATMaster::set_mailbox_logging(true);

// 3. 过滤日志
view.set_filter(&[LogCategory::Error, LogCategory::Debug]);

// 4. 导出所有日志
let all_logs = view.get_all();
let content: String = all_logs.iter()
.map(|e| format!("{}\n", e))
.collect();
std::fs::write("debug.log", content)?;