跳到主要内容

日志

通过 master.Logs() 访问日志视图,或通过静态方法控制日志开关。

DLL 底层运行日志通过回调推送到 master.Logs()(只读列表),主站创建时自动注册。

快速开始

// 绑定控制台输出
master.Logs().addUpdatedListener(() -> {
LogManager.LogView logs = master.Logs();
if (logs.getCount() > 0) {
System.out.println(logs.get(logs.getCount() - 1));
}
});

// 只看错误和警告
master.Logs().setFilter(LogManager.LogCategory.ERROR, LogManager.LogCategory.WARNING);

// 启用调试日志(默认关闭)
EtherCATMaster.setDebugLogging(true);

日志类别

public enum LogCategory {
ERROR(0), // 系统错误和异常
WARNING(1), // 潜在问题
MESSAGE(2), // 一般信息(状态切换等)
MAILBOX(3), // CoE/SoE/FoE/EoE 邮箱通信(默认关闭)
PDO(4), // PDO 数据变化日志(默认关闭)
DEBUG(5), // 详细调试信息(默认关闭)
LOCAL(6); // 本地日志
}
PDO 日志

PDO 日志只在 PDO 数据发生变化时输出,不会每个周期都产生日志。适合调试 PDO 映射问题。

日志视图

master.Logs()

public LogManager.LogView Logs()

实时日志视图(只读列表),由日志系统自动维护。

相关结构:

public class LogEntry {
public Date timestamp; // 日志时间戳
public LogCategory category; // 日志类别
public String message; // 日志消息内容
}

LogView 方法

  • getCount() (int) — 当前过滤后的日志条数
  • get(int index) (LogEntry) — 按索引获取日志条目
  • getAll() (List<LogEntry>) — 获取所有日志(无视过滤器)
  • getFilteredSnapshot() (List<LogEntry>) — 获取过滤后的日志快照
  • setFilter(LogCategory...) (void) — 设置过滤器(只显示指定类别)
  • addUpdatedListener(Runnable) (void) — 添加更新监听器
  • removeUpdatedListener(Runnable) (void) — 移除更新监听器

过滤

setFilter

public void setFilter(LogCategory... categories)

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

参数:

  • categories (LogCategory...) -- 要显示的日志类别

示例:

// 只看错误和警告
master.Logs().setFilter(LogManager.LogCategory.ERROR, LogManager.LogCategory.WARNING);

// 切换为只看邮箱通信(直接覆盖)
master.Logs().setFilter(LogManager.LogCategory.MAILBOX);

getAll

public List<LogEntry> getAll()

获取所有日志条目(无视过滤器)。用于导出或自定义过滤。

日志开关

Mailbox、PDO、Debug 三类日志默认关闭,需要时手动启用。

setPDOLogging

public static void setPDOLogging(boolean enable)

启用 PDO 日志。仅在 PDO 数据变化时输出,影响实时性能,慎用。

setMailboxLogging

public static void setMailboxLogging(boolean enable)

启用邮箱日志(CoE/SoE/FoE/EoE 邮箱通信日志)。

setDebugLogging

public static void setDebugLogging(boolean enable)

启用调试日志(详细调试信息)。

DLL 回调

setLogCallback

master.setLogCallback((level, message) -> {
System.out.println("[" + level + "] " + message);
});

设置底层 DLL 日志回调,接收所有 DLL 层日志消息。

setCrashCallback

master.setCrashCallback((message) -> {
System.out.println("崩溃: " + message);
});

设置崩溃回调,在 DLL 层发生致命错误时触发。

完整示例

// 1. 绑定控制台输出(实时显示所有日志)
master.Logs().addUpdatedListener(() -> {
LogManager.LogView logs = master.Logs();
if (logs.getCount() > 0) {
System.out.println(logs.get(logs.getCount() - 1));
}
});

// 2. 启用调试日志
EtherCATMaster.setDebugLogging(true);
EtherCATMaster.setMailboxLogging(true);

// 3. 过滤日志(只看错误和调试)
master.Logs().setFilter(
LogManager.LogCategory.ERROR,
LogManager.LogCategory.DEBUG);

// 4. 导出所有日志(无视过滤器)
List<LogManager.LogEntry> allLogs = master.Logs().getAll();
for (LogManager.LogEntry entry : allLogs) {
System.out.println(entry);
}
Swing / JavaFX 绑定

addUpdatedListener 在非 UI 线程触发,更新 UI 时需要同步:

// Swing
master.Logs().addUpdatedListener(() ->
SwingUtilities.invokeLater(() ->
listModel.addElement(master.Logs().get(master.Logs().getCount() - 1))));

// JavaFX
master.Logs().addUpdatedListener(() ->
Platform.runLater(() ->
logItems.add(master.Logs().get(master.Logs().getCount() - 1))));