日志搜集处理框架---浅谈logstash
1 简介
Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。 它是ELK Stack重要的组成部分,诞生于2009年8月2日,作者是世界著名运维工程师Jordan Sissel。
2 设计及架构
LogStash由JRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上。不同于分离的代理端(agent)或主机端(server),LogStash可配置单一的代理端(agent)与其它开源软件结合,以实现不同的功能。
在LogStash的生态系统中,主要分为四大组件:
Shipper:发送事件(events)至LogStash;通常,远程代理端(agent)只需要运行这个组件即可;
Broker and Indexer:接收并索引化事件;
Search and Storage:允许对事件进行搜索和存储;
Web Interface:基于Web的展示界面
正是由于以上组件在LogStash架构中可独立部署,才提供了更好的集群扩展性。
在大多数情况下,LogStash主机可分为两大类:
代理主机(agent host):作为事件的传递者(shipper),将各种日志数据发送至中心主机;只需运行Logstash 代理(agent)程序;
中心主机(central host):可运行包括中间转发器(Broker)、索引器(Indexer)、搜索和存储器(Search and Storage)、Web界面端(Web Interface)在内的各个组件,以实现对日志数据的接收、处理和存储。
3 部署架构
Logstash的理念很简单,它只做3件事情:
- Collect:数据输入
- Enrich:数据加工,如过滤,改写等
- Transport:数据输出
别看它只做3件事,但通过组合输入和输出,可以变幻出多种架构实现多种需求。
解释术语:
- Shipper:日志收集者。负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来,输出到Redis暂存。
- Indexer:日志存储者。负责从Redis接收日志,写入到本地文件。
- Broker:日志Hub,用来连接多个Shipper和多个Indexer。
无论是Shipper还是Indexer,Logstash始终只做前面提到的3件事:
- Shipper从日志文件读取最新的行文本,经过处理(这里我们会改写部分元数据),输出到Redis,
- Indexer从Redis读取文本,经过处理(这里我们会format文本),输出到文件。
一个Logstash进程可以有多个输入源,所以一个Logstash进程可以同时读取一台服务器上的多个日志文件。Redis是Logstash官方推荐的Broker角色“人选”,支持订阅发布和队列两种数据传输模式,推荐使用。输入输出支持过滤,改写。Logstash支持多种输出源,可以配置多个输出实现数据的多份复制,也可以输出到Email,File,Tcp,或者作为其它程序的输入,又或者安装插件实现和其他系统的对接,比如搜索引擎Elasticsearch。
总结:Logstash概念简单,通过组合可以满足多种需求。
4 工作原理
Logstash使用管道方式进行日志的搜集处理和输出。有点类似UNIX系统的管道命令 xxx | bbb | ddd,xxx执行完了会执行bbb,然后执行ddd。
Logstash整个的数据处理过程可以抽象成一个Pipeline,即通过两个必备要素:input和output,一个可选要素filter来完成数据处理。Input可从数据源消费数据,通过Filter对数据源进行制定的处理,再将数据输出到特定的数据存储位置。
在logstash中,包括了三个阶段:
输入input –> 处理filter(不是必须的) –> 输出output
Input:你使用Inputs去获取数据到Logstash中
Filter:logstash管道中间处理的设备。可以结合条件语句对符合标准的事件进行处理。
Output:logstash管道的最后一个阶段。一个事件可以经过多个output。但是一旦所有输出处理完,该事件已经执行完。
每个阶段都由很多的插件配合工作,比如file、elasticsearch、redis等等。
每个阶段也可以指定多种方式,比如输出既可以输出到elasticsearch中,也可以指定到stdout在控制台打印。
由于这种插件式的组织方式,使得logstash变得易于扩展和定制。
工作流程
Logstash agent监控并过滤日志,将过滤后的日志内容发给redis,logstash index将日志收集在一起交给下一个。
5 Logstash pipeline
Logstash会持续监控被监控机器的日志,这为我们提供了极大的方便,我们可以实时看到机器的状态,并通过Kibana进行可视化。Logstash更擅长处理流式数据,而不是静态数据。
5.1 input plugin
你使用Inputs去获取数据到Logstash中
Logstash提供了多种input导入方式,常用的有:file、exec、heartbeat等
5.2 filter plugin
logstash管道中间处理的设备。可以结合条件语句对符合标准的事件进行处理。
Logstash也提供了大量的导出方式,常用的有:kafka、elasticsearch等
5.3 output plugin
logstash管道的最后一个阶段。一个事件可以经过多个output。但是一旦所有输出处理完,该事件已经执行完。
Logstash也提供了大量的导出方式,常用的有:kafka、elasticsearch等。
6 线程模型
当前logstash线程模型是:
input threads | filter worker threads | output worker
过滤器是可选的,没有filter是这样的:
input threads | output worker
每个input运行在自身的一个线程。这可以防止繁忙的input阻塞慢的。
filter线程模型是工人模型,每个工人接收到一个事件,并应用于所有过滤器,再将其发送到output队列。在CPU可扩展性,因为许多过滤器是CPU密集型的。filter workers默认是1,在启动logstash时,可以通过-w指定。
output当前工作模式是一个线程。output接收事件的顺序是以配置文件定义的输出顺序。
output在发布它们之前可能会决定临时缓存事件。这方面elasticsearch output是一个例子,缓存事件和刷新它们使用一个单独的线程。该机制(缓存很多事件和写使用单独的线程)可以改善性能,因为可以防止logstash管道一直等待elasticsearch响应。
logstash通常至少有3个线程,如果没有filter只有2个。一个input线程,一个filter worker线程,和一个output线程。如果看到logstash使用多个CPU,这就是原因。
7 优势
对日志数据更好的语法分析功能;
更加灵活的日志存储方式;
附带搜索和目录功能;
易于安装、可扩展、性能良好等;
配置简易上手。Logstash是Ruby DSL设计,是目前业界最通用的配置语法设计;
集群线性扩展。不管是 Elasticsearch 集群还是 Logstash 集群都是可以线性扩展的。
- 点赞
- 收藏
- 关注作者
评论(0)