#yyds干货盘点#--ELK-logstash

Posted 流年_火星程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点#--ELK-logstash相关的知识,希望对你有一定的参考价值。

  • 什么是logstash

简单来说logstash就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景。

#yyds干货盘点#--ELK-logstash_logstash

从网上找到的一个图,这个很明显的介绍了logstash的input,output,fillters的详细功能,也可以看到对于logstash来说,input和output是必须的,fillter是可选的。针对于fillters的匹配规则以及表达式,自行查阅官方即可不多赘述了。

#yyds干货盘点#--ELK-logstash_elasticsearch_02

Logstash 配置

首先确保 ELK 所需服务都已正常开启:

  • sudo service redis-server start
  • # 启动 Elasticsearch
  • cd elasticsearch-7.4.1/bin
  • ./elasticsearch -d
  • # 启动 Kibana
  • cd kibana-7.4.1-linux-x86_64/bin
  • nohup ./kibana 2>&1 &

进入到此目录,执行下面一条命令:

  • $ cd logstash-7.4.1/bin
  • # 测试
  • $ ./logstash -e ‘input stdin output stdout codec=>json ’
  • hello robot

执行过程可能比较慢,需要耐心等待一会儿:

#yyds干货盘点#--ELK-logstash_nginx_03

可以看到,在终端输入内容后,会输出一条 json 格式规范的内容,这就是经过 Logstash 处理后的输出格式。结束进程。

我们只是简单输入了 ​​hello robot​​ ,但是经过 Logstash 的处理,默认添加几个字段,比如版本信息,时间信息,主机名等。

为了看的更清楚,以下展示了格式化后的命令:

input 
stdin

output
stdout
codec => json



参数讲解:

  • input:定义 Logstash 输入行为
  • output:定义 Logstash 输出行为
  • stdin :标准输入
  • stdout :标准输出
  • codec:指定输出的数据格式,这里指定为 json,常用的还有 rubydebug,multiline

执行的命令中,-e 参数表示 Logstash 直接从命令行读取配置信息。通过这种方式可以简单快速测试配置内容是否正确而不用编辑配置文件。

在 input 中,我们定义了一个标准输入,由于什么都没有,所以 Logstash 会从终端的标准输入中读取字符串,这也是为什么刚才在输入完命令后会出现等待输入的情况。

在 output 中,我们定义了一个标准输出,也就是说 Logstash 在处理完后会将结果从标准输出(终端)中输出,而 codec 字段,则说明了输出会遵循什么样的格式,这里定义的 codec 为 json,所以我们刚才看到了 json 格式的输出格式。下一步

Logstash 配置文件

我们先修改 nginx 的配置文件,指定日志存放的路径。

sudo vim /etc/nginx/conf.d/default.conf
# 在其中指定路径:access_log /home/robot/Code/elk/access.log;

#yyds干货盘点#--ELK-logstash_logstash_04

这里指定的是 Nginx 的访问日志存放路径。这个路径此时并不存在,所以需要提前创建相应的目录和文件,否则 Nginx 不能正常启动。

cd /home/robot/Code && mkdir elk && cd elk && touch
access.log

启动 Nginx web 服务器:

sudo service nginx stop
sudo service nginx start

在浏览器通过地址 localhost 访问 nginx 页面:

#yyds干货盘点#--ELK-logstash_logstash_05

然后在正式项目中,Logstash 的配置内容较多,在命令行配置很麻烦,通常需要创建配置文件。

进入 ​​/home/robot/logstash7.4.1​​:

cd /home/robot/logstash-7.4.1
mkdir conf.d && cd conf.d
vim logstash-shipper.conf

添加以下内容:

input 
stdin
file
path => "/home/robot/Code/elk/access.log"
start_position => beginning
codec => multiline
negate => true
pattern => ^\\d
what => previous



output
stdout
codec => rubydebug

elasticsearch
hosts => ["localhost:9200"]
index => "logstash-%+YYYY.MM.dd"



可以配置两种数据输入方式:标准输入,文件读取(Nginx 日志文件)。 我们这里指定了文件路径,读取开始位置,读取的格式,配置为从 nginx 日志文件中读取的输入方式。Logstash 采用 ​​tail -f filename​​ 的方式动态读取日志记录,读取内容时用到了一个 mutiline 的插件,这个插件的作用是将多行日志记录合并为一个日志事件。

mutiline 插件的一般配置格式:

multiline 
pattern => "pattern, a regexp"
negate => "true" or "false"
what => "previous" or "next"


  • ​pattern​​:指定正则表达式,输入的内容匹配这个表达式,用于确定输入的内容是属于前一个事件的内容还是新的事件的内容。
  • ​negate​​:正则表达式的否定形式。若为 true,表示不匹配指定的 pattern。
  • ​what​​:如果符合匹配的正则表达式,则应该将一行内容合并到前一行还是后一行。

首先根据 nginx 日志信息来确定需要配置的正则表达式:

$ cat /home/robot/Code/elk/access.log
127.0.0.1 - - [01/Nov/2019:17:11:06 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
127.0.0.1 - - [01/Nov/2019:17:11:19 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
127.0.0.1 - - [01/Nov/2019:17:11:20 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
127.0.0.1 - - [01/Nov/2019:17:11:20 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"

通过观察,我们可以发现符合的正则表达式为 ​​^[0-9a-zA-Z.:]+ - -​​ ,可以使用下面语句测试:

cat /home/robot/Code/elk/access.log|grep -E ^[0-9a-zA-Z.:]+ - -

#yyds干货盘点#--ELK-logstash_elasticsearch_06

可以看到确实是能够匹配的。

所以我们配置的多行处理方式为:

multiline 
negate => true
pattern => ^[0-9a-zA-Z.:]+ - -
what => previous


配置解释:匹配正则表达式的就是一条新的日志记录,不匹配的就属于上一条日志的内容。

配置文件中,也定义了两种输出方式:标准输出和输出到 Elasticsearch。如果要将数据输出到 Elasticsearch,需要配置 Elasticsearch 的主机名和端口号。同时,为每条日志都增加了一条自定义的索引。

最终完整的 ​​logstash-shipper.conf​​ 文件内容如下所示:

input 
stdin
file
path => "/home/robot/Code/elk/access.log"
start_position => "beginning"
codec => multiline
negate => true
pattern => ^[0-9a-zA-Z.:]+--
what => previous




output
stdout
codec => rubydebug

elasticsearch
hosts => ["localhost:9200"]
index => "logstash-%+YYYY.MM.dd"



执行命令检测配置文件是否正确:

cd logstash-7.4.1
bin/logstash -f conf.d/logstash-shipper.conf --config.test_and_exit

–config.test_and_exit 选项表示检测配置文件并报告错误(只是检测,不会真正执行)

需要等待一会儿执行完成:

#yyds干货盘点#--ELK-logstash_elasticsearch_07

配置没问题后,还是上面那条命令,去掉 ​​--config.test_and_exit​​ 选项,再次执行:

cd logstash-7.4.1
bin/logstash -f conf.d/logstash-shipper.conf
等待一会儿执行完成:

#yyds干货盘点#--ELK-logstash_logstash_08

此时 Logstash 运行在前台,如果使用快捷键 ​​ctrl+c​​ 就会结束当前进程,Logstash 就不会向 Elasticsearch 发送数据。

本节主要内容就是对 Logstash 的了解,理解它的工作流程和组件关系。Logstash 处理数据的三个流程:输入,过滤,输出。将无结构的数据解析并结构化为规范的数据,并发送到 Elasticsearch,用作后续分析。

以上是关于#yyds干货盘点#--ELK-logstash的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#简述chromeV8引擎垃圾回收

#yyds干货盘点# 设计模式之代理模式:cglib动态代理

#yyds干货盘点# 泛型通配符

#yyds干货盘点#linux命令--uname

#yyds干货盘点#linux命令--hdparm

#yyds干货盘点#C++ static