Logstash介绍
Logstash是一个开源数据收集引擎,具有实时管道功能。Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地。

集中、转换和存储你的数据
Logstash是一个开源的服务器端数据处理管道,可以同时从多个数据源获取数据,并对其进行转换,然后将其发送到你最喜欢的“存储”。(当然,我们最喜欢的是Elasticsearch)
输入:采集各种样式、大小和来源的数据
数据往往以各种各样的形式,或分散或集中地存在于很多系统中。Logstash 支持各种输入选择 ,可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。

过滤器:实时解析和转换数据
数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便更轻松、更快速地分析和实现商业价值。
Logstash 能够动态地转换和解析数据,不受格式或复杂度的影响:
- 利用 Grok 从非结构化数据中派生出结构
 - 从 IP 地址破译出地理坐标
 - 将 PII 数据匿名化,完全排除敏感字段
 - 整体处理不受数据源、格式或架构的影响
 

输出:选择你的存储,导出你的数据
尽管 Elasticsearch 是我们的首选输出方向,能够为我们的搜索和分析带来无限可能,但它并非唯一选择。
Logstash 提供众多输出选择,您可以将数据发送到您要指定的地方,并且能够灵活地解锁众多下游用例。

安装Logstash

首先,让我们通过最基本的Logstash管道来测试一下刚才安装的Logstash
Logstash管道有两个必需的元素,输入和输出,以及一个可选元素过滤器。输入插件从数据源那里消费数据,过滤器插件根据你的期望修改数据,输出插件将数据写入目的地。

接下来,允许Logstash最基本的管道,例如:
bin/logstash -e 'input { stdin {} } output { stdout {} }'
(画外音:选项 -e 的意思是允许你从命令行指定配置)
启动以后,下面我们在命令行下输入"hello world"

用Logstash解析日志
在上一小节中,你已经创建了一个基本的Logstash管道来测试你的Logstash设置。在现实世界中,一个Logstash管理会稍微复杂一些:它通常有一个或多个input, filter 和 output 插件。
在这一小节中,你将创建一个Logstash管道,并且使用Filebeat将Apache Web日志作为input,解析这些日志,然后将解析的数据写到一个Elasticsearch集群中。你将在配置文件中定义管道,而不是在命令行中定义管道配置。
在开始之前,请先下载示例数据。
配置Filebeat来发送日志行到Logstash
在你创建Logstash管道之前,你需要先配置Filebeat来发送日志行到Logstash。Filebeat客户端是一个轻量级的、资源友好的工具,它从服务器上的文件中收集日志,并将这些日志转发到你的Logstash实例以进行处理。Filebeat设计就是为了可靠性和低延迟。Filebeat在主机上占用的资源很少,而且Beats input插件将对Logstash实例的资源需求降到最低。
(画外音:注意,在一个典型的用例中,Filebeat和Logstash实例是分开的,它们分别运行在不同的机器上。在本教程中,Logstash和Filebeat在同一台机器上运行。)
关于Filebeat请参考《开始使用Filebeat》

第1步:配置filebeat.yml

filebeat.inputs:
- type: log
paths:
- /usr/local/programs/logstash/logstash-tutorial.log output.logstash:
hosts: ["localhost:5044"]

第2步:在logstash安装目录下新建一个文件first-pipeline.conf

(画外音:刚才说过了通常Logstash管理有三部分(输入、过滤器、输出),这里input下面beats { port => "5044" }的意思是用Beats输入插件,而stdout { codec => rubydebug }的意思是输出到控制台)
第3步:检查配置并启动Logstash
bin/logstash -f first-pipeline.conf --config.test_and_exit
(画外音:--config.test_and_exit选项的意思是解析配置文件并报告任何错误)
bin/logstash -f first-pipeline.conf --config.reload.automatic
(画外音:--config.reload.automatic选项的意思是启用自动配置加载,以至于每次你修改完配置文件以后无需停止然后重启Logstash)
第4步:启动filebeat
./filebeat -e -c filebeat.yml -d "publish"
如果一切正常,你将会在Logstash控制台下看到类似这样的输出:

用Grok过滤器插件解析日志
现在你有了一个工作管道,可以从Filebeat读取日志行。但是你可能已经注意到日志消息的格式并不理想。你想要解析日志消息,以便从日志中创建特定的、命名的字段。为此,您将使用grok filter插件。
grok 过滤器插件是Logstash中默认可用的几个插件之一。
grok 过滤器插件允许你将非结构化日志数据解析为结构化和可查询的数据。
因为 grok 过滤器插件在传入的日志数据中查找模式
为了解析数据,你可以用 %{COMBINEDAPACHELOG} grok pattern ,这种模式(或者说格式)的schema如下:

接下来,编辑first-pipeline.conf文件,加入grok filter,在你修改完以后这个文件看起来应该是这样的:

在你保存完以后,因为你已经启动了自动加载配置,所以你不需要重启Logstash来应用你的修改。但是,你确实需要强制Filebeat从头读取日志文件。为了这样做,你需要在终端先按下Ctrl+C停掉Filebeat,然后删除Filebeat注册文件。例如:
rm data/registr

然后重启Filebeat
./filebeat -e -c filebeat.yml -d "publish"
此时,再看Logstash控制台,输出可能是这样的:

用 Geoip 过滤器插件增强你的数据

然后,同样地,重启Filebeat
Ctrl+C rm data/registry ./filebeat -e -c filebeat.yml -d "publish"
再次查看Logstash控制台,我们会发现多了地理位置信息:

索引你的数据到Elasticsearch
在之前的配置中,我们配置了Logstash输出到控制台,现在我们让它输出到Elasticsearch集群。
编辑first-pipeline.conf文件,替换output区域为:
output {
    elasticsearch {
        hosts => [ "localhost:9200" ]
    }
}
在这段配置中,Logstash用http协议连接到Elasticsearch,而且假设Logstash和Elasticsearch允许在同一台机器上。你也可以指定一个远程的Elasticsearch实例,比如host=>["es-machine:9092"]
现在,first-pipeline.conf文件是这样的:

同样,保存改变以后,重启Filebeat
(画外音:首先,Ctrl+C终止Filebeat;接着rm data/registry删除注册文件;最后,./filebeat -e -c filebeat.yml -d "publish" 启动Filebeat)
好了,接下来启动Elasticsearch

(画外音:查看Elasticsearch索引,如果没有看到logstash的索引,那么重启Filebeat和Logstash,重启之后应该就可以看到了)
如果一切正常的话,可以在Elasticsearch的控制台日志中看到这样的输出:
[2018-08-11T17:35:27,871][INFO ][o.e.c.m.MetaDataIndexTemplateService] [Px524Ts] adding template [logstash] for index patterns [logstash-*]
[2018-08-11T17:46:13,311][INFO ][o.e.c.m.MetaDataCreateIndexService] [Px524Ts] [logstash-2018.08.11] creating index, cause [auto(bulk api)], templates [logstash], shards [5]/[1], mappings [_default_]
[2018-08-11T17:46:13,549][INFO ][o.e.c.m.MetaDataMappingService] [Px524Ts] [logstash-2018.08.11/pzcVdNxSSjGzaaM9Ib_G_w] create_mapping [doc]
[2018-08-11T17:46:13,722][INFO ][o.e.c.m.MetaDataMappingService] [Px524Ts] [logstash-2018.08.11/pzcVdNxSSjGzaaM9Ib_G_w] update_mapping [doc]
这个时候,我们再查看Elasticsearch的索引
请求:
curl 'localhost:9200/_cat/indices?v'
响应:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open bank 59jD3B4FR8iifWWjrdMzUg 5 1 1000 0 475.1kb 475.1kb
green open .kibana DzGTSDo9SHSHcNH6rxYHHA 1 0 153 23 216.8kb 216.8kb
yellow open filebeat-6.3.2-2018.08.08 otgYPvsgR3Ot-2GDcw_Upg 3 1 255 0 63.7kb 63.7kb
yellow open customer DoM-O7QmRk-6f3Iuls7X6Q 5 1 1 0 4.5kb 4.5kb
yellow open logstash-2018.08.11 pzcVdNxSSjGzaaM9Ib_G_w 5 1 100 0 251.8kb 251.8kb
可以看到有一个名字叫"logstash-2018.08.11"的索引,其它的索引都是之前建的不用管
接下来,查看这个索引下的文档
请求:
curl -X GET 'localhost:9200/logstash-2018.08.11/_search?pretty&q=response=200'
响应大概是这样的:
(画外音:由于输出太长了,这里截取部分)

{
    "_index" : "logstash-2018.08.11",
    "_type" : "doc",
    "_id" : "D_JhKGUBOuOlYJNtDfwl",
    "_score" : 0.070617564,
    "_source" : {
      "host" : {
        "name" : "localhost.localdomain"
      },
      "httpversion" : "1.1",
      "ident" : "-",
      "message" : "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
      "auth" : "-",
      "timestamp" : "04/Jan/2015:05:13:42 +0000",
      "input" : {
        "type" : "log"
      },
      "geoip" : {
        "postal_code" : "101194",
        "region_name" : "Moscow",
        "timezone" : "Europe/Moscow",
        "continent_code" : "EU",
        "city_name" : "Moscow",
        "country_code3" : "RU",
        "country_name" : "Russia",
        "ip" : "83.149.9.216",
        "country_code2" : "RU",
        "region_code" : "MOW",
        "latitude" : 55.7485,
        "longitude" : 37.6184,
        "location" : {
          "lon" : 37.6184,
          "lat" : 55.7485
        }
      },
      "@timestamp" : "2018-08-11T09:46:10.209Z",
      "offset" : 0,
      "tags" : [
        "beats_input_codec_plain_applied"
      ],
      "beat" : {
        "version" : "6.3.2",
        "hostname" : "localhost.localdomain",
        "name" : "localhost.localdomain"
      },
      "clientip" : "83.149.9.216",
      "@version" : "1",
      "verb" : "GET",
      "request" : "/presentations/logstash-monitorama-2013/images/kibana-search.png",
      "prospector" : {
        "type" : "log"
      },
      "referrer" : "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
      "response" : "200",
      "bytes" : "203023",
      "source" : "/usr/local/programs/logstash/logstash-tutorial.log",
      "agent" : "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\""
    }
  }

再来一个
请求:
curl -XGET 'localhost:9200/logstash-2018.08.11/_search?pretty&q=geoip.city_name=Buffalo'
响应:

{
  "took" : 37,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 2.6855774,
    "hits" : [
      {
        "_index" : "logstash-2018.08.11",
        "_type" : "doc",
        "_id" : "DvJhKGUBOuOlYJNtDPw7",
        "_score" : 2.6855774,
        "_source" : {
          "host" : {
            "name" : "localhost.localdomain"
          },
          "httpversion" : "1.1",
          "ident" : "-",
          "message" : "198.46.149.143 - - [04/Jan/2015:05:29:13 +0000] \"GET /blog/geekery/solving-good-or-bad-problems.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29 HTTP/1.1\" 200 10756 \"-\" \"Tiny Tiny RSS/1.11 (http://tt-rss.org/)\"",
          "auth" : "-",
          "timestamp" : "04/Jan/2015:05:29:13 +0000",
          "input" : {
            "type" : "log"
          },
          "geoip" : {
            "postal_code" : "14202",
            "region_name" : "New York",
            "timezone" : "America/New_York",
            "continent_code" : "NA",
            "city_name" : "Buffalo",
            "country_code3" : "US",
            "country_name" : "United States",
            "ip" : "198.46.149.143",
            "dma_code" : 514,
            "country_code2" : "US",
            "region_code" : "NY",
            "latitude" : 42.8864,
            "longitude" : -78.8781,
            "location" : {
              "lon" : -78.8781,
              "lat" : 42.8864
            }
          },
          "@timestamp" : "2018-08-11T09:46:10.254Z",
          "offset" : 22795,
          "tags" : [
            "beats_input_codec_plain_applied"
          ],
          "beat" : {
            "version" : "6.3.2",
            "hostname" : "localhost.localdomain",
            "name" : "localhost.localdomain"
          },
          "clientip" : "198.46.149.143",
          "@version" : "1",
          "verb" : "GET",
          "request" : "/blog/geekery/solving-good-or-bad-problems.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29",
          "prospector" : {
            "type" : "log"
          },
          "referrer" : "\"-\"",
          "response" : "200",
          "bytes" : "10756",
          "source" : "/usr/local/programs/logstash/logstash-tutorial.log",
          "agent" : "\"Tiny Tiny RSS/1.11 (http://tt-rss.org/)\""
        }
      },
。。。

(画外音:关于Elasticsearch可以查看另外一篇《Elasticsearch 快速开始》)
命令行启动Logstash
为了从命令行启动Logstash,用下面的命令:
bin/logstash [options]
下面的例子展示了启动Logstash,并制定配置定义在mypipeline.conf文件中:
bin/logstash -f mypipeline.conf
在命令行中设置的任何标志都会覆盖logstash.yml中的相应设置。但是文件本身的内容没有改变。
Command-Line Flags
--node.name NAME
指定Logstash实例的名字。如果没有指定的话,默认是当前主机名。
-f, --path.config CONFIG_PATH
从指定的文件或者目录加载Logstash配置。如果给定的是一个目录,则该目录中的所有文件将以字典顺序连接,然后作为一个配置文件进行解析。
-e, --config.string CONFIG_STRING
用给定的字符串作为配置数据,语法和配置文件中是一样的。
--modules
运行的模块名字
-l, --path.logs PATH
Logstash内部日志输出目录
--log.level LEVEL
日志级别
-t, --config.test_and_exit
检查配置语法是否正确并退出
-r, --config.reload.automatic
监视配置文件的改变,并且当配置文件被修改以后自动重新加载配置文件。
-config.reload.interval RELOAD_INTERVAL
为了检查配置文件是否改变,而拉去配置文件的频率。默认3秒。
--http.host HTTP_HOST
Web API绑定的主机。REST端点绑定的地址。默认是"127.0.0.1"
--http.port HTTP_PORT
Web API http端口。REST端点绑定的端口。默认是9600-9700之间。
--log.format FORMAT
指定Logstash写它自身的使用JSON格式还是文本格式。默认是"plain"。
--path.settings SETTINGS_DIR
设置包含logstash.yml配置文件的目录,比如log4j日志配置。也可以设置LS_SETTINGS_DIR环境变量。默认的配置目录是在Logstash home目录下。
-h, --help
打印帮助
Logstash介绍的更多相关文章
- Logstash 介绍
		
Logstash 介绍: Logstash 是一个开源的数据收集引擎具有实时管道能力, Logstash 可以动态的统一数据从不同的来源和使数据规范化到你选择的目的地. 当Logstash 起初驾驭创 ...
 - Logstash介绍及Input插件介绍
		
一.Logstash简介 Logstash是一个开源数据收集引擎,具有实时管道功能.Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地. Logstash管 ...
 - Logstash使用介绍
		
Logstash介绍 Logstash是一个数据收集处理转发系统,是 Java开源项目. 它只做三件事: 数据输入 数据加工(不是必须的):如过滤,改写等 数据输出 下载安装 logstash是基 ...
 - logstash搭建日志追踪系统
		
前言 开始博客之前,首先说下10月份没写博客的原因 = =. 10月份赶上国庆,回了趟老家休息了下,回来后自己工作内容发生了点改变,开始搞一些小架构的东西以及研究一些新鲜东西,当时我听到这个消息真的是 ...
 - (转)开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)入门学习资源索引
		
Github, Soundcloud, FogCreek, Stackoverflow, Foursquare,等公司通过elasticsearch提供搜索或大规模日志分析可视化等服务.博主近4个月搜 ...
 - 开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)入门学习资源索引
		
from: http://www.w3c.com.cn/%E5%BC%80%E6%BA%90%E5%88%86%E5%B8%83%E5%BC%8F%E6%90%9C%E7%B4%A2%E5%B9%B ...
 - Logstash之二:原理
		
一.Logstash 介绍 Logstash 是一款强大的数据处理工具,它可以实现数据传输,格式处理,格式化输出,还有强大的插件功能,常用于日志处理. 二.工作流程 Logstash 工作的三个阶段: ...
 - logstash部署及基本语法(二)
		
一.logstash介绍 Logstash是一个开源的数据收集引擎,可以水平伸缩,而且logstash是整个ELK当中拥有最多插件的一个组件,其可以接收来自不同源的数据并统一输入到指定的且可以是不同目 ...
 - CentOS7 logstash配置部署
		
(1)logstash介绍 `Logstash是一个开源的数据收集引擎,可以水平伸缩,而且logstash是整个ELK当中拥有最多插件的一个组件,其可以接收来自不同源的数据并统一输入到指定的且可以是不 ...
 - 利用Logstash plugins做更多的事情
		
1. 引言 之前一篇文章<Logstash 介绍及linux下部署>,我们实现了logstash的安装以及简单的控制台标准输入输出测试,那么logstash能不能做更多的事情呢?答案是肯定 ...
 
随机推荐
- cnblogs的GitHub同步markdown文件的blog如何识别文章的唯一性(身份ID如何判定)
			
本篇blog是写在GitHub的对应的仓库中的. cnblogs会给终身用户提供一个把GitHub仓库中的markdown文件同步到cnblogs上的一个服务,本文就是使用这个服务同步到个人blog地 ...
 - Mysql数据库个人整理笔记
			
数据类型 tinyint/smallint/int/bigint float double char/varchar date/time/datetime/timestamp DDL 数据库 crea ...
 - 推荐7款程序员常用的API管理工具
			
前言 现如今API接口的编写与调试已成为开发人员不可或缺的技能,工欲善其事,必先利其器,选择一款优秀的API管理工具显得尤为重要.本文大姚给大家推荐7款程序员常用的API管理工具,大家可以根据自身和团 ...
 - 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-4-启动浏览器-基于Maven(详细教程)
			
1.简介 上一篇文章,宏哥已经在搭建的java项目环境中添加jar包实践了如何启动浏览器,今天就在基于maven项目的环境中给小伙伴们或者童鞋们演示一下如何启动浏览器. 2.eclipse中新建mav ...
 - 哪些网站可以申请免费的纯IP地址https证书
			
申请免费纯IP地址HTTPS证书,您可以按照以下步骤进行: 一.选择证书颁发机构(CA) 目前,虽然一些大型云服务提供商(如阿里云.华为云.腾讯云等)已经取消了免费一年期SSL证书的供应,但仍有一些C ...
 - NZOJ 模拟赛7
			
T1 字符串 小X十分热爱学习.有一天,他刚学完"漂亮的k字符串"的概念:给定长度为n的字符串和整数k,k能整除n,如果该字符串满足以下两个条件: s是一个回文串,即对于任意1≤i ...
 - CommonsCollections3(基于ysoserial)
			
环境准备 JDK1.7(7u80).commons-collections(3.x 4.x均可这里使用3.2版本).javassist(3.12.1.GA) JDK:https://repo.huaw ...
 - php 如何实现 git diff
			
无意间想到这个问题,如何用php来实现git diff,如果实现了这个功能,岂不是能够使用php对在线编辑文件的功能做更进一步的优化和提升? 查了一下还真有这样的库,话不多说,开始执行 compose ...
 - SQL注入sqlmap联动burpsuite之burp4sqlmap++插件
			
目录 sqlmap和burpsuite介绍 sqlmap4burp++介绍 sqlmap4burp++的使用 小插曲:sqlmap报错文件不存在怎么办? 官方扩展CO2之SQLmapper sqlma ...
 - 如何在wpf窗口中播放PPT。
			
前一段时间接到一个需求(大概内容讲一下): 将PPT播放窗口嵌入到我们的系统中,用自己系统控制PPT的播放,在PPT页面上可以手写将手写内容记录下来. 一开始,对于WPF还是一个彩笔的我是懵逼的.后来 ...