Skip to content

日志与输出配置

相关源文件

以下文件被用作生成此维基页面的上下文:

eCapture 提供了一套灵活的输出系统,兼顾交互式调试和大规模生产集成。支持多种输出目标(stdout、文件、TCP、WebSocket)、结构化数据格式(明文、JSON、Protobuf),以及日志轮转和嵌入 TLS 密钥的 PCAPNG 生成等高级功能。

输出架构与数据流

输出系统遵循三阶段流水线:事件生成(内核)、事件处理(用户态)以及写入/编码(输出层)。

数据流图

此图追踪了 eBPF 事件根据配置的标志到达最终目的地的整个流程。

Sources: pkg/event_processor/processor.go:64-87, pkg/event_processor/iworker.go:174-227, cli/cmd/root.go:179-183


配置标志

输出行为通过根命令中定义的持久标志进行控制。

标志描述代码引用
--logaddr, -l主日志/事件目的地。支持 stdout、文件路径、tcp://ws://cli/cmd/root.go:168-168
--eventaddr专用事件转发地址。未设置时默认使用 --logaddrcli/cmd/root.go:169-169
--ecaptureq启用 WebSocket 服务器模式用于事件推送。cli/cmd/root.go:170-170
--hex将字节字符串以十六进制编码字符串形式打印。cli/cmd/root.go:164-164
--tsize, -t将事件载荷截断至 N 字节。cli/cmd/root.go:172-172
--eventroratesize日志轮转的最大大小(MB,仅限文件输出)。cli/cmd/root.go:173-173
--eventroratetime日志轮转的时间间隔(秒)。cli/cmd/root.go:174-174

日志轮转(roratelog)

当输出到文件时,eCapture 使用 roratelog 包来防止磁盘耗尽。在高流量 TLS 捕获场景中,这一点尤为关键。

实现细节

FileWriter 检查是否启用了轮转,并将文件句柄封装在 roratelog.Logger 中。

Sources: internal/output/writers/file_writer.go:27-43, pkg/util/roratelog/rorate.go:67-93


远程转发模式

TCP/WebSocket 转发

通过使用 --logaddr tcp://host:port,eCapture 初始化一个基于网络的写入器。eventWorker 在传输前将事件序列化为 Protobuf 消息(如果使用 ecaptureq)或纯文本。

与 ELK / Kafka 集成

在生产流水线中,eCapture 通常以以下两种方式之一进行部署:

  1. Filebeat 模式:eCapture 使用 --eventroratesize 写入本地文件。Filebeat 等边车程序将日志传输到 Logstash/Elasticsearch。
  2. 直接流式传输:eCapture 通过 TCP 流式传输到一个充当 Kafka 生产者的侦听器。

PCAPNG 与 TLS 解密密钥

在捕获网络流量(TC 探针)时,eCapture 使用专用的 PcapWriter 生成 PCAPNG 文件。

解密密钥块(DSB)

为了使 Wireshark 在没有 CA 证书的情况下解密捕获的 TLS 流量,eCapture 将"解密密钥块"写入 PCAPNG 文件。

PCAP 写入器逻辑

Sources: internal/output/writers/pcap_writer.go:138-157, internal/probe/base/handlers/pcap_handler.go:126-159


优先级与解析规则

最终输出目的地在 cli/cmd/root.go 中解析。

  1. 如果设置了 --ecaptureq,系统会初始化一个 WebSocket 服务器。
  2. 如果提供了 --eventaddr,它优先用于捕获的事件。
  3. 如果仅提供了 --logaddr,则系统日志和捕获的事件都发送到该地址。
  4. 默认为带有 zerolog.ConsoleWriteros.Stdoutcli/cmd/root.go:182-184

Sources: cli/cmd/root.go:79-103, pkg/event_processor/processor.go:204-213

日志与输出配置 has loaded