首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Apache日志的logstash自定义日志筛选器

Apache日志的logstash自定义日志筛选器
EN

Stack Overflow用户
提问于 2017-08-31 09:37:04
回答 1查看 1.6K关注 0票数 1

我是麋鹿堆的新手。我有一个文件节拍服务将日志发送到logstash,在使用grok过滤器的logstash中,数据被推送到elasticsearch索引中。

我使用gork过滤器和match => { "message" => "%{COMBINEDAPACHELOG}"}来解析数据。

我的问题是,我希望将字段的名称及其值存储在elasticsearch索引中。日志的不同版本如下:

代码语言:javascript
代码运行次数:0
运行
复制
27.60.18.21 - - [27/Aug/2017:10:28:49 +0530] "GET /api/v1.2/places/search/json?username=pradeep.pgu&location=28.5359586,77.3677936&query=atm&explain=true&bridge=true HTTP/1.1" 200 3284
27.60.18.21 - - [27/Aug/2017:10:28:49 +0530] "GET /api/v1.2/places/search/json?username=pradeep.pgu&location=28.5359586,77.3677936&query=atms&explain=true&bridge=true HTTP/1.1" 200 1452
27.60.18.21 - - [27/Aug/2017:10:28:52 +0530] "GET /api/v1.2/places/nearby/json?&refLocation=28.5359586,77.3677936&keyword=FINATM HTTP/1.1" 200 3283
27.60.18.21 - - [27/Aug/2017:10:29:06 +0530] "GET /api/v1.2/places/search/json?username=pradeep.pgu&location=28.5359586,77.3677936&query=co&explain=true&bridge=true HTTP/1.1" 200 3415
27.60.18.21 - - [27/Aug/2017:10:29:06 +0530] "GET /api/v1.2/places/search/json?username=pradeep.pgu&location=28.5359586,77.3677936&query=cof&explain=true&bridge HTTP/1.1" 200 2476

在弹性指数中我想要的字段如下:

  1. client_ip =>类型必须与kibana用于IP映射的内容兼容。
  2. 时间戳=>日期时间格式。=>日志的时间
  3. 方法=>文本=>被调用的方法,例如GET,POST
  4. 版本=>十进制数=>,例如1.2 / 1.0 (在示例日志中为v1.2)
  5. 用户名=>文本=>它是username=之后的文本(在示例日志中为pradeep.pgu)
  6. location =>geo_point类型=>值具有纬度和经度,因此基巴纳可以在地图上绘制这些图。
  7. search_query => text =>搜索的内容(在示例中从"keyword=“或”query=“两个字段之一)。这两个字段中的任何一个都是存在的,而存在的字段必须使用它的值。
  8. response_code => number =>响应的代码。(样本为200)
  9. data_transfered => number =>传输的数据量(示例中的最后一个数字)。

这样的事情有可能吗?哥克过滤器有这方面的规定吗?问题是,参数并不是特定于顺序的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-31 10:05:44

HTTPD_COMMONLOG开始,您可以使用这种模式(可以在grok试验器上进行测试):

代码语言:javascript
代码运行次数:0
运行
复制
grok {
 match => { 
  "message" => "%{IPORHOST:client_ip} %{HTTPDUSER:ident} %{HTTPDUSER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:method} /api/v%{NUMBER:version}/places/search/json\?%{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response_code} (?:%{NUMBER:data_transfered}|-)"
 } 
}

一旦grok过滤器提取了请求,您就可以在其上使用kv过滤器,这将提取参数(并忽略参数不是顺序特定的问题)。您必须将field_split选项设置为&:

代码语言:javascript
代码运行次数:0
运行
复制
kv { 
  source => "request"
  field_split => "&"
}

对于search_query,根据存在的字段,我们使用mutate过滤器和add_field选项来创建字段。

代码语言:javascript
代码运行次数:0
运行
复制
filter {
    grok {
        match => { 
            "message" => "%{IPORHOST:client_ip} %{HTTPDUSER:ident} %{HTTPDUSER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:method} /api/v%{NUMBER:version}/.*/json\?%{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response_code} (?:%{NUMBER:data_transfered}|-)"
        } 
    }
    kv { 
        source => "request"
        field_split => "&"
    }

    if [query] {
        mutate {
            add_field => { "search_query" => "%{query}" }
        }
    } else if [keyword] {
        mutate {
            add_field => { "search_query" => "%{keyword}" }
        }
    }

    if [refLocation] {
        mutate {
            rename => { "refLocation" => "location" }
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45978156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档