Elasticsearch学习(四)——Logstash安装与使用

在前面我们讲解了Elasticsearch的Kibana插件,对于我们实际使用来说可能Kibana并不会使用到,但是Logstash插件大部分的情况下都会使用,那Logstash到底是啥?今天我们就来介绍一下。

一、Logstash

1、Logstash是什么?

官方介绍说Logstash是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的 “存储库” 中。(我们的存储库当然是 Elasticsearch。)

logstash

通过200多个插件,Logstash可以接受几乎各种各样的数据。包括日志、网络请求、关系型数据库、传感器或物联网等等。

简单点来说就是Logstash是采集数据的工具,它可以从数据库、文件、MQ等中获取数据,然后放入到我们的搜索引擎(Elasticsearch)当中,供我们快速查询到需要的数据。

2、安装Logstash

注意:Logstash安装需要Java8或Java11版本。

Logstash的安装也支持多种方式:

二进制安装

下载二进制文件安装,这里是最新版本下载,如果要选择过去的版本,历史版本

直接下载二进制文件,解压后进入bin目录运行即可。

在Linux环境中,我们可以通过包管理进行安装,例如Unbuntu中的apt、以及CentOS中的yum。

APT安装

安装公共签名key

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https

添加依赖

echo "deb https://artifacts.elastic.co/packages/7.0/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.0.list

安装Logstash

sudo apt-get update && sudo apt-get install logstash
YUM安装

安装公共签名key

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

在/etc/yum.repos.d/目录下,新建文件logstash.repo,内容如下:

[logstash-7.0]
name=Elastic repository for 7.0 packages
baseurl=https://artifacts.elastic.co/packages/7.0/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

安装Logstash

sudo yum install logstash

注意:Logstash最好也是不用root用户安装、启用。

3、测试Logstash

我们知道Logstash是基于管道流的,所有它需要两个必须元素input和output,还有一个可选的filter。输入input插件可以自定义获取数据源,过滤filter插件可以自定义修改数据,输出output插件可以让自定义写入数据到目的地。

进入Logstash目录,执行测试命令,如下:

bin/logstash -e 'input { stdin { } } output { stdout {} }'

这里我们通过设置-e参数来运行Logstash,-e参数表示允许Logstash直接通过命令行接受配置。能够让我们快速测试看是否有错误。

当出现“Pipeline main started”字样后,我们输入hello world,可以看到如下的输出信息。
test

按住CTRL-D可以结束Logstash进程。

二、Logstash的简单使用

1、Logstash如何工作?

在前面我们大致熟悉了一下Logstash的基本流程,那么Logstash到底是如果工作的呢?我们来分析一下。

logstash原理

Logstash事件处理管道有三个阶段:输入→过滤器→输出。输入生成事件,过滤器修改它们,输出将它们发送到其他地方。输入和输出支持编解码器,能够在数据进入或退出管道时对数据进行编码或解码,而无需使用单独的过滤器。

输入(Inputs):

使用输入将数据导入到Logstsh。常用的包括:

  • file:从文件系统上的文件读取,与UNIX命令非常相似 tail -0F
  • syslog:在已知端口514上侦听syslog消息并根据RFC3164格式进行解析
  • redis:使用redis通道和redis列表从redis服务器读取。
  • beats:处理 Beats发送的事件。

还可以从其他系统获取数据,更多支持可以查看输入插件列表

过滤器(Filters):

过滤器是Logstash管道中的中间处理设备。可以将过滤器与条件组合,以便在事件满足特定条件时对其执行操作。一些有用的过滤包括:

  • grok:解析并构造任意文本。Grok是目前Logstash中将非结构化日志数据解析为结构化和可查询内容的最佳方式。有了内置于Logstash的120种模式,您很可能会找到满足您需求的模式!
  • mutate:对事件字段执行常规转换。您可以重命名,删除,替换和修改事件中的字段。
  • drop:完全删除事件,例如调试事件。
  • clone:制作事件的副本,可能添加或删除字段。
  • geoip:添加有关IP地址的地理位置的信息(也在Kibana中显示惊人的图表!)

更多支持,查看过滤插件列表

输出(Outputs):

输出是Logstash管道的最后阶段。事件可以通过多个输出,但是一旦所有输出处理完成,事件就完成了它的执行。一些常用的输出包括:

  • elasticsearch:将事件数据发送到Elasticsearch。Elasticsearch方便且易于查询的格式保存数据,是我们不二选择。
  • file:将事件数据写入磁盘上的文件。
  • graphite:将事件数据发送到graphite,这是一种用于存储和绘制指标的流行开源工具。http://graphite.readthedocs.io/en/latest/
  • statsd:将事件数据发送到statsd,这是一种“侦听统计信息,如计数器和定时器,通过UDP发送并将聚合发送到一个或多个可插入后端服务”的服务。如果您已经在使用statsd,这可能对您有用!

更多支持,查看输出插件列表

编解码器(Codecs):

编解码器基本上是流过滤器,可以作为输入或输出的一部分。使用编解码器可以轻松地将消息传输与序列化过程分开。流行的编解码器包括json,msgpack和plain (文本)。

  • json:以JSON格式编码或解码数据。
  • multiline:将多行文本事件(如java异常和堆栈跟踪消息)合并到一个事件中。

更多支持,查看编解码插件列表

2、Logstash实例

我们创建一个logstash-simple.conf文件,内容如下:

input { stdin { } }
output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

这里的意思是,我们将输入的信息输出到elasticsearch中显示,同时也输出到控制台中显示。即这里我们使用了多重输出。

接着我们输入命令:

 bin/logstash  -f logstash-simple.conf

-f为指定配置文件,logstash-simple.conf为配置文件加上具体路径即可。

运行完毕后,我们在命令端输出hello anumbrella内容,可以查看到终端内容显示出来了。

example

同时elasticsearch-head中我们可以查看到先前输入的数据。

elasticsearch-head
这里便完成了Logstash获取数据,然后存储到Elasticsearch中的基本操作。

接着我们再新建一个logstash-filter.conf文件,如下:

input { stdin { } }

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
}

output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

这里我们添加了filter进行过滤匹配。

同理运行Logstash:

bin/logstash -f logstash-filter.conf

待启动完毕后,我们在终端输入下面的信息:

127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"

结果如下:
logstash2
在这里Logstash(使用了grok过滤器)能够将一行的日志数据(Apache的"combined log"格式)分割设置为不同的数据字段。这一点对于日后解析和查询我们自己的日志数据非常有用。更多详细配置可以查看Logstash grok patterns

前面的实例我们都是从命令端输入然后输出数据,这里我们再新建一个logstash-apache.conf内容如下,主要是配置了从文件中读取日志信息。

input {
  file {
    path => "/tmp/access_log"
    start_position => "beginning"
  }
}

filter {
  if [path] =~ "access" {
    mutate { replace => { "type" => "apache_access" } }
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
  }
  stdout { codec => rubydebug }
}

接着我们在/tmp目录下新建access_log文件,添加内容如下:

71.141.244.242 - kurt [18/May/2011:01:48:10 -0700] "GET /admin HTTP/1.1" 301 566 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
134.39.72.245 - - [18/May/2011:12:40:18 -0700] "GET /favicon.ico HTTP/1.1" 200 1189 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; .NET4.0C; .NET4.0E)"
98.83.179.51 - - [18/May/2011:19:35:08 -0700] "GET /css/main.css HTTP/1.1" 200 1837 "http://www.safesand.com/information.htm" "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"

再次运行启动Logstash,

bin/logstash -f logstash-apache.conf

我们可以查看到apache的日志数据已经导入到ES中了,在终端也输出了相应内容。这里Logstash会按照你的配置读取,处理指定的文件,任何后添加到文件的内容也会被捕获处理最后保存到ES中。此外,数据中type的字段值会被替换成"apache_access"(这个功能在配置中已经指定)。

example2
查看elasticsearch中保存的数据,如下:
example2

除此之外,我们还可以配置正则匹配所有文件,比如:

input {
  file {
    path => "/tmp/*_log"
...

这里我们可以监控error日志和access日志等不同类型的日志信息。

我们可以在过滤器里面通过条件判断来处理不同的输出文件,比如我们更改上面logstash-apache.conf文件如下:

input {
  file {
    path => "/tmp/*_log"
  }
}

filter {
  if [path] =~ "access" {
    mutate { replace => { type => "apache_access" } }
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
    date {
      match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
  } else if [path] =~ "error" {
    mutate { replace => { type => "apache_error" } }
  } else {
    mutate { replace => { type => "random_logs" } }
  }
}

output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

该type字段标记所有事件,但实际上并不解析error或random文件。有很多类型的错误日志,应该如何标记,这个实际上取决于我们正在使用的日志。

我们还可以监控端口,比如Syslog日志。

Syslog是Logstash最常见的用例之一,它处理得非常好(只要日志行大致符合RFC3164)。Syslog是事实上的UNIX联网日志记录标准,它将消息从客户端计算机发送到本地文件,或通过rsyslog发送到集中式日志服务器。

还是一样的,这里我们新建logstash-syslog.conf文件,内容如下:

input {
  tcp {
    port => 5000
    type => syslog
  }
  udp {
    port => 5000
    type => syslog
  }
}

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

这里我们监控了TCP 和UDP协议上端口5000的系统日志信息作为Logstash的输入来源。

执行logstash:

bin/logstash -f logstash-syslog.conf

通常,客户端计算机将连接到端口5000上的Logstash实例并发送其消息。对于这个例子,我们只是telnet到Logstash并输入一个日志行(类似于我们之前在STDIN中输入日志行的方式)。打开另一个命令窗口以与Logstash syslog输入交互并输入以下命令:

telnet localhost 5000

接着在命令窗口输入下面日志信息,模拟交互过程。

Dec 23 12:11:43 louis postfix/smtpd[31499]: connect from unknown[95.75.93.154]
Dec 23 14:42:56 louis named[16000]: client 199.48.164.7#64817: query (cache) 'amsterdamboothuren.com/MX/IN' denied
Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)
Dec 22 18:28:06 louis rsyslogd: [origin software="rsyslogd" swVersion="4.2.0" x-pid="2253" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.

我们在终端可以查看到相关信息输出:

example3

到此Logstash的基本使用到此结束,当然还有更多用法,会在后面的文章再进行介绍。

参考

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值