ELK-Logstash
1.什么是Logstash
logstash是一个数据抽取工具,将数据从一个地方转移到另一个地方。如hadoop生态圈的sqoop等。下载地址:https://www.elastic.co/cn/downloads/logstash
logstash之所以功能强大和流行,还与其丰富的过滤器插件是分不开的,过滤器提供的并不单单是过滤的功能,还可以对进入过滤器的原始数据进行复杂的逻辑处理,甚至添加独特的事件到后续流程中。
Logstash配置文件有如下三部分组成,input、filter、output
其中input、output部分是必须配置,filter部分是可选配置,而filter就是过滤器插件,可以在这部分实现各种日志过滤功能。
2.配置文件
input{
#输入插件
}
filter{
#过滤匹配插件
}
output {
#输出插件
}
- 启动操作:
# 控制台输入,控制台输出
logstash.bat -e "input{stdin{}} output{stdout{}}"
为了好维护将配置写入文件,启动
logstash.bat -f config/test.conf
#test.conf
input {
stdin {
}
}
output {
stdout {
codec=>rubydebug
}
}
Logstash输入插件
输入插件允许Logstash读取特定的事件源
https://www.elastic.co/guide/en/logstash/current/input-plugins.html
标准输入(stdin)
input {
stdin {
}
}
output {
stdout {
codec=>rubydebug
}
}
读取文件(file)
logstash使用一个名为filewatch的ruby gem库来监听文件变化并通过一个叫.sincedb的数据库文件来记录被监听的日志文件的读取进度(时间戳),这个sincedb数据文件的默认路径在<path.data>/plugins/inputs/file下面,文件名类似于.sincedb_123456,而<path.data>表示logstash插件存储目录,默认是LOGSTASH_HOME/data.
input {
file {
path => ["D:/www/ELK/nginx.log"]
start_position => "beginning"
}
}
output {
stdout {
codec => rubydebug
}
}
默认情况下,logstash会从文件的结束位置开始读取数据,也就是说logstash进程会以类似tail -f命令的形式逐行获取数据。
读取TCP网络数据
input {
tcp {
port => "8080"
}
}
filter {
grok {
match=>{"message" => "%{SYSLOGLINE}" }
}
}
output {
stdout {
codec=>rubydebug
}
}
filter插件
https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
Grok正则捕获
grok是一个十分强大的logstash filter插件,他可以通过正则解析任意文本,将非结构化日志数据弄成结构化和方便查询的结构。 他是目前logstash中解析非结构化日志数据最好的方式。
Grok 的语法规则是:
%{语法:语义}
例如输入的内容为:
172.16.213.132 [07/Feb/2024:16:24:19 +0800] "GET HTTP/1.1" 403 5039
%{IP:clientip}: 匹配模式将获得的结果为: clientip:172.16.213.132
%{HTTPDATE:timestamp}: 匹配模式将获得的结果为: timestamp: 07/Feb/2018:16:24:19+0800
%{QS:referrer}: 匹配模式将获得的结果为: referrer:"GET / HTTP/1.1"
下面是一个组合匹配模式,它可以获取上面输入的所有内容:
#172.16.213.135 [09/Nov/2019:16:24:26 +0800] "PUT / HTTP/1.1" 403 5059
filter {
grok {
match => ["message", "%{IP:clientip}\ \[%{HTTPDATE:timestamp}\]\ %{QS:referrer}\ %{NUMBER:response}\ %{NUMBER:bytes}"]
}
}
将message的内容解析 格式如下:
将172.16.213.135解析IP类型的属性命名为 clientip
将[09/Nov/2019:16:24:26 +0800] 解析HTTPDATE类型的属性命名为 timestamp
将"PUT / HTTP/1.1"解析QS类型的属性命名为 referrer
将403解析number类型的属性命名为 response
将5059解析number类型的属性命名为 bytes
解析出的数据:
时间处理Date
date插件是对于排序事件和回填旧数据尤其重要,它可以用来转换日志记录中的时间字段,变成LogStash::Timestamp对象,然后转存到@timeestamp字段里,eg:
filter{
grok{
match => ["message", "${HTTPDATE:timestamp}"]
}
date => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
}
数据修改(Mutate)
正则表达式替换匹配字段
gsub可以通过正则表达式替换字段中匹配到的值,只对字符串字段有效
filter{
mutate{
gsub => ["file_name_1", "/", "_"] # 将所有的"/"替换为"_"
}
}
分隔符分割字符串为数组
split可以通过指定的分隔符分割字段中的字符串为数组
filter{
mutate{
split => ["file_name_2", "|"] # 根据“|”将file_name_2拆分为数组
}
}
重命名字段
rename可以实现重命名某个字段的功能
filter{
mutate{
rename => ["old_field", "new_field"] # 将old_field重命名为new_field
}
}
删除字段
remove_field可以实现删除某个字段的功能
filter{
mutate{
remove_field => ["old_field"] # 将old_field字段删除
}
}
GeoIp地址查询归类
remove_field可以实现删除某个字段的功能
filter{
geoip{
source => "ip_field"
}
}
组合实例
# 输入内容:172.16.213.135 [09/Nov/2019:16:24:26 +0800] "PUT / HTTP/1.1" 403 5059
input {
stdin {}
}
filter {
grok {
match => ["message", "%{IP:clientip}\ \[%{HTTPDATE:timestamp}\]\ %{QS:referrer}\ %{NUMBER:response}\ %{NUMBER:bytes}"]
remove_field => "message"
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
}
mutate {
convert => ["response", "float"]
gsub => ["referrer", "\"", ""]
split => ["clientip", "."]
rename => ["response", "response_new"]
}
}
output {
stdout {
codec=>rubydebug
}
}
返回结果:
output 输出插件
https://www.elastic.co/guide/en/logstash/current/output-plugins.html
output是Logstash的最后阶段,一个事件可以经过多个输出,而一旦所有输出处理完成,整个事件就执行完成。一些常用的输出包括:
file:表示将日志数据写入磁盘上的文件。
elasticsearch:表示将日志数据发送给Elasticsearch。Elasticsearch可以高效方便和易于查询的保存数据。
输出到标准输出(stdout)
output {
stdout {
codec=>rubydebug
}
}
保存为文件(file)
output {
file {
path => "/data/log/%{+yyyy-MM-dd}/%{host}_%{+HH}.1og"
}
}
输出到elasticsearch
output {
elasticsearch {
hosts =>["192.168.1.1:9200", "172.16.213.77:9200"]
index => "logstash-%{+YYYY.MM.dd}"
}
}
综合实例
实时读取nginx文件内容,将数据保存到elasticsearch中
input {
file {
path => ["D:/www/ELK/test.log"]
start_position => "beginning"
}
}
filter {
grok {
match => ["message", "%{IP:clientip}\ \[%{HTTPDATE:timestamp}\]\ %{QS:referrer}\ %{NUMBER:response}\ %{NUMBER:bytes}"]
remove_field => "message"
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
}
mutate {
convert => ["response", "float"]
gsub => ["referrer", "\"", ""]
split => ["clientip", "."]
rename => ["response", "response_new"]
}
}
output {
elasticsearch {
hosts => "localhost:9200"
index => "logstash-%{+YYYY.MM.dd}"
}
}
文件中写入数据,查询是否正常
eg:
172.16.213.132 [07/Feb/2024:16:24:19 +0800] "GET HTTP/1.1" 403 5039
192.16.213.132 [07/Feb/2024:19:24:19 +0800] "GET HTTP/1.1" 200 505678
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了