flume采集apache日志多源场景的核心是部署多个独立agent分别监听不同服务器或路径的日志文件(如access.log、error.log),通过exec source + file channel保障可靠性,再经avro sink汇聚至中心agent写入hdfs/kafka;需规避logrotate、channel容量、端口通信及编码等常见问题。

用 Flume 采集 Apache 日志的多源场景,核心是让多个 Agent 各自监听不同服务器或不同日志路径的 Apache 日志文件(如 access.log、error.log),再统一汇聚到一个中心 Agent 或直接写入 HDFS/Kafka。关键不在于“多源”本身复杂,而在于结构清晰、通道可靠、避免重复和丢失。
明确多源类型与部署方式
Apache 日志多源常见有三类:
-
同集群多节点:每台 Web 服务器(node01/node02/node03)运行独立 Flume Agent,各自 tail 本地
/var/log/httpd/access_log或/var/log/apache2/access.log - 单机多日志文件:一台机器上同时采集 access、error、ssl_request_log 等多个 Apache 日志文件,可用 Exec Source 多实例或 Spooling Directory Source(需重命名归档)
-
异构路径混合源:部分日志在本地磁盘,部分通过 syslog 转发(如 Apache 配置
CustomLog "|/usr/bin/logger -t apache-access"),对应使用 Syslog Source 或 NetCat Source
推荐配置:Exec Source + Memory/File Channel
对实时性要求高、日志量中等的场景,Exec Source 最常用。以 node01 上采集 access.log 为例:
a1.sources = r1 a1.sinks = k1 a1.channels = c1 <p>a1.sources.r1.type = exec a1.sources.r1.command = tail -F /var/log/httpd/access_log a1.sources.r1.shell = /bin/bash -c a1.sources.r1.restart = true a1.sources.r1.restart Throttle = 10000</p><p>a1.channels.c1.type = file # 生产环境务必用 file channel 防丢数 a1.channels.c1.checkpointDir = /var/flume/checkpoint a1.channels.c1.dataDirs = /var/flume/data</p><p>a1.sinks.k1.type = avro a1.sinks.k1.hostname = node04 # 汇聚节点 a1.sinks.k1.port = 4141</p><p>a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1 </p>
注意:restart = true 确保 Flume 进程异常退出后自动拉起 tail;file channel 替代 memory channel 是防止宕机丢事件的关键。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
汇聚端统一处理(中心 Agent)
在 node04 上部署汇聚 Agent,接收来自各节点的 Avro 数据,并写入目标系统:
- Source 类型设为
avro,监听 4141 端口 - Channel 建议用
file或memory(若下游吞吐足够) - Sink 可选:
hdfs(按时间滚动目录)、kafka(供 Flink/Spark 实时消费)、logger(调试用)
示例 Sink 配置(写入 HDFS):
a1.sinks.k1.type = hdfs a1.sinks.k1.hdfs.path = hdfs://namenode:8020/flume/apache/%Y%m%d/%H a1.sinks.k1.hdfs.filePrefix = apache_access_ a1.sinks.k1.hdfs.fileType = DataStream a1.sinks.k1.hdfs.writeFormat = Text a1.sinks.k1.hdfs.rollInterval = 300 a1.sinks.k1.hdfs.rollSize = 134217728 a1.sinks.k1.hdfs.rollCount = 0
避坑要点
实际部署中容易忽略但影响稳定性的细节:
- Apache 日志轮转(logrotate)后,
tail -F会自动跟踪新文件,但需确保 logrotate 配置含copytruncate或create,否则 Flume 可能卡在旧 inode - 多个 Exec Source 共用同一 channel 时,必须保证 channel 容量(
capacity)和事务容量(transactionCapacity)足够,建议设为单源峰值的 2–3 倍 - 跨节点传输用 Avro Sink/Source 时,务必关闭防火墙或放行对应端口(如 4141),并确认 hostname 解析正常(推荐配
/etc/hosts) - 日志内容含中文或特殊字符时,在 Sink(如 HDFS)中显式设置编码,例如
hdfs.codeC = UTF-8(部分版本支持)









