Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的存储库中。
logstash官方文档:Logstash:收集、解析和转换日志 | Elastic
1 Logstash核心概念
1.1 Pipeline
- 包含了input—filter—output三个阶段的处理流程
- 插件生命周期管理
- 队列管理
1.2 Logstash Event
- 数据在内部流转时的具体表现形式。数据在input 阶段被转换为Event,在 output被转化成目标格式数据;
- Event 其实是一个Java Object,在配置文件中,可以对Event 的属性进行增删改查。
1.3 Codec (Code / Decode)
将原始数据decode成Event;将Event encode成目标数据。
2 Logstash数据传输原理
- 数据采集与输入:Logstash支持各种输入选择,能够以连续的流式传输方式,轻松地从日志、指标、Web应用以及数据存储中采集数据。
- 实时解析和数据转换:通过Logstash过滤器解析各个事件,识别已命名的字段来构建结构,并将它们转换成通用格式,最终将数据从源端传输到存储库中。
- 存储与数据导出:Logstash提供多种输出选择,可以将数据发送到指定的地方。
Logstash通过管道完成数据的采集与处理,管道配置中包含input、output和filter(可选)插件,input和output用来配置输入和输出数据源、filter用来对数据进行过滤或预处理。
3 Logstash安装
logstash官方文档: Installing Logstash | Logstash Reference [7.17] | Elastic
1)下载并解压logstash
#下载Logstash
#windows
https://artifacts.elastic.co/downloads/logstash/logstash-7.17.3-windows-x86_64.zip
#linux
https://artifacts.elastic.co/downloads/logstash/logstash-7.17.3-linux-x86_64.tar.gz
2)运行最基本的logstash管道
cd logstash-8.13.0
#linux
#-e选项表示,直接把配置放在命令中,这样可以有效快速进行测试。
bin/logstash -e 'input { stdin { } } output { stdout {} }'
#windows
.\bin\logstash.bat -e "input { stdin { } } output { stdout {} }"
测试结果:
4 Logstash配置文件结构
参考:Configuring Logstash | Logstash Reference [7.17] | Elastic
Logstash的管道配置文件对每种类型的插件都提供了一个单独的配置部分,用于处理管道事件。
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-demo.conf
4.1 输入插件(Input Plugins)
一个 Pipeline可以有多个input插件
- Stdin / File
- Beats / Log4J /Elasticsearch / JDBC / Kafka /Rabbitmq /Redis
- JMX/ HTTP / Websocket / UDP / TCP
- Google Cloud Storage / S3
- Github / Twitter
4.2 输出插件(Output Plugins)
将Event发送到特定的目的地,是 Pipeline 的最后一个阶段。
常见 Output Plugins:
- Elasticsearch
- Email / Pageduty
- Influxdb / Kafka / Mongodb / Opentsdb / Zabbix
- Http / TCP / Websocket
4.3 Codec Plugins
将原始数据decode成Event;将Event encode成目标数据。
内置的Codec Plugins:
- Line / Multiline
- JSON / Avro / Cef (ArcSight Common Event Format)
- Dots / Rubydebug
Codec Plugin测试
# single line
bin/logstash -e "input{stdin{codec=>line}}output{stdout{codec=> rubydebug}}"
bin/logstash -e "input{stdin{codec=>json}}output{stdout{codec=> rubydebug}}"
Multiline插件
设置参数:
- pattern: 设置行匹配的正则表达式
- what : 如果匹配成功,那么匹配行属于上一个事件还是下一个事件
- previous / next
- negate : 是否对pattern结果取反
- true / false
# 多行数据,异常
Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
#vim multiline-exception.conf
input {
stdin {
codec => multiline {
pattern => "^\s"
what => "previous"
}
}
}
filter {}
output {
stdout { codec => rubydebug }
}
#执行管道
bin/logstash -f multiline-exception.conf
4.4 Filter Plugins
Filter Plugin可以对Logstash Event进行各种处理,例如解析,删除字段,类型转换。
- Date: 日期解析
- Dissect: 分割符解析
- Grok: 正则匹配解析
- Mutate: 对字段做各种操作
- Convert : 类型转换
- Gsub : 字符串替换
- Split / Join /Merge: 字符串切割,数组合并字符串,数组合并数组
- Rename: 字段重命名
- Update / Replace: 字段内容更新替换
- Remove_field: 字段删除
- Ruby: 利用Ruby 代码来动态修改Event
4.5 Logstash Queue
- In Memory Queue
进程Crash,机器宕机,都会引起数据的丢失。
- Persistent Queue
机器宕机,数据也不会丢失;数据保证会被消费;可以替代 Kafka等消息队列缓冲区的作用。
# pipelines.yml
queue.type: persisted (默认是memory)
queue.max_bytes: 4gb
5 Logstash导入csv数据到ES
1)测试数据集下载:MovieLens | GroupLens
2)准备logstash-movie.conf配置文件
input {
file {
path => "/home/es/logstash-7.17.3/dataset/movies.csv"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
csv {
separator => ","
columns => ["id","content","genre"]
}
mutate {
split => { "genre" => "|" }
remove_field => ["path", "host","@timestamp","message"]
}
mutate {
split => ["content", "("]
add_field => { "title" => "%{[content][0]}"}
add_field => { "year" => "%{[content][1]}"}
}
mutate {
convert => {
"year" => "integer"
}
strip => ["title"]
remove_field => ["path", "host","@timestamp","message","content"]
}
}
output {
elasticsearch {
hosts => "http://localhost:9200"
index => "movies"
document_id => "%{id}"
user => "elastic"
password => "123456"
}
stdout {}
}
3)运行logstash
# linux
bin/logstash -f logstash-movie.conf
- --config.test_and_exit : 解析配置文件并报告任何错误
- --config.reload.automatic: 启用自动配置加载