日志搜集处理框架---浅谈logstash

举报
yd_13849311 发表于 2017/09/13 10:16:43 2017/09/13
【摘要】 logstash简介、设计架构、工作原理、线程模型及优势简述

1      简介

Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。 它是ELK Stack重要的组成部分,诞生于200982日,作者是世界著名运维工程师Jordan Sissel

2      设计及架构

LogStashJRuby语言编写,基于消息(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件事情:

  1. Collect:数据输入
  2. Enrich:数据加工,如过滤,改写等
  3. Transport:数据输出

别看它只做3件事,但通过组合输入和输出,可以变幻出多种架构实现多种需求。

解释术语:

  • Shipper:日志收集者。负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来,输出到Redis暂存。
  • Indexer:日志存储者。负责从Redis接收日志,写入到本地文件。
  • Broker:日志Hub,用来连接多个Shipper和多个Indexer

无论是Shipper还是IndexerLogstash始终只做前面提到的3件事:

  • Shipper从日志文件读取最新的行文本,经过处理(这里我们会改写部分元数据),输出到Redis
  • IndexerRedis读取文本,经过处理(这里我们会format文本),输出到文件。

一个Logstash进程可以有多个输入源,所以一个Logstash进程可以同时读取一台服务器上的多个日志文件。RedisLogstash官方推荐的Broker角色“人选”,支持订阅发布和队列两种数据传输模式,推荐使用。输入输出支持过滤,改写。Logstash支持多种输出源,可以配置多个输出实现数据的多份复制,也可以输出到EmailFileTcp,或者作为其它程序的输入,又或者安装插件实现和其他系统的对接,比如搜索引擎Elasticsearch

总结:Logstash概念简单,通过组合可以满足多种需求。

 

4      工作原理

Logstash使用管道方式进行日志的搜集处理和输出。有点类似UNIX系统的管道命令 xxx | bbb | dddxxx执行完了会执行bbb,然后执行ddd

Logstash整个的数据处理过程可以抽象成一个Pipeline,即通过两个必备要素:inputoutput,一个可选要素filter来完成数据处理。Input可从数据源消费数据,通过Filter对数据源进行制定的处理,再将数据输出到特定的数据存储位置。

logstash中,包括了三个阶段:

输入input –> 处理filter(不是必须的) –> 输出output

Input:你使用Inputs去获取数据到Logstash

Filterlogstash管道中间处理的设备。可以结合条件语句对符合标准的事件进行处理。

Outputlogstash管道的最后一个阶段。一个事件可以经过多个output。但是一旦所有输出处理完,该事件已经执行完。

每个阶段都由很多的插件配合工作,比如fileelasticsearchredis等等。

每个阶段也可以指定多种方式,比如输出既可以输出到elasticsearch中,也可以指定到stdout在控制台打印。

由于这种插件式的组织方式,使得logstash变得易于扩展和定制。

工作流程

Logstash agent监控并过滤日志,将过滤后的日志内容发给redislogstash index将日志收集在一起交给下一个。

5      Logstash pipeline

Logstash会持续监控被监控机器的日志,这为我们提供了极大的方便,我们可以实时看到机器的状态,并通过Kibana进行可视化。Logstash更擅长处理流式数据,而不是静态数据。

5.1      input plugin

你使用Inputs去获取数据到Logstash

Logstash提供了多种input导入方式,常用的有:fileexecheartbeat

5.2      filter plugin

logstash管道中间处理的设备。可以结合条件语句对符合标准的事件进行处理。

Logstash也提供了大量的导出方式,常用的有:kafkaelasticsearch

5.3      output plugin

logstash管道的最后一个阶段。一个事件可以经过多个output。但是一旦所有输出处理完,该事件已经执行完。

Logstash也提供了大量的导出方式,常用的有:kafkaelasticsearch等。

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      优势

对日志数据更好的语法分析功能;

更加灵活的日志存储方式;

附带搜索和目录功能;

易于安装、可扩展、性能良好等;

配置简易上手。LogstashRuby DSL设计,是目前业界最通用的配置语法设计;

集群线性扩展。不管是 Elasticsearch 集群还是 Logstash 集群都是可以线性扩展的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。