Logstash(日志收集)
- ELK Stack
- Logstash简介
- 安装Logstash
- Logstash如何工作
- Logstash配置语法(一)
- Logstash配置语法(二)
- 输入插件
- 编解码器
- 过滤器(一)
- 过滤器(二)
- 输出插件
- 条件判断(一)
- 条件判断(二)
ELK Stack
Elasticsearch(存储+检索+分析),简称ES
Logstash(日志收集)
Kibana(可视化)
Logstash简介
具备实时数据传输能力的管道
- 支持多种数据源输入
- 支持多种过滤器
- 支持多种数据输出目的地
在ELK中作为日志收集器
安装Logstash
ELK安装
验证安装
$ /opt/logstash/bin/logstash --version
初体验Logstash
- Hello Logstash!
$ /opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'
Hello Logstash! #输入
2019-03-15T05:59:18.012Z master Hello Logstash! #输出
Logstash如何工作
Logstash对任何事件处理分为三个阶段
- 输入(input):必须,如stdin、file、http、exec…
- 过滤器(filter):可选,如grok、mutate…
- 输出(output):必须,如stdout、elasticsearch、file…
编解码器
- 作为输入或输出插件的一部分,分离传输与序列化过程
运行Logstash的两种方式
logstash -e CONFIG_STRING //使用给定的配置字符串,其格式同配置文件
logstash -f CONFIG_PATH //读取配置文件
Logstash配置语法(一)
配置文件结构
# 输入
input {
...
}
# 过滤器
filter {
...
}
# 输出
output {
...
}
# 验证文件
logstash -f CONFIG_PATH -t
Logstash配置语法(二)
Logstash数据类型
数据类型 | 说明 | 示例 |
array | 数组,可以是单个或多个字符串值 | path => [ “/var/log/messages”, “/var/log/*.log” ] path => “/data/mysql/mysql.log” |
boolean | 布尔值 | ssl_enable => true |
bytes | 字节单位 | my_bytes => “1113” # 1113 bytes my_bytes => “180 mb” # 180000000 bytes |
codes | 表示编码名称 | codec => “json” |
hash | 表示键值对,注意多个键值对用空格分隔,而不是逗号 | match => {“field1” => “value1” “field2” => “value2” … } |
number | 必须是有效的数值,浮点数或者整数 | port => 33 |
string | 字符串 | name => "Hello world" name => ‘It’s a beautiful day’ |
path | 一个代表有效的操作系统路径 | my_path => “/tmp/logstash” |
输入插件
file:从文件中获得事件流
input {
file {
path =>"/var/log/message" #path必须
start_position =>"beginning"
sincedb_path => "/dev/null"
}
}
filter {}
output {
stdout {}
}
input {
file {
path =>["/var/log/messages","/var/log/messages-2019*"] #多文件输入
}
}
编解码器
json
[root#master date]# cat stu.json
{"id":1,"studentNo":"TH-CHEM-2016-C001","interest":"basketball"},{"id":2,"studentNo":"TH-PHY-2016-C001","interest":"talking"},
{"id":3,"studentNo":"BU-POLI-2016-C001","interest":"music"}
rubydebug
"classof" => 2016,
"path" =>"/data/stu.json",
"id" =>3,
"name" =>"Da Vinci",
"studnetNo" =>"BU-POLI-2016-C001",
"interest" =>"music",
"host" =>"master"
"@timestamp" =>2020-09-20T08:59:07.251Z,
"@version" =>"1"
input {
file {
path =>"/data/stu.json"
start_position =>"beginning"
sincedb_path => "/dev/null"
codec => "json"
}
}
filter {}
output {
stdout { codec => "rubydebug"}
}
过滤器(一)
grok:使用正则表达式解析任意文本和结构
100 10.10.0.1 ——>%{NUMBER:duration} %{IP:client}
#NUMBER:内置匹配规则
#duration 字段名
input{stdin{}}
filter{
grok{
match=>{"message"=>"%{NUMBER:duration} %{IP:client}"}
}
}
output{ stdout{codec=>rubydebug}}
过滤器(二)
grok自定义模式
(?<field_name>the pattern here)
2019-01-01 0:0:0 100 10.10.0.1 ————————>
(?<date>\d*[./-]\d*[./-]\d* \d*:\d*:\d*) %{NUMBER:duration} %{IP:client}
"message" =>"2019-01-01 0:0:0 100 10.10.0.1",
"@timestamp" =>2019-03-18T01:50:44.409Z,
"client" =>"10.10.0.1",
"@version" =>"1",
"host" =>"master",
"date" =>"2019-01-01 0:0:0",
"duration" =>"100"
输出插件
stout
file
elasticsearch
output { #可以同时使用多个输出插件
stdout{codec=>rubydebug}
file {
path =>"/root/message.out" #file默认以JSON格式输出每行
}
elasticsearch{
hosts=>["localhost:9200"]
index=>"syslog" #默认为索引名称为“logstash-%{+YYYY.MM>DD}”
}
}
条件判断(一)
控制filter和output处理特定事件
if EXPRESSION {
...
} else if EXPRESSION {
...
} else {
...
}
比较操作
- 相等:==,!=,<,>,<=,>=
- 正则:=~(匹配正则),!~(不匹配正则)
- 包含:in(包含),not in(不包含)
- 布尔:and(与),or(或),nand(与非),xor(异或)
- 取反:!(表达式)
条件判断(二)
控制duration<100的行输出至stdout
input{stdin{}}
filter{
grok{
match=>{"message"=>"%{NUMBER:duration} %{IP:client}"}
}
mutate{convert=>["duration","integer"]} #mutate过滤器可以重命名、删除、替换和修改字段
}
output{
if [duration]<100{ #[字段名]表示字段引用
stdout{codec=>rubydebug}
}
}