19.6.2 日志采集与传输链路设计

本节围绕日志采集与传输链路设计,目标是在高可靠、低侵入、可扩展的前提下实现全量覆盖与可追溯。链路设计需兼顾数据完整性、传输效率、可观测性与安全合规,并支持多源异构日志的统一接入。

原理草图:采集—缓冲—中转—解析链路

文章图片

采集侧设计要点
- 采集方式选择:以Agent为主、旁路采集为辅;主机用File/Journald,容器优先Stdout/Sidecar。
- 采集范围与分级:区分应用/系统/审计/中间件日志,定义采集等级与留存策略。
- 一致性与幂等:基于文件偏移或事件ID实现断点续传与去重。
- 资源控制:限速、批量与本地缓冲,防止采集抢占业务资源。

传输链路与中转设计
- 链路拓扑:Agent → 本地缓冲 → Kafka → 解析/索引;跨机房引入边缘缓冲层。
- 传输可靠性:TCP/HTTPS + 批量发送 + 重试与退避。
- 削峰与隔离:按业务域/敏感等级划分Topic与通道。

安全与合规
- TLS加密:全链路加密,证书自动轮换。
- 鉴权:Token/双向证书,限制写入权限。
- 脱敏与过滤:采集侧或中转层脱敏,防止隐私泄露。


采集与传输示例(Fluent Bit → Kafka)#

1)安装与目录结构(以Ubuntu为例)

# 添加Fluent Bit源
curl -s https://packages.fluentbit.io/fluentbit.key | sudo apt-key add -
echo "deb https://packages.fluentbit.io/ubuntu/$(lsb_release -cs) $(lsb_release -cs) main" | \
  sudo tee /etc/apt/sources.list.d/fluent-bit.list

sudo apt update
sudo apt install -y td-agent-bit

# 目录检查
ls -l /etc/td-agent-bit/ /var/log/td-agent-bit/

2)采集Nginx访问日志并发送到Kafka

# /etc/td-agent-bit/td-agent-bit.conf
[SERVICE]
    Flush        1
    Daemon       Off
    Log_Level    info
    Parsers_File parsers.conf
    storage.path /var/log/td-agent-bit/buffer
    storage.sync normal

[INPUT]
    Name   tail
    Tag    nginx.access
    Path   /var/log/nginx/access.log
    Parser nginx
    DB     /var/log/td-agent-bit/nginx.db
    Mem_Buf_Limit 50MB
    Skip_Long_Lines On

[FILTER]
    Name    modify
    Match   nginx.access
    Add     env prod
    Add     app web

[OUTPUT]
    Name           kafka
    Match          nginx.access
    Brokers        10.0.0.10:9092,10.0.0.11:9092
    Topics         log-nginx-access
    rdkafka.security.protocol PLAINTEXT
    rdkafka.request.required.acks all
    rdkafka.message.send.max.retries 10
    rdkafka.retry.backoff.ms 200

3)配置解析器(Nginx格式示例)

# /etc/td-agent-bit/parsers.conf
[PARSER]
    Name   nginx
    Format regex
    Regex  ^(?<remote>[^ ]*) - (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\w+) (?<uri>[^ ]*) (?<proto>[^"]*)" (?<status>\d+) (?<bytes>\d+) "(?<referer>[^"]*)" "(?<agent>[^"]*)"
    Time_Key time
    Time_Format %d/%b/%Y:%H:%M:%S %z

4)启动与验证

sudo systemctl restart td-agent-bit
sudo systemctl status td-agent-bit

# 观察采集日志
sudo tail -f /var/log/td-agent-bit/td-agent-bit.log

# Kafka端消费验证
kafka-console-consumer.sh --bootstrap-server 10.0.0.10:9092 \
  --topic log-nginx-access --from-beginning --max-messages 3

预期效果
- Fluent Bit日志无报错,Kafka可消费到带envapp字段的Nginx日志。


容器场景:Stdout采集(Docker)#

1)启动容器并输出日志

docker run -d --name demo-nginx -p 8080:80 nginx
curl http://127.0.0.1:8080/

2)采集Docker JSON日志

# /etc/td-agent-bit/td-agent-bit.conf (新增)
[INPUT]
    Name   tail
    Tag    docker.nginx
    Path   /var/lib/docker/containers/*/*-json.log
    Parser docker
    DB     /var/log/td-agent-bit/docker.db

3)解析Docker JSON

# /etc/td-agent-bit/parsers.conf (新增)
[PARSER]
    Name   docker
    Format json
    Time_Key time
    Time_Format %Y-%m-%dT%H:%M:%S.%L

传输链路容错示例(本地缓冲与断点续传)#

# /etc/td-agent-bit/td-agent-bit.conf
[SERVICE]
    storage.path /var/log/td-agent-bit/buffer
    storage.backlog.mem_limit 100MB

[INPUT]
    Name   tail
    Path   /var/log/syslog
    DB     /var/log/td-agent-bit/syslog.db
    storage.type filesystem

说明
- Kafka不可用时日志落盘,恢复后自动补发。


排错清单(含命令与解释)#

1)Kafka不可达

# 测试端口连通性
nc -vz 10.0.0.10 9092

# 检查DNS
getent hosts kafka-broker
  • 现象:Fluent Bit日志报Broker transport failure
  • 处理:修复网络或Broker配置,确认Brokers列表正确。

2)日志重复或断点不生效

# 检查DB偏移文件
ls -l /var/log/td-agent-bit/*.db
sqlite3 /var/log/td-agent-bit/nginx.db "select * from in_tail_files;"
  • 处理:确认DB配置稳定且不被清理;避免频繁重建容器路径变化。

3)解析失败

# 采样一行原始日志并测试regex
grep -m1 '' /var/log/nginx/access.log
  • 处理:调整Regex与时间格式;提升Log_Level为debug观察解析错误。

练习#

  1. 以MySQL慢日志为源,新增一个Topic并加上app=mysql字段,验证Kafka消费结果。
  2. 模拟Kafka停机5分钟,观察本地缓冲目录增长并在恢复后补发。
  3. 为审计日志增加脱敏过滤(如手机号掩码),验证脱敏后的日志进入Topic。

通过标准化采集策略、分层传输架构与完善的容错机制,能够构建稳定、可扩展且安全的日志采集与传输链路,为后续解析、存储与审计提供可靠基础。