阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Logstash使用grok过滤nginx日志

290次阅读
没有评论

共计 4003 个字符,预计需要花费 11 分钟才能阅读完成。

在生产环境中,nginx 日志格式往往使用的是自定义的格式,我们需要把 logstash 中的 message 结构化后再存储,方便 kibana 的搜索和统计,因此需要对 message 进行解析。

本文采用 grok 过滤器,使用 match 正则表达式解析,根据自己的 log_format 定制。

1、nginx 日志格式

log_format 配置如下:

log_format  main  '$remote_addr $remote_user [$time_local] $http_host $request_method $request_uri'
        '$status $body_bytes_sent $request_time"$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for "$http_cookie"'

nginx 也可以添加 json 日志格式

# vim /usr/local/nginx/conf/nginx.conf
log_format json '{"@timestamp":"$time_iso8601",'
                  '"host":"$server_addr",'
                  '"clientip":"$remote_addr",'
                  '"remote_user":"$remote_user",'
                  '"request":"$request",'
                  '"http_user_agent":"$http_user_agent",'
                  '"size":$body_bytes_sent,'
                  '"responsetime":$request_time,'
                  '"upstreamtime":"$upstream_response_time",'
                  '"upstreamhost":"$upstream_addr",'
                  '"http_host":"$host",'
                  '"url":"$uri",'
                  '"domain":"$host",'
                  '"xff":"$http_x_forwarded_for",'
                  '"referer":"$http_referer",'
                  '"status":"$status"}';
access_log /var/log/nginx/access.log json;

对应的日志如下:

183.56.162.88 - [21/Dec/2017:10:36:29 +0800] wxself.gtafe.com GET /Home/Index/?returnUrl=/pages/index.html&code=G28ea0iAaAmxsFcAcy1y64fIP9I07SUgOEopckpsZF4&state=sure 302 134 0.229 "-" "Mozilla/5.0 (Linux; Android 7.0; BLN-AL40 Build/HONORBLN-AL40; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 
TBS/043613 Safari/537.36 wxwork/2.4.1 MicroMessenger/6.3.22 NetType/WIFI Language/zh"-"ASP.NET_SessionId=ci1ivt21p2zzfsaisode3xvj"

2、编写正则表达式

logstash 中默认存在一部分正则让我们来使用,可以访问 Grok Debugger 来查看,可以在 $logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.0/patterns/ 目录里面查看。
基本定义在 grok-patterns 中,我们可以使用其中的正则,当然并不是所有的都适合 nginx 字段,这时就需要我们自定义正则,然后通过指定 patterns_dir 来调用。
同时在写正则的时候可以使用 Grok Debugger 或者 Grok Comstructor 工具来帮助我们更快的调试。在不知道如何使用 logstash 中的正则的时候也可使用 Grok Debugger 的 Descover 来自动匹配。
Github 中也有相关的语法说明:
https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns
https://github.com/kkos/oniguruma/blob/master/doc/RE

通过 log_format 来匹配对应的正则如下:

%{IP:remote_addr} (?:%{DATA:remote_user}|-) \[%{HTTPDATE:timestamp}\] %{IPORHOST:http_host} %{DATA:request_method} %{DATA:request_uri} %{NUMBER:status} (?:%{NUMBER:body_bytes_sent}|-) (?:%{DATA:request_time}|-) \"(?:%{DATA:http_referer}|-)\" \"%{DATA:http_user_agent}\" (?:%{DATA:http_x_forwarded_for}|-) \"(?:%{DATA:http_cookie}|-)\"

message 是每段读进来的日志,IPORHOST、USERNAME、HTTPDATE 等都是 patterns/grok-patterns 中定义好的正则格式名称,对照日志进行编写。
grok pattren 的语法为:%{SYNTAX:semantic},”:” 前面是 grok-pattrens 中定义的变量,后面可以自定义变量的名称。(?:%{SYNTAX:semantic}|-) 这种形式是条件判断。
如果有双引号 ”” 或者中括号 [],需要加  进行转义。

3、Filebeat 配置文件

修改 filebeat 的配置文件。如果同一台机器上要收集多个日志文件,而且每个日志要输出到不同的索引,那么可以把每个 prospector 单独定义一个 tags,然后在 logstash 上通过 if 判断输出到不同的索引。

- type: log

  enabled: true

  paths:
    - /gta/nginx_log/www.xxx.com.log

  tags: ["www.xxx.com"]

- type: log

  enabled: true

  paths:
    - /gta/nginx_log/www.yyy.com.log

  tags: ["www.yyy.com"]

4、编写 logstash pipeline 配置文件

这里通过 if 判断将不同 type 的日志输出到不同的索引。

input {
    beats {port => 5044
    }
}

filter {if "www.xxx.com" in [tags] {
        grok {match => { "message" => "%{IP:remote_addr} (?:%{DATA:remote_user}|-) \[%{HTTPDATE:timestamp}\] %{IPORHOST:http_host} %{DATA:request_method} %{DATA:request_uri} %{NUMBER:status} (?:%{NUMBER:body_bytes_sent}|-) (?:%{DATA:request_time}|-) \"(?:%{DATA:http_referer}|-)\"\"%{DATA:http_user_agent}\"(?:%{DATA:http_x_forwarded_for}|-) \"(?:%{DATA:http_cookie}|-)\""}
        }
        mutate {convert => ["status","integer"]
                convert => ["body_bytes_sent","integer"]
                convert => ["request_time","float"]
        }
        geoip {source=>"remote_addr"
        }
        date {match => [ "timestamp","dd/MMM/YYYY:HH:mm:ss Z"]
        }
        useragent {source=>"http_user_agent"
        }
    }
    
}

output {if "www.xxx.com" in [tags] {
                elasticsearch {hosts => ["10.1.128.101:9200"]
                       index => "www.xxx.com_10.1.144.60"
                       user => 'elastic'
                       password => '123456'
                      }
        }
        
        stdout {codec => rubydebug}
}

Logstash 监控日志文件时应对日志文件名改变的原理  http://www.linuxidc.com/Linux/2016-08/133994.htm

Logstash5.4.1 解析日志报错处理  http://www.linuxidc.com/Linux/2017-08/146197.htm

ElasticSearch 和 Logstash 使用详解  http://www.linuxidc.com/Linux/2017-12/149343.htm

部署 ELK 日志系统 Elasticsearch+Logstash+Kibana  http://www.linuxidc.com/Linux/2017-05/143304.htm

排查 Logstash2.4 升级到 5.0 版本后 Kafka 不兼容问题  http://www.linuxidc.com/Linux/2016-12/138216.htm

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-12/149811.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4003字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中