得意犹堪夸世俗,诏黄新湿字如鸦。这篇文章主要讲述#yyds干货盘点#--ELK-logstash相关的知识,希望能为你提供帮助。
- 什么是logstash
【#yyds干货盘点#--ELK-logstash】
从网上找到的一个图,这个很明显的介绍了logstash的input,output,fillters的详细功能,也可以看到对于logstash来说,input和output是必须的,fillter是可选的。针对于fillters的匹配规则以及表达式,自行查阅官方即可不多赘述了。
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 ‘inputstdinoutputstdout codec=> json ’
- hello robot
可以看到,在终端输入内容后,会输出一条 json 格式规范的内容,这就是经过 Logstash 处理后的输出格式。结束进程。
我们只是简单输入了 ?
?hello robot?
?
,但是经过 Logstash 的处理,默认添加几个字段,比如版本信息,时间信息,主机名等。为了看的更清楚,以下展示了格式化后的命令:
input
stdin
output
stdout
codec => json
参数讲解:
- input:定义 Logstash 输入行为
- output:定义 Logstash 输出行为
- stdin :标准输入
- stdout :标准输出
- codec:指定输出的数据格式,这里指定为 json,常用的还有 rubydebug,multiline
在 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;
这里指定的是 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 页面:
然后在正式项目中,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?
?:如果符合匹配的正则表达式,则应该将一行内容合并到前一行还是后一行。
$ 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.:]+ - -
可以看到确实是能够匹配的。
所以我们配置的多行处理方式为:
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 选项表示检测配置文件并报告错误(只是检测,不会真正执行)
需要等待一会儿执行完成:
配置没问题后,还是上面那条命令,去掉 ?
?--config.test_and_exit?
?
选项,再次执行:cd logstash-7.4.1
bin/logstash -f conf.d/logstash-shipper.conf
等待一会儿执行完成:
此时 Logstash 运行在前台,如果使用快捷键 ?
?ctrl+c?
?
就会结束当前进程,Logstash 就不会向 Elasticsearch 发送数据。本节主要内容就是对 Logstash 的了解,理解它的工作流程和组件关系。Logstash 处理数据的三个流程:输入,过滤,输出。将无结构的数据解析并结构化为规范的数据,并发送到 Elasticsearch,用作后续分析。
推荐阅读
- 命令_awk
- #yyds干货盘点#Linux常见面试题之磁盘管理命令
- #yyds干货盘点#使用私钥登录服务器
- 关于为了吃瓜通宵7天写了一个网站却没钱买域名这件小事
- maradb 双主配置
- #yyds干货盘点#mysql索引_效率测试(包含测试sql脚本300万条数据)
- 使用VMware安装CentOS 6.4#yyds干货盘点#
- #yyds干货盘点#Linux基本命令练习
- 了解下WSDL 端口