详解用ELK来分析Nginx服务器日志的方法

2019-10-17 19:32:20丽君

urldecode {
  all_fields => true
}

看起来没事了,但是实际上在运行的时候,你会发现一个问题,就是存储到elasticsearch中的timestamp和请求日志中的请求时间不一样。原因是es中的请求日志使用的是日志结构存放进入es的时间,而不是timestamp的时间,这里想要吧es中的时间和请求日志中的时间统一怎么办呢?使用date命令。具体设置如下:

date {
    locale => "en"
    match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]
}

具体的logstash_indexer中的全部配置如下:

filter {
    grok {
      match => [
            "message", "%{IPORHOST:http_host} %{IPORHOST:server_ip} %{IPORHOST:client_ip} [%{HTTPDATE:timestamp}] "%{WORD:http_verb} (?:%{PATH:baseurl}?%{NOTSPACE:params}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})" (%{NOTSPACE:params})?|- %{NUMBER:http_status_code} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{NUMBER:time_duration:float} %{NUMBER:time_backend_response:float}"
      ]
    }
    kv {
      prefix => "params."
      field_split => "&"
      source => "params"
    }
    urldecode {
         all_fields => true
    }
    date {
        locale => "en"
        match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]
    }

}

output部分
这里就是很简单往es中发送数据

output {
    elasticsearch {
        embedded => false
        protocol => "http"
        host => "localhost"
        port => "9200"
        user => "yejianfeng"
        password => "yejianfeng"
    }
}

这里有个user和password,其实elasticsearch加上shield就可以强制使用用户名密码登录了。这里的output就是配置这个使用的。

查询elasticsearch

比如上面的例子,我要查询某段时间的params.source(其实是source参数,但是前面的params是前缀)调用情况

$url = 'http://xx.xx.xx.xx:9200/logstash-*/_search';
$filter = '
{
 "query": {
    "range" : {
      "@timestamp" : {
        "gt" : 123213213213,
        "lt" : 123213213213
      }
    }
  },
  "aggs" : {
    "group_by_source" : {"terms" : {"field" : "params.source"}}
  },
  "size": 0
}';