ELK スタックをセットアップし、Squid ログ エントリを解析しようとしています。
そして、次のUNIX/Epoc時間を変換しようとすると問題が発生します。
1442469455.757
人間が読める形式に変換します。
トラブルシューティング中に次のエラーが発生します。
設定した文字エンコードとは異なるイベントを受信しました。
"_dateparsefailure"
これには失敗したことを示すタグが付いています。
私は以下のlogstashフィルターを使用しました
filter {
if [type] == "squid" {
grok {
patterns_dir => [ "/etc/logstash/patterns" ]
match => { message => "%{SQUID_LOG}" }
}
date {
match => [ "timestamp", "UNIX" ]
}
}
}
メイン パターンのタイムスタンプと一致するように定義された正規表現パターンは次の"%{SQUID_LOG}"
とおりです。(%{DATA:timestamp})
これに対する恒久的な解決策または回避策があるかどうかお知らせください。
前もって感謝します。
アップデート:
これは、以下に示すように、タイムスタンプの後の余分なスペースが原因であると思われます。
value=>"1438744871.647\\xA0\\xA0\\xA0\\xA0\\xA0", :exception=>"Invalid UNIX epoch value '1438744871.647\\xA0\\xA0\\xA0\\xA0\\xA0'", :config_parsers=>"UNIX", :config_locale=>"default=en_GB", :level=>:warn
'\\xA0\\xA0\\xA0\\xA0\\xA0'
タイムスタンプの後のそれらを取り除く方法はありますか?
設定:
input { stdin { } }
filter {
grok {
match => { message => "((%{DATA:time_stamp}) (%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))" }
add_tag => "NONU"
}
mutate {
strip => [ "time_stamp" ]
}
date {
match => [ "time_stamp", "UNIX" ]
}
}
output {
stdout { codec => rubydebug }
}
サンプルデータ:
1442469456.136 1 19.108.217.100 DENIED/407 3864 CONNECT fei.wsp.microsoft.com:443 - HIER_NONE/- text/html -
答え1
エラーが実際にフィールド内の余分な空白によって発生している場合は、フィルターをtime_stamp
使用してそれを除去できます。フィルターは次のようになります。mutate
strip
filter {
if [type] == "squid" {
grok {
patterns_dir => [ "/etc/logstash/patterns" ]
match => { message => "%{SQUID_LOG}" }
}
mutate {
strip => ["time_stamp"]
}
date {
match => [ "time_stamp", "UNIX" ]
}
}
}
アップデート
すべてのログ エントリのタイムスタンプの後に 6 個の余分なスペースがある場合は、次のように grok パターンを更新します。time_stamp
との間の余分なスペースに注意してくださいtime_epapsed_ms
。
((%{DATA:time_stamp}) (%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))
6 スペースより多いか少ない可能性がある場合は、次のようにします。
((%{DATA:time_stamp})%{SPACE}(%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))
答え2
これは SQUID_LOG の解析に問題があるのではないかと思います (トークンが欠落しているか、間違った場所にあるなど)。
フィルター コードを次のコードの間に挿入すると、さらに詳しく表示できます。
input {
file {
path => "/opt/logstash/squid.log"
type => "squid"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
[filter]
output {
stdout { codec => rubydebug }
}
/opt/logstash/squid.log には、問題のあるログ行がいくつか記録されています。
と:
/opt/logstash/bin/logstash -f this_test_conf_file.conf
何が起こっているのかは画面上で確認できます。