私はあちこちを探していましたが、動作する解決策を見つけることができませんでした。 Logstash構成ファイル内でGrokFilterを使用して、Apache-Accessログファイルをフィルタリングしようとしています。ログメッセージは次のようになります:{"message":"00.00.0.000 - - [dd/mm/YYYY:hh:mm:ii +0000] \"GET /index.html HTTP/1.1\" 200 00"}.
現時点では、grok { match => [ "message", "%{IP:client_ip}" ] }
を使用してのみクライアントIPをフィルタリングできました。
フィルタリングしたい:
- The GET method,
- requested page (index.html),
- HTTP/1.1\,
- server response 200
- the last number 00 after 200 inside the message body
これらのどれも私にとっては機能しないことに注意してください:
grok { match => { "message" => "%{COMBINEDAPACHELOG}" } }
または
grok { match => [ "message", "%{COMBINEDAPACHELOG}" ] }
grok {
match => [ "message", "%{IP:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:Apache_timestamp}\] \"%{Word:method} /%{NOTSPACE:request_page} HTTP/%{NUMBER:http_version}\" %{NUMBER:server_response} " ]
}
Grokデバッガーを使用して、ログ形式を完全に一致させます。その唯一の方法。
これにはCOMBINEDAPACHELOG
パターンを使用できます。
%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{Word:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent}
たとえば、このサンプルのApacheログについて考えてみます。
111.222.333.123ホーム-[01/Feb/1998:01:08:46 -0800] "GET /bannerad/ad.htm HTTP/1.0" 200 28083 " http://www.referrer.com/bannerad /ba_intro.htm ""Mozilla/4.01(Macintosh; I; PPC) "
上記のフィルターは、
{
"clientip": [
[
"111.222.333.123"
]
],
"HOSTNAME": [
[
"111.222.333.123"
]
],
"IP": [
[
null
]
],
"IPV6": [
[
null
]
],
"IPV4": [
[
null
]
],
"ident": [
[
"HOME"
]
],
"USERNAME": [
[
"HOME",
"-"
]
],
"auth": [
[
"-"
]
],
"timestamp": [
[
"01/Feb/1998:01:08:46 -0800"
]
],
"MONTHDAY": [
[
"01"
]
],
"MONTH": [
[
"Feb"
]
],
"YEAR": [
[
"1998"
]
],
"TIME": [
[
"01:08:46"
]
],
"HOUR": [
[
"01"
]
],
"MINUTE": [
[
"08"
]
],
"SECOND": [
[
"46"
]
],
"INT": [
[
"-0800"
]
],
"verb": [
[
"GET"
]
],
"request": [
[
"/bannerad/ad.htm"
]
],
"httpversion": [
[
"1.0"
]
],
"BASE10NUM": [
[
"1.0",
"200",
"28083"
]
],
"rawrequest": [
[
null
]
],
"response": [
[
"200"
]
],
"bytes": [
[
"28083"
]
],
"referrer": [
[
""http://www.referrer.com/bannerad/ba_intro.htm""
]
],
"QUOTEDSTRING": [
[
""http://www.referrer.com/bannerad/ba_intro.htm"",
""Mozilla/4.01 (Macintosh; I; PPC)""
]
],
"agent": [
[
""Mozilla/4.01 (Macintosh; I; PPC)""
]
]
}
ここでテストできます、
以下を使用してください。
filter {
grok {
match => { "message" => "%{COMMONAPACHELOG}" }
}
}
パターンからわかるように、COMBINEDAPACHELOG
は、いくつかの不足しているコンポーネントがあるために失敗します。
COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}
https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns