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可消费到带env、app字段的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观察解析错误。
练习#
- 以MySQL慢日志为源,新增一个Topic并加上
app=mysql字段,验证Kafka消费结果。 - 模拟Kafka停机5分钟,观察本地缓冲目录增长并在恢复后补发。
- 为审计日志增加脱敏过滤(如手机号掩码),验证脱敏后的日志进入Topic。
通过标准化采集策略、分层传输架构与完善的容错机制,能够构建稳定、可扩展且安全的日志采集与传输链路,为后续解析、存储与审计提供可靠基础。