2、日志采集技术:Syslog协议详解、ELK/EFK架构原理、Flume与Logstash采集器对比

日志采集是整个日志审计体系的起点。你想想看,如果源头的数据就丢了、乱了、不全了,后面分析得再漂亮也是白搭。这一章,我重点聊聊三种主流的采集技术:Syslog协议、ELK/EFK架构,以及Flume和Logstash这对“老冤家”。

2.1 Syslog协议详解

Syslog可以说是日志采集界的“活化石”了。从Unix时代就开始用,到现在依然是网络设备、Linux服务器的标配。说白了,它定义了一套日志怎么产生、怎么传、怎么存的规则。

协议的核心要素

每条Syslog消息都包含三个关键字段:

  • 设施(Facility):标识日志来源。比如kern代表内核,auth代表认证模块,local0~local7留给用户自定义。我记得有一次排查防火墙日志,发现所有日志都标记为local4,一开始还以为是配置错了,后来才发现是厂商故意这么设计的,方便做过滤。
  • 严重级别(Severity):从0(Emergency)到7(Debug)。级别越低越紧急。嗯,这里要注意:很多运维同学会把所有日志都设成Info级别,结果真正出故障时,告警日志被海量Info淹没了。我建议生产环境至少把Warning以上级别单独抽出来。
  • 时间戳和主机名:这个看似简单,坑却不少。我曾经遇到过跨时区的Syslog服务器,日志时间差了8小时,排查问题时差点被带偏。

传输方式

Syslog早期用UDP 514端口,速度快但不靠谱。后来有了TCP和TLS版本。我个人习惯:内网环境用TCP,外网或跨公网必须上TLS。你想想看,日志明文传输,等于把系统家底全亮给别人了。

实战配置示例:Linux下配置rsyslog发送日志到中央服务器

# 在客户端 /etc/rsyslog.conf 中添加
*.* @192.168.1.100:514   # UDP发送
*.* @@192.168.1.100:514  # TCP发送

# 重启服务
systemctl restart rsyslog

避坑指南:我曾经接手过一个项目,Syslog服务器收不到任何日志。查了半天,发现是防火墙把514端口给拦了。更尴尬的是,服务器本地的iptables规则里明明写了放行,但云平台的安全组没开。所以,记得检查“两层防火墙”——系统层和平台层。

2.2 ELK/EFK架构原理

ELK是Elasticsearch、Logstash、Kibana的缩写。后来很多人把Logstash换成Fluentd,就成了EFK。为什么换?说白了,Logstash吃内存太狠了,Fluentd更轻量。

ELK的工作流程

  1. Logstash采集:从各种源头拉日志,做过滤、解析、格式化。
  2. Elasticsearch存储和索引:把结构化数据存起来,支持全文检索。
  3. Kibana可视化:画图表、做仪表盘、查日志。

我在项目中遇到过一个问题:Logstash处理Nginx日志时,默认的正则表达式匹配不上自定义的日志格式。结果大量日志被丢到了_grokparsefailure索引里。嗯,这里有个小技巧:先用grok debugger工具在线调试正则,确认无误再上线。

EFK的优势

Fluentd相比Logstash,最大的特点是“插件生态丰富”和“资源占用低”。我做过一个对比测试:同样采集1000条/秒的日志,Logstash吃掉2GB内存,Fluentd只用了800MB。如果你的服务器资源紧张,EFK是更务实的选择。

我的个人经验:如果你团队里有人擅长Ruby,选Logstash;如果大家更熟悉Ruby或C,Fluentd可能更顺手。技术选型有时候不只看性能,还要看团队维护能力。

2.3 Flume与Logstash采集器对比

Flume是Apache家的,Logstash是Elastic家的。两者都是日志采集工具,但设计哲学完全不同。

对比维度 Flume Logstash
开发语言 Java Ruby(JRuby)
核心模型 Source-Channel-Sink Input-Filter-Output
可靠性 支持事务,数据不丢 默认At-least-once,可能重复
资源消耗 中等,依赖JVM 较高,内存大户
插件生态 较少,需自己开发 丰富,社区活跃
典型场景 大数据生态(Hadoop/Spark) ELK栈、日志分析

怎么选?

我个人的建议是:

  • 如果你的下游是Hadoop、Kafka这类大数据组件,Flume更合适。它天生就是为大数据设计的,Source-Channel-Sink模型能保证数据不丢。
  • 如果你的目标是Elasticsearch做日志分析,无脑选Logstash。它和ES的集成度最高,很多插件开箱即用。
  • 如果你既要用大数据又要用ES,可以考虑Flume + Logstash的组合:Flume负责采集和缓冲,Logstash负责解析和写入ES。

一个真实的踩坑案例:我曾经在一个项目里用Flume采集应用日志,结果发现日志偶尔会重复。查了半天,原来是Flume的Channel配置了内存类型,一旦Agent重启,未消费的数据会重新发送。解决方案是把Channel改成File类型,牺牲一点性能,换来数据精确一次。

好了,这一章的内容就这些。Syslog是基础协议,ELK/EFK是主流架构,Flume和Logstash是具体工具。你想想看,搞懂了这些,日志采集这块基本就心里有数了。下一章我们聊聊日志解析和格式化,那才是真正考验功力的地方。