ELK stack的另外两个组件:
L: logstash
K: Kibina
K: Kibina:js开发的非常美观的搜索界面
Logstash:
支持多数据获取机制,通过TCP/UDP协议、文件、syslog、windows EventLogs及STDIN等;获取到数据后,它支持对数据执行过滤、修改等操作;
是高度插件化的,所有功能都需要通过插件来实现
通过各agent监控收集个服务器上的日志数据发送到server上,然后由logstash发送并存储到ES中
整合型框架、重量级、性能较低
为防止大量agent日志IO压垮server端会在中间放一个消息队列(MQ),容易部署的是redis、或功能较强的kafka
消息列队有频道概念:类似域腾讯视频APP客户端,有体育频道、财经频道、电影频道等,每个频道都有各自的消息,对哪个频道感兴趣就订阅哪个频道
例如发布者可以有2个队列,订阅者可以有4个队列,中间通过路由把不同的数据发布到对应的队列中去
安装:
需要安装jvm环境
官网下载rpm包并安装
vim /etc/profile
export PATH=/opt/logstash/bin:$PATH
vim /etc/logstash/conf.d/sample.conf
input {
stdin {} #stdin插件
}
output {
stdout { #stdout插件
codec => rubydebug
}
}
配置文件测试:
logstash -f /etc/logstash/conf.d/sample.conf --configtest
运行:
logstash -f /etc/logstash/conf.d/sample.conf
配置框架:
input {
...
}
filter {
...
}
output {
...
}
四种类型的插件:
input, filter, codec(编码), output
支持的数据类型:
Array:[item1, item2,...] #数组
Boolean:true, false
Bytes:#字节,简单数据
Codec:编码器
Hash:key => value #字典
Number:
Password:
Path:文件系统路径;
String:字符串
字段引用:[]
条件判断:
==, !=, <, <=, >, >=
=~, !~ #正则匹配,不匹配
in, not in
and, or
() #符合表达式
Logstash的插件:
可以通过官方文档查看所有用法
input插件:
File:从指定的文件中读取事件流;
使用FileWatch(Ruby Gem库)监听文件的变化,可同时监听多个文件。
.sincedb:记录了每个被监听的文件的inode, major number, minor nubmer, pos,可以记录日志读取的位置从而下次可以继续往下读取;
input {
file {
path => ["/var/log/messages"] #目录输出形式是数组所以要中括号
type => "system" #定义输入时的类型,过滤时可以通过这个类型进行过滤
start_position => "beginning" #起始位置
}
}
output {
stdout {
codec => rubydebug
}
}
udp:通过udp协议从网络连接来读取Message,其必备参数为port,用于指明自己监听的端口,host则用指明自己监听的地址;
collectd:性能监控程序;以守护进程方式运行,能够收集系统性能各种相关数据,并能基于各种存储机制将收集的结果存储下来
是一个高度插件化程序,可以通过network插件把自己在本地上收集到的数据发送给其他主机
CentOS 7:
epel源:
yum install collectd
配置文件/etc/collectd.conf
Hostname "node3.magedu.com"
LoadPlugin syslog
LoadPlugin cpu
LoadPlugin df
LoadPlugin interface
LoadPlugin load
LoadPlugin memory
LoadPlugin network
<Plugin network>
<Server "172.16.100.70" "25826"> # 172.16.100.70是logstash主机的地址,25826是其监听的udp端口;
</Server>
</Plugin>
Include "/etc/collectd.d"
systemctl start collectd.service
logstash端:#udp插件还可以设置内存大小、队列长度等、线程数:默认为2
input {
udp {
port => 25826 #设置自己的端口用来接受日志,默认网卡为0.0.0.0(所有)
codec => collectd {} #默认为plain编码器,发来是啥解析为啥;只是格式化为简单的字符串
type => "collectd" #可以随便起名字
}
}
output {
stdout {
codec => rubydebug
}
}
redis插件:
从redis读取数据,支持redis channel(简单队列)和lists(列表)两种方式;
redis channel:类似域腾讯视频APP客户端,有体育频道、财经频道、电影频道等,每个频道都有各自的消息,对哪个频道感兴趣就订阅哪个频道
lists:redis默认数据库为0,一共最多有16个数据库,可以设置一个数据库作为收集Logstash的agent端数据的存储,并把整个数据库作为一个列表,列表左端不断插入数据,右边不断拿取数据,从而也可以模拟出类似channel的效果来
filter插件:
用于在将event通过output发出之前对其实现某些处理功能。grok
grok:用于分析拆解并结构化文本数据;目前 是logstash中将非结构化日志数据转化为结构化的可查询数据的不二之选。是从web服务器的日志当中读取到日志时间并需要对其处理时必然会用到的一个插件
syslog, apache, nginx
预定义拆解模式配置文件位置:/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-0.3.0/patterns/grok-patterns
拆解语法格式:
%{SYNTAX:SEMANTIC}
SYNTAX:预定义模式名称;是配置文件已经定义好的例如%{IP:clientip}主要用于识别哪些是IP地址并重新取名为clientip并以clientip来获取日志IP的相关值
SEMANTIC:匹配到的文本的自定义标识符;
示例:
input {
stdin {}
}
filter {
grok {
match => { "message" => "%{IP:clientip} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
#grok插件中的match参数是用来匹配产生的数据
#message:output把所有数据以message字段进行输出,以上是把整个message如何进行格式化、拆解
}
}
output {
stdout {
codec => rubydebug
}
}
标准输入内容:
1.1.1.1 GET /index.html 30 0.23
输出结果验证:
{
"message" => "1.1.1.1 GET /index.html 30 0.23",
"@version" => "1",
"@timestamp" => "2015-11-25T02:13:52.558Z",
"host" => "node4.magedu.com",
"clientip" => "1.1.1.1",
"method" => "GET",
"request" => "/index.html",
"bytes" => "30",
"duration" => "0.23"
}
自定义grok的模式:
grok的模式是基于正则表达式编写,其元字符与其它用到正则表达式的工具awk/sed/grep/pcre差别不大。
两种方式:
直接使用模式文本定义一个标识符
自己创建一个patterns目录然后使用patterns_dir =>自己指明patterns文件
匹配apache log
input {
file {
path => ["/var/log/httpd/access_log"]
type => "apachelog"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" } #套用patterns文件中已经定义好的模式
}
}
output {
stdout {
codec => rubydebug
}
}
nginx log的匹配方式:
将如下信息添加至 /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-0.3.0/patterns/grok-patterns文件的尾部:
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NOTSPACE:http_x_forwarded_for}
input {
file {
path => ["/var/log/nginx/access.log"]
type => "nginxlog"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{NGINXACCESS}" } #调用自己添加的预定义模式
}
}
output {
stdout {
codec => rubydebug
}
}
output插件:
stdout {} #输出到屏幕
elasticsearch {}
redis {}
示例:(以下替换上文的output就是Logstash的agent收集nginx数据并推送给redis的整个配置过程)
output {
redis {
port => "6379" #输出到redis哪个端口
host => ["127.0.0.1"] #输出到redis的IP地址
data_type => "list" #指名使用列表还是队列模式
key => "logstash-%type" #定义list的名字,后缀调用输入时定义的type变量
}
}
Logstash的server端从redis读取数据并推送给ES配置:
input {
redis {
port => "6379"
host => "172.16.100.70"
data_type => "list"
type => "nginxlog"
key => "logstash-nginxlog"
}
}
output {
elasticsearch {
cluster => "elk" #指名ES的集群名
index => "logstash-%+YYYY.MM.dd" #指名索引名字,此处表示每天创建并存储在一个以日期为后缀的索引中
}
}
验证nginx日志是否收集到ES集群中
curl -XGET 'localhost:9200/_cat/indices' #查询所有已有索引
curl -XGET 'localhost:9200/logstasg-2023.3.27/_search?pretty' #搜索所有
安装ES集群
Kibanna界面
从官网下载Kibanna的tar包并解压(可以安装在独立节点也可以安装在ES的其中一个节点上)
修改配置文件 config/kibana.yml 配置指向ES集群
vim ./config/kibana.yml
elasticsearch_url: "localhost:9200" #指名ES的一个节点
启动:./bin/kibana
03 ELK——Logstash使用详解
最新推荐文章于 2024-04-23 10:33:19 发布