2017-03-02 88 views
1

我试图在日志中记录一条消息,但它的失败与_grokparsefailure,但实际上并没有说明它失败的原因。该神交查询工作在https://grokdebug.herokuapp.com/Logstash grok失败

input { 
    file { 
    type => "apache-access" 
    path => "C:/prdLogs/sent/*" 
} 
    filter { 
    grok { 
    match => ['message', '%{IP:clientip} - - \[%{GREEDYDATA:raw_timestamp} \] "%{WORD:httpmethod} %{NOTSPACE:referrer} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} "-" "%{NOTSPACE:request}" %{QS:UserAgent} %{WORD:httpmethodO} - - HTTP/%{NUMBER:httpversion2} "%{WORD:session}:%{WORD:httpmed}" "-" %{NUMBER:duration}' ] 
} 
    date { 
    match => [ "raw_timestamp" , 'dd/MMM/yyyy:HH:mm:ss Z' ] 
    target => '@timestamp' 
    } 
    } 

    output { 
elasticsearch { hosts => ["111.44.44.44:9200"] } 
    } 

的数据是这样的:

199.77.22.22 - - [26/Feb/2017:10:18:45 +0800] "GET /myapp/app/i18n/key/parent.selector.label.select.item/?locale=en_GB&dojo.preventCache=1488075524942 HTTP/1.1" 200 "-" "https://mywebsite.here.com:31000/myApp/home.do" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Tablet PC 2.0)" GET - - HTTP/1.1 "0000bKOk4n4SSBHuyJJKed085D6:1ap8u8p8j" "-" 3203 
199.77.22.22 - - [26/Feb/2017:10:18:45 +0800] "GET /myapp/app/i18n/key/parent.selector.label.no.recently.used/?locale=en_GB&dojo.preventCache=1488075525483 HTTP/1.1" 200 "-" "https://mywebsite.here.com:31000/myApp/home.do" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Tablet PC 2.0)" GET - - HTTP/1.1 "0000bKOk4n4SSBHuyJJKed085D6:1ap8u8p8j" "-" 3159 
199.77.22.22 - - [26/Feb/2017:10:18:46 +0800] "GET /myapp/app/i18n/key/selector.label.selected/?locale=en_GB&dojo.preventCache=1488075525843 HTTP/1.1" 200 "-" "https://mywebsite.here.com:31000/myApp/home.do" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Tablet PC 2.0)" GET - - HTTP/1.1 "0000bKOk4n4SSBHuyJJKed085D6:1ap8u8p8j" "-" 3600 
199.77.22.22 - - [26/Feb/2017:10:18:46 +0800] "GET /myapp/app/i18n/key/actor.selector.label.remove.all/?locale=en_GB&dojo.preventCache=1488075526305 HTTP/1.1" 200 "-" "https://mywebsite.here.com:31000/myApp/home.do" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Tablet PC 2.0)" GET - - HTTP/1.1 "0000bKOk4n4SSBHuyJJKed085D6:1ap8u8p8j" "-" 3224 
199.77.22.22 - - [26/Feb/2017:10:18:46 +0800] "GET /myapp/app/i18n/key/com.label.filter.objects/?locale=en_GB&dojo.preventCache=1488075526711 HTTP/1.1" 200 "-" "https://mywebsite.here.com:31000/myApp/home.do" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Tablet PC 2.0)" GET - - HTTP/1.1 "0000bKOk4n4SSBHuyJJKed085D6:1ap8u8p8j" "-" 3299 

这实际上是一个Apache的访问日志,但我无法使用COMBINEDAPACHELOG或COMMONAPACHELOG。其实相同的错误!

elasticsearch中的所有条目都被标记为“_grokparsefailure”。我在调试模式下使用log.level运行logstash,但在日志中没有看到任何错误。

我正在使用最新版本的logstash。

请指教。 。

R2-D2谢谢,我试过,但没有喜悦:(

我创建了一个模式文件,并粘贴你的模式我只是改变了有效载荷只是“130.39.22.22 - - [23 /月/ 2015年: 10点18分45秒+0800]”和下面是我的过滤器:

filter { 

grok { 
     patterns_dir => ["c:/logstashconfig/patterns"] 
     match => ['message', '%{IP:clientip} - - /[%{DATE_CUSTOM:timestamp}/]'] 
    } 
date { 
    match => [ "timestamp" , 'dd/MMM/yyyy:HH:mm:ss Z' ] 
    target => '@timestamp' 
    } 
} 

的调试日志logstash:

{ 
     "path" => "C:/prdLogs/sent/test", 
"@timestamp" => 2017-03-03T00:06:15.269Z, 
     "@version" => "1", 
     "host" => "hkw20012125", 
    "message" => "130.39.22.22 - -  [23/Feb/2015:10:18:45 +0800]\r", 
     "type" => "apache-access", 
     "tags" => [ 
    [0]  "_grokparsefailure" 
] 
} 

任何想法是它+0800在数据结束? 谢谢秒。

+0

是的,这是+0800,因为模式只捕捉'26/Feb/2017:10:18:45'。所以肯定会抛出Grok解析失败。删除'+ 0800'并查看 – Kulasangar

+0

谢谢!得到它的工作,我也认为你犯了一个错字“\ [%{DATE_CUSTOM:timestamp}]”。我认为这将是\ [%{DATE_CUSTOM:timestamp} \]“,因为我认为自有效载荷时间戳有括号,我需要逃脱两者,但这不是这种情况! – Kalim

+0

干杯,很高兴它有帮助:) – Kulasangar

回答

0

我认为一旦你在你的模式有GREEDYDATA,这意味着考虑您的线路从日志休息:

GREEDYDATA的模式如下:

GREEDYDATA .* <-- means to capture the entire line 

而且你神交比赛应该看起来像这样,如果我没有弄错:

grok { 
    match => ['message', '%{IPV4:clientip} - - %{GREEDYDATA:data}'] 
} 

除非你需要的值被分开提取,以上grok应该为你做的伎俩。我认为你匹配timestamp的方式是错误的。为了处理您的timestamp你需要有你的模式内的以下模式文件:

MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9]) 
MONTH \b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b 
YEAR (?>\d\d){1,2} 
TIME (?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9]) 
DATE_CUSTOM %{MONTHDAY}[/]%{MONTH }[/]%{YEAR}:%{TIME} 

然后你可以简单的grok比赛中使用这样的:

grok { 
    match => ['message', '%{IPV4:clientip} - - \[%{DATE_CUSTOM:timestamp} %{GREEDYDATA:data}'] 
} 

现在,你会能够匹配timestamp为:

date { 
    match => [ "timestamp" , 'dd/MMM/yyyy:HH:mm:ss Z' ] 
    target => '@timestamp' 
} 

希望这有助于!

+0

谢谢,我当然认为你在这里的东西!!我测试了缩短的数据/配置,它不'我似乎无法得到时间,因此使用greedydata。关于如何提取[26/Feb/2017:10:18:45 +0800]的任何想法?但我看不出有什么功能,我使用goo.gl/oePmZS的例子,我基本上想从消息中提取数据,然后添加client_ip,request_url等字段以及更新时间戳 – Kalim

+0

I已经更新了答案,我已经测试过了,它可以工作或你的时间戳!让我知道它是否适合你:) – Kulasangar

+0

@Kalim请注意,我只提取'timestamp'的日志行中的'26/Feb/2017:10:18:45'部分。你可以随心所欲地提取它! – Kulasangar

0

当你必须建立自己的模式,从左侧开始,慢慢地,并使用debugger

如果你测试了此模式:

%{IP:clientip} - - \[ 

它的工作原理,但是这一个:

%{IP:clientip} - - \[%{GREEDYDATA:raw_timestamp} \] 

没有。将您的模式与输入进行比较可以看出,时间戳和近端括号之间没有空格。

改变模式的这一部分:

%{IP:clientip} - - \[%{GREEDYDATA:raw_timestamp}\] 

作品。

+0

谢谢。对不起,我的坏,不知何故,我在表单中的代码编辑空间,但在其实际配置中没有空格 – Kalim