filebeat+logstash+elasticsearch+kibana解析nginx日志并展示

0.环境说明

filebeat、logstash、elasticsearch版本为6.5.4。

1.filebeat配置文件

收集nginx成功和失败日志数据,并标记不同的tags,为logstash接收数据做过滤标记。在kibana中,需要按照该tags进行过滤数据信息。

  • filebeat.yml
filebeat.prospectors:
- input_type: log
  paths:
    - /data/access*.log
  exclude_files: ['.gz$']
  tags: ["nginx-accesslog"]
  document_type: nginxaccess
- input_type: log
  paths:
    - /data/error*.log
  tags: ["nginx-errorlog"]
  exclude_files: ['.gz$']
  document_type: nginxerror
tags: ["nginx-logs"]

filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

output.logstash:
  hosts: ["127.0.0.1:5044"]

#output:
#  console:
#    pretty: true
  • 启动filebeat:./filebeat -e -c filebeat.yml

2.logstash配置文件

参考官方logstash解析nginx日志的配置文件,进行修改。

filter中第二个grok中,将nginx.access.url?后的参数剔除掉,存到api字段中。这样不同参数相同接口的url,都可以归类到同一个api中。

totaltime为nginx.access.url日志中加入的接口请求响应时间值,放在日志的最末尾。
message数据格式类似如下:

127.0.0.1 - - [21/Jun/2019:09:40:08 +0800] "GET /aaa/bbb/ccc HTTP/1.1" 200 4841 "https://aaa/ddd/ccc/eee/fff?unionId=aaa" "Mozilla/5.0 (Linux; Android 8.1.0) Chrome/66.0.3359.126" 0.003

加入logtype字段作为结构化后数据的标记信息,在kibana中,与tags信息结合,过滤展示数据信息。

  • nginxlog.conf
input {
  beats {
    port => 5044
    host => "127.0.0.1"
  }
}

filter {
  if "nginx-logs" in [tags] {
    if "nginx-accesslog" in [tags] {
      grok {
        match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\" %{GREEDYDATA:totaltime}"] }
        remove_field => "message"
        add_field => {"logtype"=>"nginxLogs"}
      }
      grok {
        match => {"[nginx][access][url]" =>  "%{URIPATH:api}"}
      }
      mutate {
        add_field => { "read_timestamp" => "%{@timestamp}" }
        convert => ["totaltime","float"]
      }
      date {
        match => [ "[nginx][access][time]", "dd/MMM/YYYY:H:m:s Z" ]
        remove_field => "[nginx][access][time]"
      }
      useragent {
        source => "[nginx][access][time]", "dd/MMM/YYYY:H:m:s Z" ]
        remove_field => "[nginx][access][time]"
      }
      useragent {
        source => "[nginx][access][agent]"
        target => "[nginx][access][user_agent]"
        remove_field => "[nginx][access][agent]"
      }
      geoip {
        source => "[nginx][access][remote_ip]"
        target => "[nginx][access][geoip]"
      }
    }
    if "nginx-errorlog" in [tags] {
      grok {
        match => { "message" => ["%{DATA:[nginx][error][time]} \[%{DATA:[nginx][error][level]}\] %{NUMBER:[nginx][error][pid]}#%{NUMBER:[nginx][error][tid]}: (\*%{NUMBER:[nginx][error][connection_id]} )?%{GREEDYDATA:[nginx][error][message]}"] }
        remove_field => "message"
        add_field => {"logtype"=>"nginxLogs"}
      }
      mutate {
        rename => { "@timestamp" => "read_timestamp" }
      }
      date {
        match => [ "[nginx][error][time]", "YYYY/MM/dd H:m:s" ]
        remove_field => "[nginx][error][time]"
      }
    }
  }
}

output {
  if "nginx-logs" in [tags] {
    if [logtype] == "nginxLogs" {
      elasticsearch {
        hosts => ["127.0.0.1:9200"]
        manage_template => false
        index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
      }
      #stdout {
      #  codec => rubydebug
      #}
    }
  }
}
  • 启动logstash:./bin/logstash -f config/conf.d/nginxlogs.conf

3.elasticsearch中索引template的建立

参考filebeat中,自带的template,创建filebeat-*索引的模版。

4.kibana展示

参考filebeat中,自带的nginx的dashboard。将nginx相关dashboard的json文件,导入到目标kibana中。修改以filset为开头的数据过滤条件,改为自定义的logtype为数据过滤条件,才能正确展示图像、数据信息。

5.补充

使用filebeat+elasticsearch+kibana模式,利用filebeat自带的module解析nginx日志信息,可以在kibana中获取到filebeat-*索引的模版信息,导出nginx相关的dashboard信息。

你可能感兴趣的:(filebeat+logstash+elasticsearch+kibana解析nginx日志并展示)