Logstash简介
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
https://www.kancloud.cn/aiyinsi-tan/logstash/849518
Logstash Introduction
Logstash 是一个实时的管道式开源日志收集引擎。Logstash可以动态的将不同来源的数据进行归一并且将格式化的数据存储到你选择的位置。对你的所有做数据清洗和大众化处理,以便做数据分析和可视化。
我们对Logstash的日志收集做了大量的创新,但它的能力远不止收集日志这么简单。通过输入、过滤和输出插件Logstash可以对任何类型的事件丰富和转换,通过本地编码器还可以进一步简化此过程。Logstash通过大量的多样化数据来提升你的洞察力。
The Power of Logstash
Elasticsearch或其他更多应用的收集器
水平可扩展的数据处理管道和强大的Elasticsearch、Kibana组合协同工作。
插件式架构
混合、匹配和编排不同的输入、过滤器和输出,以便在管道协调中发挥作用。(原文:Mix, match, and orchestrate different inputs, filters, and outputs to play in pipeline harmony。个人认为其含义应该为:在输入、过滤、输出的管道中协调混合、过滤和匹配。)
Community-extensible and developer-friendly plugin ecosystem
超过200个可用插件,加上你自己创造和贡献的灵活性。(根据标题的意思应该是要表达可以根据需要自己灵活创建插件,原文如下:Over 200 plugins available, plus the flexibility of creating and contributing your own)
static/images/logstash.png
Analysis:分析
Archiving:归档
Monitoring:监控
Alerting:报警
Logstash Loves Data
收集越多知道的越多,Logstash欢迎任意形式和大小的数据。
Logs and Metrics(日志和指标)
一切从哪里开始。
处理所有类型的日志数据
轻松收集大量web日志如:Apache,和应用程序日志如:log4j for java
捕获许多其他日志格式如:syslog,网络和防火墙日志,以及更多类型
享受和Filebeat互补的安全的日志转发能力。
通过TCP和UDP从Ganglia,collectd,NetFlow,JMX和其他众多的基础架构和应用平台收集指标。
The Web
Unlock the World Wide Web.
将HTTP requests转换成事件
如Twitter用来做社会感情分析(只翻译了后半句,前半句实在整不出来啥意思。原文:Consume from web service firehoses like Twitter for social sentiment analysis)
支持GitHub,HipChat,JIRA和无数其他应用程序的Webhook。
启用多个监控报警用例(原文:Enables many Watcher alerting use cases)
按需轮询 HTTP endpoints来创建事件
从网络应用程序接口捕获健康、性能、指标等其他类型的数据。
Perfect for scenarios where the control of polling is preferred over receiving。(不会,大意是说他的最佳使用场景。)
Data Stores and Streams
发掘你的数据的更多价值。
使用JDBC接口从任何关系型或非关系型数据库存储总更好的理解你的数据。
从消息队列中统一不同的数据流。如:Kafka,RabbitMQ,Amazor SQS
Sensors and loT
探索其他更广泛的数据
在这个技术大爆炸的时代,通过获取和分析连接在这个庞大的物联网世界上的传感器获取的数据释放了无数的用例。
从移动设备到智能家庭、车联网、健康传感器以及其他的行业应用,Logstash也是最常见的事件收集器支柱。
Easily Enrich Everything
更好的数据意味着更好的知识。通过清洗和转换数据来提升实时洞察数据的能力。Logstash提供了许多聚合和转换以及模式匹配、地理映射和动态查找功能。
Grok是Logstash基本的过滤器,被广泛的用于将非结构化的数据结构化。享受其为致力于快速解决Web、System、Networking和其他类型的事件格式附带的丰富的集成模式,
扩展你的视野通过从IP地址解析地理坐标,将复杂的日期规范化展示,简化K/V数据和CSV数据,指纹(匿名)敏感信息。并进一步从本地或Elasticsearch查询中丰富你的数据。(原文:Expand your horizons by deciphering geo coordinates from IP addresses, normalizing date complexity, simplifying key-value pairs and CSV data, fingerprinting(anonymizing) sensitive information, and further enriching your data with local lookups or Elasticsearch queries.)
编码器通常用于简化对JSON和多行事件等常见事件结构的处理。
安装Logstash
使用下面的命令检查你的Java版本:
java -version
执行sudo apt-get update
准备好之后使用下面的明星安装:
sudo apt-get update && sudo apt-get install logstash
查看运行Logstash查看如何以系统服务管理Logstash。
YUM
下载并安装公钥:
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
在/etc/yum.repos.d/
目录下创建一个.repo
结尾的文件,内容如下:
[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
准备好之后运行下面的命令来安装:
sudo yum install logstash
储存你的第一个事件
首先,让我们运行一个最基本的Logstash管道来确保你的Logstash运行正常。
一个Logstash管道有两个必须的组件,input
和output
,除此之外还有一个可选的组件filter
。input插件将数据从源读入,filter插件按照你的定义处理数据,最后通过output插件写入到目的地。
参照如下示例来运行最基本的Logstash管道来检查Logstash的安装:
cd logstash-6.4.3
bin/logstash -e 'input { stdin { } } output { stdout {} }'
NOTE:
bin
目录的位置因平台而异,查看Directory layout来找到你系统上的bin/logstash
。(如果使用yum进行安装,通常尝试直接执行logstash -e 'input { stdin { } } output { stdout {} }'
,如果使用二进制安装,则bin目录位于你解压的目录下。)
使用-e
选项允许你在命令行快速配置而不必修改配置文件,这个示例将从stdin
来读取你的输入,并将输出以结构化的方式输出至stdout
。(就是从命令行读取,在终端上输出。)
Logstash启动之后你可以在屏幕上看到"Pipeline main started",输入hello world
并回车:
hello world
2013-11-21T01:22:14.405+0000 0.0.0.0 hello world
通过Logstash解析日志
上面的示例中你已经创建了一个最基本的Logstash管道来测试你的Logstash,在实际的情形中,Logstash通常面临着更加复杂的场景:一个或多个input、filter和output插件。
本段,你将创建一个Logstash管道,使用Filebeat采集的Apache日志作为input,从日志中解析特殊字段,然后将解析后的数据写入一个Elasticsearch集群。这次你将定义一个配置文件,而不是在命令行中设定。
在这里下载示例数据,以便我们可以开始。
配置Filebeat来发送日志到Logstash
在创建Logstash管道之前,你需要配置Filebeat来将日志发送到Logstash。Filebeat是一个轻量的、友好的日志收集客户端,它从你服务器上的文件中收集日志,并转发到Logstash以进行实时处理。Filebeat是为可靠性和低延迟设计的。Filebeat可以在你的主机上占用更少的资源,使用Beats input
插件将让你的Logstash实例的资源使用降到最低。
NOTE:在一个典型的使用场景中,Filebeat运行在和Logstash不同的单独的主机上,在这个演示的实例中我们将Logstash和Filebeat运行在同一台主机上。
默认情况下Logstash会安装Beats input
插件。Beats input插件允许Logstash接收来自Elastic Beats框架的事件,这意味着任何基于Beats框架的Beat written如Packetbeat和Metricbeta都可以给Logstash发送事件。
要在你的数据源主机上安装适合的Filebeat,可以在这里下载。你也可以在这里查看Beats的安装文档。
安装完成之后你需要进行一些配置。在你的安装目录中找到并打开filebeat.yml
文件,然后使用下面的内容替换其中的内容。确保paths
指向下载的测试用的Apache日志文件logstash-tutorial.log
。
filebeat.prospectors:
- type: log
paths:
- /path/to/file/logstash-tutorial.log ①
output.logstash:
hosts: ["localhost:5044"]
① 文件或目录的绝对路径。(原文:Absolute path to the file or files that Filebeat processes.)
保存更改。
为了更加简单,这里不用配置TLS/SSL。在生产中,通常需要配置这些。
在数据源的主机上执行下面的命令来运行Filebeat:
sudo ./filebeat -e -c filebeat.yml -d "publish"
NOTE:如果你以root的身份运行Filebeat,你需要更改配置文件的所有权.(参考:Config File OwnerShip and Permissions)。
Filebeat使用5044进行连接,在Logstash启动Beats插件之前,Filebeat不会收到任何响应,所以此时你看到的任何连接此端口失败的消息都是正常的。
配置Logstash使用Filebeat作为输入
接下来,你将创建一个Logstash管道使用Beats input插件接收来自Beats的事件。
下面是一个配置文件的框架:
# The # character at the beginning of a line indicates a comment. Use
# comments to describe your configuration.
input {
}
# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }
output {
}
这个框架没有任何功能,因为在input 和 output 没有定义任何选项。
在Logstash的home目录下创建一个文件,名为first-pipeline.conf
,将上述内容复制进去。(Logstash的home目录应该是指Logstash安装目录。)
接下来,在first-pipeline.conf
文件中的input
配置段添加以下内容来使用Beats input 插件:
beats {
port => "5044"
}
你可以稍后配置Elasticsearch。现在,将下面的内容填入到配置文件中的output
配置段。其作用是在你运行Logstash的时候将输出结果输出到stdout。
stdout { codec => rubydebug }
完成之后first-pipeline.conf
的内容应该如下:
input {
beats {
port => "5044"
}
}
# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }
output {
stdout { codec => rubydebug }
}
你可以使用下面的命令来检查你的配置文件:
bin/logstash -f first-pipeline.conf --config.test_and_exit
--config.test_and_exit
选项会分析你的配置文件并将其中的错误输出。
如果配置文件通过了检查,你可以使用下面的命令来启动Logstash:
bin/logstash -f first-pipeline.conf --config.reload.automatic
--config.reload.automatic
选项可以让Logstash在你修改配置文件之后重载而不必重新启动。
当Logstash启动之后,你可能会看到一到多条关于忽略pipelines.yml
文件的警告信息。你可以忽略这些警告。pipelines.yml
文件是用来在一个Logstash示例中运行多个管道使用的。在这个演示的示例中,你只运行一个管道。
如果运行正确你应该能在屏幕上看到如下的输出信息:
{
"@timestamp" => 2017-11-09T01:44:20.071Z,
"offset" => 325,
"@version" => "1",
"beat" => {
"name" => "My-MacBook-Pro.local",
"hostname" => "My-MacBook-Pro.local",
"version" => "6.0.0"
},
"host" => "My-MacBook-Pro.local",
"prospector" => {
"type" => "log"
},
"source" => "/path/to/file/logstash-tutorial.log",
"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\"",
"tags" => [
[0] "beats_input_codec_plain_applied"
]
}
...
使用Grok Filter插件解析Web Logs
现在你已经有了一个正常工作的从Filebeat读取日志的管道。但是,你知道日志的格式并不理想。你希望解析这些日志文件中的特殊字段。为了实现这个,你需要用到grok
filter插件。
Grok filter插件是少数Logstash默认可以使用的插件之一。更多关于管理Logstash插件的信息,参考reference documentation。
Grok
插件可以将非结构化的数据转换为高质量的结构化数据。
由于grok
插件从传入的日志中进行匹配查找,所以需要你根据自己感兴趣的数据来配置插件。如典型的Web服务日志如下:
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"
很容易辨认出最开始的是IP地址,方括号中的是时间标签。对于Apache日志你可以使用%{COMBINEDAPACHELOG}
来将数据解析成如下结构。
Information | Field Name |
---|---|
IP Address | clientip |
User ID | ident |
User Authentication | auth |
timestamp | timestamp |
HTTP Verb | verb |
Request body | request |
HTTP Version | httpversion |
HTTP Status Code | response |
Bytes served | bytes |
Referrer URL | referrer |
User agent | agent |
TIP:如果在构建Grok匹配模式上需要帮助,你可以使用Grok Debugger。Grok Debugger是基本许可下的X-Pack的一个附加特性,可以免费使用。
编辑first-pipeline.conf
文件并使用下面的内容替换其中的filter
字段:
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
完成之后first-pipeline.conf
中的内容应该如下:
input {
beats {
port => "5044"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
output {
stdout { codec => rubydebug }
}
保存更改,由于已经开启了自动重载配置文件,因此你不必重新启动Logstash来使配置生效。但是你需要让Filebeat强制从头开始读取日志文件。在对应的终端上使用Ctrl+C组合键来关闭Filebeat。然后删除Filebeat的registry文件,命令如下:
sudo rm data/registry
Filebeat的registry文件保存了它读取的文件的状态,删除之后可以强制让Filebeat重新从头读取这些文件。
然后使用下面的命令重启Filebeat:
sudo ./filebeat -e -c filebeat.yml -d "publish"
你可能需要等待一小会儿如果Filebeat等待Logstash重读配置文件的话。
在Logstash完成重读并匹配完成之后,事件将用JSON的格式表示如下:
{
"request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
"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\"",
"offset" => 325,
"auth" => "-",
"ident" => "-",
"verb" => "GET",
"prospector" => {
"type" => "log"
},
"source" => "/path/to/file/logstash-tutorial.log",
"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\"",
"tags" => [
[0] "beats_input_codec_plain_applied"
],
"referrer" => "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
"@timestamp" => 2017-11-09T02:51:12.416Z,
"response" => "200",
"bytes" => "203023",
"clientip" => "83.149.9.216",
"@version" => "1",
"beat" => {
"name" => "My-MacBook-Pro.local",
"hostname" => "My-MacBook-Pro.local",
"version" => "6.0.0"
},
"host" => "My-MacBook-Pro.local",
"httpversion" => "1.1",
"timestamp" => "04/Jan/2015:05:13:42 +0000"
}
需要注意的是原本的消息内容会被保留,但消息同时也会被分割成不同的字段。
使用GeoIP插件丰富你的数据
除了解析日志以便于搜索,filter插件还可以从现有的数据中进行扩展。举个例子,geoip
插件可以从IP地址获取物理位置信息并将其添加到日志中。
在first-pipeline.conf
文件的filter
字段中添加以下内容来使用geoip
filter插件:
geoip {
source => "clientip"
}
geoip
插件的配置需要你指定包含要查找的IP地址的源字段的名称。在示例中,clientip
字段包含IP地址。
因为filter是按照顺序进行解析,所以配置文件中的geoip
字段要在grok
字段之后且这两个字段都要在filter
字段中
当你做完之后,first-pipeline.conf
文件中的内容应该如下:
input {
beats {
port => "5044"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
geoip {
source => "clientip"
}
}
output {
stdout { codec => rubydebug }
}
保存设置,和之前一样强制停止Filebeat然后删除registry文件,然后使用下面的命令重启Filebeat:
sudo ./filebeat -e -c filebeat.yml -d "publish"
注意事件中现在已经包含了物理位置信息:
{
"request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
"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\"",
"geoip" => {
"timezone" => "Europe/Moscow",
"ip" => "83.149.9.216",
"latitude" => 55.7485,
"continent_code" => "EU",
"city_name" => "Moscow",
"country_name" => "Russia",
"country_code2" => "RU",
"country_code3" => "RU",
"region_name" => "Moscow",
"location" => {
"lon" => 37.6184,
"lat" => 55.7485
},
"postal_code" => "101194",
"region_code" => "MOW",
"longitude" => 37.6184
},
...
将你的数据索引到Elasticsearch
现在web日志已经按照字段进行分割,你已经准备好将数据写入Elasticsearch。
TIP:你可以在你自己的硬件上运行Elasticsearch,也可以使用我们的Elastic云上的Elasticsearch主机服务。AWS和GCP都提供了Elasticsearch服务。免费试用一下。
Logstash可以将数据索引到Elasticsearch集群。编辑first-pipeline.conf
文件中的output
字段,内容如下:
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
这个配置中,Logstash使用HTTP协议连接Elasticsearch。上面的示例中Logstash和Elasticsearch运行在相同 的实例中。你也可以指定一个远程Elasticsearch实例通过配置hosts
如:hosts => ["es-machine:9200"]
。
到这里,你的first-pipeline.conf
包含input,filter,和output配置,没问题的话,应该是下面这样:
input {
beats {
port => "5044"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
geoip {
source => "clientip"
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
保存配置,像之前一样强制中止Filebeat,删除registry文件,然后使用下面的命令重启Filebeat:
sudo ./filebeat -e -c filebeat.yml -d "publish"
测试你的管道
现在你的Logstash已经将数据存储到Elasticsearch集群中,你可以在Elasticsearch集群中进行查询。
尝试在Elasticsearch中查询grok
filter插件创建的字段。用YYYY.MM.DD格式的当前时间替换下面的$DATE:
curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=response=200'
NOTE:数据使用的索引名称基于UTC时间,并非Logstash运行的当地时间。如果查询返回
index_not_found_exception
,确保logstash-$DATE
对应的名字是正确的索引名。可以使用这个查询指令来查看所有可用的索引:curl 'localhost:9200/_cat/indices?v'
应该会返回多个命中结果。如下:
{
"took": 50,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 98,
"max_score": 2.793642,
"hits": [
{
"_index": "logstash-2017.11.09",
"_type": "doc",
"_id": "3IzDnl8BW52sR0fx5wdV",
"_score": 2.793642,
"_source": {
"request": "/presentations/logstash-monitorama-2013/images/frontend-response-codes.png",
"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"""",
"geoip": {
"timezone": "Europe/Moscow",
"ip": "83.149.9.216",
"latitude": 55.7485,
"continent_code": "EU",
"city_name": "Moscow",
"country_name": "Russia",
"country_code2": "RU",
"country_code3": "RU",
"region_name": "Moscow",
"location": {
"lon": 37.6184,
"lat": 55.7485
},
"postal_code": "101194",
"region_code": "MOW",
"longitude": 37.6184
},
"offset": 2932,
"auth": "-",
"ident": "-",
"verb": "GET",
"prospector": {
"type": "log"
},
"source": "/path/to/file/logstash-tutorial.log",
"message": """83.149.9.216 - - [04/Jan/2015:05:13:45 +0000] "GET /presentations/logstash-monitorama-2013/images/frontend-response-codes.png HTTP/1.1" 200 52878 "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"""",
"tags": [
"beats_input_codec_plain_applied"
],
"referrer": """"http:/