输入插件(Input):
- stdin (前台输入、用于调试)
- File (从主机文件中获取)
- Redis (从redis中获取,当量日志较大时,在filebeat与logstash之间加个redis)
- filebeat (logstash占用资源较大,所以使用filebeat进行日志收集)
- 。。。。
1、所有输入插件都支持的字段
- add_field:添加一个字段到一个事件,放到事件顶部,一般用来标记日志来源
- tags:添加任意数量的标签,可以用来注明日志属性
- type:为所有输入添加一个字段,可以用来表面日志类型
2、输入插件:file
- 用于读取指定日志文件
input {
file {
path => "/var/log/test/*.log"
exclude => "cluster.log"
start_position => "beginning"
} }
filter {
}
output {
file {
path => "/tmp/test.log"
} }
常用字段:
- path:指定日志文件路径
- exclude:排除采集的日志文件
- start_position:指定从什么位置读取日志,默认从结尾开始,beginning表示从头开始读
3、输入插件filebeat
input {
beats {
host => "0.0.0.0"
port => 5044
} }
filter { }
output {
file {
path => "/tmp/test.log"
} }
常用字段:
- host: filebeat服务器监听地址
- port: filebeat监听端口
过滤插件
过滤插件都支持的字段:
- add_field 如果过滤成功,添加一个字段到这个事件
- add_tags 如果过滤成功,添加任意数量的标签到这个事件
- remove_field 如果过滤成功,从这个事件移除任意字段
- remove_tag 如果过滤成功,从这个事件移除任意标签
1、过滤插件:json
示例数据:手动将该内容输入至输入插件收集的文件中
{"remote_addr": "192.168.1.10","url":"/index","status":"200"}
示例:解析HTTP请求
input {
file {
path => "/var/log/test/*.log"
} }
filter {
json {
source => "message"
} }
output {
file {
path => "/tmp/test.log"
} }
JSON插件:接收一个json数据,将其展开为Logstash事件中的
数据结构,放到事件顶层。
常用字段:
- source 指定要解析的字段,一般是原始消息message字段
- target 将解析的结果放到指定字段,如果不指定,默认在
事件的顶层
2、过滤插件:KV
模拟数据:
www.ctnrs.com?id=1&name=aliang&age=30
示例:解析URL中参数
filter {
kv {
field_split => "&?"
} }
KV插件:接收一个键值数据,按照指定分隔符解析为Logstash
事件中的数据结构,放到事件顶层。
常用字段:
• field_split:指定键值分割符,默认空
3、过滤插件:Grok
Logstash内置的正则匹配模式,在安装目录下可以看到,路径:
vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns
正则匹配模式语法格式:%{SYNTAX:SEMANTIC}
• SYNTAX 模式名称,模式文件中的第一列
• SEMANTIC 匹配文件的字段名
例如: %{IP:client}
Grok插件:如果采集的日志格式是非结构化的,可以写正则表
达式提取,grok是正则表达式支持的实现。
常用字段:
• match 正则匹配模式
• patterns_dir 自定义正则模式文件
正则表达式
符号 | 功能 |
. | 匹配除换行符以外任意字符 |
[ ] | 匹配中阔号中任意字符 |
[^] | 匹配括号非括号内的任意字符 |
\d | 匹配一个数字 |
\D | 匹配非数字 |
\s | 匹配空字符、如:空格、tab |
\S | 匹配非空白字符 |
\w | 匹配特殊字,如:a-Z、0-9、_、汉字 |
\W | 匹配非特殊字符 |
* | 匹配前一个字符0次或多次 |
+ | 匹配前一个字符至少一次 |
? | 匹配前一个字符0次或一次 |
{n} | 匹配前一个字符n次 |
{n,} | 匹配前一个字符至少n次 |
{n,m} | 匹配前一个字符n-m次 |
^ | 以什么开头 |
$ | 以什么结尾 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
模拟数据:
192.168.1.10 GET /index.html 15824 0.043
示例:正则匹配HTTP请求日志
filter {
grok {
match => {
"message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"
} } }
自定义正则模式
vi /usr/local/elk/logstash/patterns
CID [0-9]{5,6}
# 模拟数据
192.168.11.1 GET /login.html 13242 0.02 123123
filter {
grok {
patterns_dir =>"/usr/local/elk/logstash/patterns"
match => {
"message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} %{CID:cid}"
} } }
输出插件
输出阶段:将处理完成的日志推送到远程数据库存储
常用插件:
- file
- Elasticsearch
1、输出插件:elasticsearch
Elasticsearch插件:将数据推送到ES存储。
常用字段:
• hosts 指定ES主机地址
• index 指定写入的ES索引名称,一般按日期ec 划分
示例:
output {
elasticsearch {
hosts =>
["192.168.31.61:9200","192.168.31.62:9200","192.168.31.63:9200"]
index => "microservice-product-%{+YYYY.MM.dd}"
} }
条件判断
1、操作符
- 比较操作符:==,!= , < , > , <= ,>=
- 正则匹配操作符:=~(匹配正则) ,!~(不匹配正则)
- 成员操作符:in(包含) , not in(不包含)
- 逻辑操作符:and(与),or(或), nand(非与) , xor(非或)
- 一元运算符:!(取反) ,()(复合表达式) ,!()(对复合表达式结果取反)
2、实例
input {
file {
path => "/var/log/test/test.log"
add_field => {
"log_type" => "test"
} }
file {
path => "/var/log/test/prod.log"
add_field => {
"log_type" => "prod"
} } }
filter {
if [log_type] in ["test","dev"] {
mutate {
add_field => {
"[@metadata][target_index]" => "test-%{+YYYY.MM}"
}
}
} else if [log_type] == "production" {
mutate {
add_field => {
"[@metadata][target_index]" => "prod-%{+YYYY.MM.dd}"
}
}
} else {
mutate {
add_field => {
"[@metadata][target_index]" => "unknown-%{+YYYY}"
}
} } }
output {
elasticsearch {
hosts => "192.168.31.61:9200"
index => "%{[@metadata][target_index]}"
} }