我有一个Apache Access Log,我想在REQUEST字段中解析一些文本:
GET /foo/bar?contentId=ABC&_=1212121212 HTTP/1.1"
我想要做的是提取并将12121212122分配给一个值,但该值基于前缀ABC& _(所以我想我需要if语句或其他东西)。前缀可以采用其他形式(例如,DDD& _)
所以基本上我想说
if (prefix == ABC&_)
ABCID = 1212121212
elseif (prefix == DDD&_)
DDDID = <whatever value>
else
do nothing
我一直在努力在logstash中构建正确的过滤器,以根据前缀提取id。任何帮助都会很棒。
谢谢
答案 0 :(得分:2)
为此您将使用grok过滤器。
例如:
artur@pandaadb:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf2
Settings: Default pipeline workers: 8
Pipeline main started
GET /foo/bar?contentId=ABC&_=1212121212 HTTP/1.1"
{
"message" => "GET /foo/bar?contentId=ABC&_=1212121212 HTTP/1.1\"",
"@version" => "1",
"@timestamp" => "2016-07-28T15:59:12.787Z",
"host" => "pandaadb",
"prefix" => "ABC&_",
"id" => "1212121212"
}
这是您的示例输入,解析出您的前缀和ID。
这里不需要,因为GROK过滤器的正则表达式可以处理它。
但是,您可以(如果需要将其放在不同的字段中)分析您的字段并将其添加到另一个字段中。
这会输出:
GET /foo/bar?contentId=ABC&_=1212121212 HTTP/1.1"
{
"message" => "GET /foo/bar?contentId=ABC&_=1212121212 HTTP/1.1\"",
"@version" => "1",
"@timestamp" => "2016-07-28T16:05:07.442Z",
"host" => "pandaadb",
"prefix" => "ABC&_",
"id" => "1212121212",
"ABCID" => "1212121212"
}
GET /foo/bar?contentId=DDD&_=1212121212 HTTP/1.1"
{
"message" => "GET /foo/bar?contentId=DDD&_=1212121212 HTTP/1.1\"",
"@version" => "1",
"@timestamp" => "2016-07-28T16:05:20.026Z",
"host" => "pandaadb",
"prefix" => "DDD&_",
"id" => "1212121212",
"DDDID" => "1212121212"
}
我用于此的过滤器看起来像这样:
filter {
grok {
match => {"message" => ".*contentId=%{GREEDYDATA:prefix}=%{NUMBER:id}"}
}
if [prefix] =~ "ABC" {
mutate {
add_field => {"ABCID" => "%{id}"}
}
}
if [prefix] =~ "DDD" {
mutate {
add_field => {"DDDID" => "%{id}"}
}
}
}
我希望这说明如何去做。您可以使用它来测试您的grok正则表达式:
http://grokdebug.herokuapp.com/
玩得开心!
阿图尔