日志
通过 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)?;