文章目录
1:logstash简介
Logstash 基于插件开发和应用,包括输入、过滤器和输出三大类插件。
输 入插件指定了数据来源
过滤器插件则对数据做过滤清洗
而输出插件则指定了 数据将被传输到哪里
LogStash 是一个类似实时流水线的开源数据传输引擎,它像一个两头连接不 同数据源的数据传输管道,将数据实时地从一个数据源传输到另一个数据源中。
1:安装启动logstash
1:安装
下载:curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-6.8.13.rpm
或者手动官网下载
解压:sudo rpm -i logstash-6.8.13.rpm
2:配置
Logstash提供了用于从各种输入中读取的输入插件。在本指南中,您将创建一个Logstash管道配置,该配置侦听Beats输入并将接收到的事件发送到Elasticsearch输出。
vim demo-metrics-pipeline.conf
该文件配置我们的数据监听哪里,怎么处理,发送到哪里?
input {
beats {
port => 5044
}
}
# The filter part of this file is commented out to indicate that it :filter部分是可选的
# is optional.
# filter {
#
# }
output {
elasticsearch {
hosts => "localhost:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
3:启动logstash
-f就是我们创建的配置文件
也可以用 -e指定启动参数,不用-f启动文件
./bin/logstash -f demo-metrics-pipeline.conf
4:logstash单元测试
logstash可不依赖beats使用。elk进行单独测试
前提es,kibana必须按照正常使用
1:创建测试配置文件:vim demo-metrics-pipeline.conf
input {
stdin{} #stdin是监控控制台输入,也就是我们启动后的窗口 可以作为控制台输入数据发送到output
}
# The filter part of this file is commented out to indicate that it :filter部分是可选的
# is optional.
# filter {
#
# }
output { #输出我们是写了两个地方,为了验证logstash的安装正确
# elasticsearch {
# hosts => "localhost:9200"
# manage_template => false
# index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
# }
stdout{ #输出1:控制台,也就是我们的输入会在控制台再输出一次
codec => rubydebug {}
}
elasticsearch { #输出2:正常的话输出到es,存到索引
hosts => "es-ip:9200"
manage_template => false
index => "logsatsh-%{+YYYY.MM.dd}"
}
}
2:启动logstash
./bin/logstash -f demo-metrics-pipeline.conf
此时就是一个交互窗口。我们可以发送数据hh,控制台会输出我们的索引结果
./bin/logstash -f demo-metrics-pipeline.conf
hh
[INFO ] 2021-01-07 06:27:31.495 [Ruby-0-Thread-1: /usr/share/logstash/lib/bootstrap/environment.rb:6] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
"@timestamp" => 2021-01-06T22:27:31.482Z,
"@version" => "1",
"host" => "hdp01",
"message" => "hh"
}
[INFO ] 2021-01-07 06:27:32.176 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
3:此时去kibana可以查看:GET logsatsh-2021.01.06/_search
写入成功
2:深入logstash
1:事件
Logstash 事件由一组属性组成,包括数据本身、事件产生时间、版本等。不同输入插件产生事件的属性各不相同,这些事件属性可以在过滤器插件和输出 插件中访问、添加、修改或是删除。
1.1:事件属性
比如@version 、 @ timestamp 和 @ metadata 等。这类属性大多以 @开头,可以认为是事件的元属性
访问事件属性:%{属性名称} 这样的访问获取属性的值
2:数据持久化队列
Logstash 输入插件默认使用基于内存的事件队列,这就意味中如果 Logstash 因为意外崩溃,队列中未处理的事件将全部丢失。
如果想要开启 Logstash 持久化队列,只要在 logstash. yml 文件中将 queue. type 参数设置为 persisted 即可,它的默认值是 memory 。当开启了持久化队列 后,队列数据存储到磁盘。默认存储在 Logstash 数据文件路径的 queue 目录中
queue.type:指定persisted启用持久队列。默认情况下,永久队列是禁用的(默认值:)queue.type: memory。
path.queue:将存储数据文件的目录路径。默认情况下,文件存储在中path.data/queue。
queue.page_capacity:队列页面的最大大小(以字节为单位)。队列数据由称为“页面”的仅附加文件组成。默认大小为64mb。更改此值不太可能带来性能优势。
queue.drain:指定true是否要让Logstash等待直到永久队列耗尽后再关闭。排空队列所需的时间取决于队列中累积的事件数。因此,除非队列(即使已满)相对较小并且可以快速耗尽,否则应避免使用此设置。
queue.max_events:队列中允许的最大事件数。默认值为0(无限制)。
queue.max_bytes:队列的总容量,以字节数为单位。默认值为1024mb(1gb)。确保磁盘驱动器的容量大于您在此处指定的值。
3:logstash插件
Logstash 官方提供的插件并非全部绑定在 Logstash 中,有一部分插件需要 用户在使用时手工安装,比如 log4j 输入插件在默认情况下就没有安装。 Logstash 提供了一条插件管理的命令 logstash-plugin, 可以用于查看、安装、更新或删除 插件
插件使用帮助 ./bin/logstash-plugin --help
查看插件:bin/logstash-plugin list
安装插件:bin/logstash-plugin install plugin-name
比如bin/logstash-plugin install logstash-input-beats
3.1:输入插件
输入插件使Logstash可以读取特定的事件源。
beats 该插件是从beats工具读取数据
elasticsearch 从elasticsearch客户端读取数据
file 从文件读取数据
kafka 从kafka的topic读取数据
stdin 从控制台客户端读取数据
1:beats插件
配置读取的ip,端口进行读取
input {
beats {
host => 0.0.0.0
port => 5044
}
}
2:elasticsearch插件
从elasticsearch集群读取,可以配置读取的集群地址,索引,符合查询的数据
input {
elasticsearch {
hosts => "es.production.mysite.org" #读取的集群ip:port
index => "mydata-2018.09.*" #读取的索引
query => '{ "query": { "query_string": { "query": "*" } } }' #查询语句
size => 500 #滚动读取的大小
scroll => "5m"
docinfo => true
}
}
3:file插件
从文件读取,类似于tail -f 读取
4:kafka插件
类似于topic的一个消费者进行消费数据
5:stdin插件
默认id是本机
input {
stdin {
id => "my_plugin_id"
}
}
3.2:filter过滤器
所有过滤器使用的公共参数:
match 用于完成消息的查找和映射
add_field 给事件添加字段 "new_field" => "new_static_value"
add_tag 给事件添加标签 add_tag => [ "foo_%{somefield}" ]
remove_field 移除字段:remove_field => [ "foo_%{somefield}" ]
filter {
过滤器名字{
过滤器参数操作 => { }
}
}
1:grok正则过滤器
grok过滤器文档: https://www.elastic.co/guide/en/logstash/6.8/plugins-filters-grok.html
在安装包中有过滤器的使用方法:
查看支持的正则匹配:logstashpath/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns
grok是一个十分强大的logstash filter插件,他可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结构。他是目前logstash 中解析非结构化日志数据最好的方式
grok语法: %{语法:语义} #需要注意的是:正则中,匹配空格和中括号要加上转义符。
测试数据:INFO - 2021-01-15 18:37:46,161 - 194.168.20.1 - Shutdown hook called
## 从数据中获取ip,ipv4是一种正则方式,详见支持的正则匹配文件
filter {
grok {
match => { "message" => "%{IPV4:IP}" }
}
}
# 从数据获取日志的级别 %{LOGLEVEL:loglevel}
# 从数据中获取时间戳,不同的时间格式用不同的key %{TIMESTAMP_ISO8601:time}
1:kibana中grok调试
kibana中提供了对grok的正则使用,便于功能调试
Sample Data:测试数据
Grok Pattern:匹配表达式
执行可以看到结果
2:data时间过滤器
默认获取的值会放到元数据信息@timestamp时间字段上
获取"MMM dd yyyy HH:mm:ss" 格式的logdate时间字段的值,放到@timestamp字段值上
可以使用的参数如下
参数 类型
locale string
match array[string]
tag_on_failure array
target string 将匹配的时间戳存储到给定的目标字段中。如果未提供,则默认为更新@timestamp字段
timezone string
时间格式
年 yyyy 全年数字
月份 MM 两位数的月份。如果需要,请补零。示例:01一月和12十二月
MMM 缩写的月份文本。例如:一Jan月份
MMMM 整月文字,例如:January。
天 d或者dd 比如1或者01
小时 HH 一天的第多少小时
分钟 mm
秒 ss
毫秒 SS
时区偏移量 Z或者ZZ 0700 或者07:00形式
3:drop删除过滤器
删除事件。该过滤器通常与条件语句结合使用。
filter {
if [loglevel] == "debug" {
drop { }
}
}
4:mutate字段修改过滤器
对字段做一些重命名,替换,删除等操作
rename 重命名 rename => ["old-name", "new-name" ] 将旧字段重命名
strip 去除字段前后的空格 strip => ["field1", "field2"]
update 更新 update => { "sample" => "My new message" } 用新值更新现有字段
replace 替换 replace => { "message" => "%{source_host}: My new message" } 用新值替换旧值
remove 移除
copy 复制 copy => { "source_field" => "dest_field" } 从字段复制另外一个字段
merge 合并
lowercase 转小写 lowercase => [ "fieldname" ] 将字段值转为小写
uppercase 大写
split 切分 split => ["hostname", "."]
按照什么切分字段,切分到hostname[]上,获取值:%{hostname[num]}
join 将数组按照连接
gsub 对数据中的某些字符进行替换 gsub => [ "fieldname", "/", "_", ]
5:csv过滤器
解析以逗号分隔的数据,解析到指定的字段上
3.3:输出插件
输出插件将事件数据发送到特定的目的地
1:elasticsearch
output {
elasticsearch {
host => ip:port
index =>
}
}
2:kafka插件
output {
kafka {
codec => json #用于输出数据的编解码器。
topic_id => "mytopic"
}
}
3:stdout
输出到控制台,一般用于测试
output {
stdout {}
}