输入插件(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]}"
} }