如何在ElasticSearch / Kibana中准确搜索URL

时间:2014-10-14 09:51:04

标签: elasticsearch logstash kibana logstash-grok

我已导入IIS日志文件,数据已通过Logstash(1.4.2)移至ElasticSearch(1.3.1),然后在Kibana中显示。

我的过滤部分如下:

filter {
  grok {
     match => 
        ["message" , "%{TIMESTAMP_ISO8601:iisTimestamp} %{IP:serverIP} %{WORD:method} %{URIPATH:uri} - %{NUMBER:port} - %{IP:clientIP} - %{NUMBER:status} %{NUMBER:subStatus} %{NUMBER:win32Status} %{NUMBER:timeTaken}"]
  }
}

在Kibana中使用“条款”面板时,使用" uri" (我从Logstash中捕获的一个字段),它匹配URI中的标记。因此匹配项目如下:

  • '脚本'
  • ' /'
  • ' EN

问:如何显示'热门网址'他们的完整形式?

问:如何通知ElasticSearch该字段未被分析'。我不介意有两个字段,例如:

  • uri - 标记化的URI
  • uri.raw - 完整格式化的网址。

这可以在Logstash方面完成,还是需要在ElasticSearch中设置的映射?


映射如下:

//http://localhost:9200/iislog-2014.10.09/_mapping?pretty

{
  "iislog-2014.10.09" : {
    "mappings" : {
      "iislogs" : {
        "properties" : {
          "@timestamp" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "@version" : {
            "type" : "string"
          },
          "clientIP" : {
            "type" : "string"
          },
          "device" : {
            "type" : "string"
          },
          "host" : {
            "type" : "string"
          },
          "id" : {
            "type" : "string"
          },
          "iisTimestamp" : {
            "type" : "string"
          },
          "logFilePath" : {
            "type" : "string"
          },
          "message" : {
            "type" : "string"
          },
          "method" : {
            "type" : "string"
          },
          "name" : {
            "type" : "string"
          },
          "os" : {
            "type" : "string"
          },
          "os_name" : {
            "type" : "string"
          },
          "port" : {
            "type" : "string"
          },
          "serverIP" : {
            "type" : "string"
          },
          "status" : {
            "type" : "string"
          },
          "subStatus" : {
            "type" : "string"
          },
          "tags" : {
            "type" : "string"
          },
          "timeTaken" : {
            "type" : "string"
          },
          "type" : {
            "type" : "string"
          },
          "uri" : {
            "type" : "string"
          },
          "win32Status" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

2 个答案:

答案 0 :(得分:1)

在您的Elasticsearch映射中:

url: {
  type: "string",
  index: "not_analyzed"
}

答案 1 :(得分:0)

问题是iislog-不符合logstash-格式,因此没有选择模板:

我的索引格式为iislog-YYYY.MM.dd,这并没有使用Logstash的开箱即用映射。使用logstash-索引格式时,Logstash将为字符串创建2对字段。例如uri是:

  • uri(出现在Kibana)
  • uri.raw(不会出现在Kibana中)

请注意,uri.raw不会出现在Kibana中 - 但它是可查询的。

因此,使用替代指数的解决方案是:

  1. 不要打扰!使用logstash-%{+YYYY.MM.dd}
  2. 的默认索引格式
  3. file输入中添加“type”,以帮助您过滤Kibana中的正确日志(使用logstash-索引格式时)

    input { 
      file {
          type => "iislog"
          ....
      }
    }
    
  4. 在基于
  5. 类型的Kibana中应用过滤

    OR

    如果您确实 确实需要不同的索引格式:

    1. default configuration file复制到新文件,例如iislog-template.json
    2. output ==> elasticsearch中引用配置文件,如下所示:

      output {    
         elasticsearch_http {
            host => localhost
            template_name => "iislog-template.json"
            template => "<path to template>"
            index => "iislog-%{+YYYY.MM.dd}"   
         }
      }