input
- 文件输入
file {
type => "nginxaccess"
#路径
path => "/usr/local/nginx/logs/access.log"
#开始位置
start_position => "beginning"
}
filter
过滤器插件-grok
1. 安装
bin/logstash-plugin install logstash-filter-grok
2. 使用
匹配模式 message是每段读进来的日志,IP、HTTPDATE、WORD、NOTSPACE、NUMBER都是patterns/grok-patterns中定义好的正则格式名称,对照日志进行编写,(?:%{USER:ident}|-)这种形式是条件判断,相当于程序里面的二目运算。如果有双引号”“或者[]号,需要在前面加\进行转义。
举例
55.3.244.1 GET /index.html 15824 0.043
grok {
#自定义规则路径
#patterns_dir => "/home/es/logstash-6.2.3/patterns/nginx_pattern"
"message"=>{"%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}
}
下面是自己写的自定义nginx的access.log的匹配规则
vim /home/es/logstash-6.2.3/patterns/nginx_pattern
URI1 (%{URIPROTO}://)?(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?
NGINXACCESS %{IP:clientIp} - - \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:status} %{NUMBER:bytes} \"(?:%{URI1:http_referrer}|-)\" \"(%{GREEDYDATA:user_agent}|-)\"
3. 过滤规则
- 查看grok自带的过滤规则
cat /home/es/logstash-6.2.3/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns
4. 在线匹配工具
https://grokdebug.herokuapp.com/
过滤器插件-urldecode
1. 安装
bin/logstash-plugin install logstash-filter-urldecode
2. 使用
把所有字段进行urldecode(显示中文)
urldecode {
all_fields => true
}
针对单独的字段转化,比如message字段是url编码
urldecode {
field => "message"
}
输入
https://www.test.com/s?word=%e5%b0%8f%e7%b1%b3&key=%e8%8b%b9%e6%9e%9c
输出
{
"@version" => "1",
"host" => "iZbp108a551s2at4tguz7bZ",
"@timestamp" => 2018-03-29T07:38:45.166Z,
"message" => "https://www.test.com/s?word=小米&key=苹果"
}
过滤器插件-kv
1. 安装
bin/logstash-plugin install logstash-filter-kv
2. 使用
将取得的URL、request字段取出来进行key-value值匹配,使用字段分隔符”&?”,值键分隔符”=”,则会自动将字段和值采集出来。
kv {
field_split => "&?"
}
官方插件使用介绍
https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
我自己的过滤配置
filter {
grok {
patterns_dir => "/home/es/logstash-6.2.3/patterns/nginx_pattern"
match => {"message"=>"%{NGINXACCESS}"}
}
geoip {
source => "clientIp"
}
urldecode {
field => "request"
}
kv {
source => "request"
field_split => "&?"
}
}
output
- 输出到elasticsearch
elasticsearch {
#elasticsearch的ip:prot
hosts => ["127.0.0.1:9200"]
#index
index=>"nginx"
#type
document_type => "log"
}
logstash的坑:
不能重复读一份完全相同的文件! 在使用logstash采集日志时,如果我们采用file为input类型,采用不能反复对一份文件进行测试!第一次会成功,之后就会失败!
如果要对同一份文件进行采集,记得改名!