logstashでltsvをパースしESへ保存について


(齋藤哲也) #1

識者の皆様
初めて投稿をさせていただきます
よろしくお願い申し上げます

今回、私は以下の様な環境の構築を目指しております
解析対象:nginxのアクセスログ(ltsv形式)

上記の解析対象のnginxにはfilebeat-1.2.3-1をinstallしてlogstashにアクセスログを送信しています
logstashはlogstash-2.3.2-1を利用しており、logstashのconfigは以下の通りのようなconfigを設定しています
【logstash-config】
input {
beats {
port => 5044
}
}
#input { stdin {} }

filter {
kv {
field_split => "\t"
value_split => ":"
}
date {
match => [time, "'['dd/MMM/YYYY:HH:mm:ss Z']'"]
locale => us
}
useragent {
source => ua
prefix => "ua."
}
mutate {
convert => {
status => integer
reqtime => integer
size => integer
}
}
}

#output {

stdout {

codec => rubydebug

}

#}
output {
elasticsearch {
hosts => "ip-address:9200"
}
}

上記の設定をして、アクセスログの送信元であるnginxからfilebeatsを利用してlogstash向けにアクセスログを送信をしたのですが、elasticache側にnginxのアクセスログが保存されない状況です
logstashの/var/log/logstash/logstash.logにはfilebeatsから送信をされてきたltsvのアクセスログが記録されている状況でlogstash.confのfilterが上手く適用をされていない状況です

一度、デバックの為に、outputをrubydebugに設定をして、nginxからfilebeats経由でアクセスログを送信した所、/var/log/logstash/logstash.stdoutには、nginxからfilebeats経由で送信されてきたアクセスログがjson形式でパースされて保存をされていました

色々と試行錯誤をしながら、検証を進めているのですが、今のところ解決策が見えない状況です
この問題を解決するためには、どのように対応すればよいかご指導をいただけますと幸いです

また、elasticsearch(3ノード)+kibanaに関しては、下記、サイトを参考に構築をしております
どうぞよろしくお願い申し上げます
【参考サイト】


(Jun Ohtani) #2

logstashのログやElasticsearchのログにエラーなどは出ていないでしょうか?


(齋藤哲也) #3

Ohtani-san

ご指導を頂きまして、有難うございます
あれから、試行錯誤を繰り返し、logstashの設定を下記のように設定をした所、kibanaにデータを登録することが出来ました

【logstash.conf】

input {
beats {
port => 5044
}
}

filter {

LTSV形式用

kv {
field_split => "\t"
value_split => ":"
}
mutate {
# "2015-08-02 09:51:35,117" -> "2015-08-02 09:51:35"
gsub => [ time, ",[\d][\d][\d]", ""]
# messageフィールドの削除
remove_field => [ "message" ]
}
date {
# timeフィールドを日付形式へ変換(@timestamp
match => [ time, "YYYY-MM-dd HH:mm:ss" ]
timezone => "Asia/Tokyo"
}
}

output {
elasticsearch {
hosts => "10.10.11.232"
index => "logstash-%{+YYYY.MM.dd}"
manage_template => false
}
}

この設定でkibanaでlogstash、@timestampでindexを作成をして、Discoverのタブでデータを確認していると
下記のようなエラーがkibanaのDiscoverのタブに出力をされます
【kibana-Discover-error】
Error: unknown error
ErrorAbstract@http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:64853:29
Generic@http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:64899:22
respond@http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:66222:34
checkRespForFailure@http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:66183:15
http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:64801:10
processQueue@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:41883:31
http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:41899:40
$eval@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:43127:29
$digest@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:42938:37
$apply@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:43235:32
done@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:37684:54
completeRequest@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:37882:16
requestError@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:37833:25

また、kibanaのkibana.stdoutには下記の様なerrorが記録されています
【/var/log/kibana.stdoutのlog】
{"type":"log","@timestamp":"2016-08-19T01:54:47+00:00","tags":["warning","elasticsearch"],"pid":22181,"message":"Unable to revive connection: http://10.10.11.36:9200/"}
{"type":"log","@timestamp":"2016-08-19T01:54:47+00:00","tags":["warning","elasticsearch"],"pid":22181,"message":"No living connections"}
{"type":"response","@timestamp":"2016-08-19T01:54:47+00:00","tags":[],"pid":22181,"method":"post","statusCode":502,"req":{"url":"/elasticsearch/logstash-/_field_stats?level=indices","method":"post","headers":{"host":"10.10.11.64:5601","user-agent":"Mozilla/5.0
(Macintosh; Intel Mac OS X 10.10; rv:47.0) Gecko/20100101
Firefox/47.0","accept":"application/json, text/plain, */","accept-language":"ja,en-US;q=0.7,en;q=0.3","accept-encoding":"gzip,

deflate","content-type":"application/json;charset=utf-8","kbn-version":"4.5.4","referer":"http://10.10.11.64:5601/app/kibana","content-length":"178","connection":"keep-alive"},"remoteAddress":"192.168.200.41","userAgent":"192.168.200.41","referer":"http://10.10.11.64:5601/app/kibana"},"res":{"statusCode":502,"responseTime":3,"contentLength":9},"message":"POST
/elasticsearch/logstash-*/_field_stats?level=indices 502 3ms - 9.0B"}

これは、どのように対応すれば解決できますでしょうか
ご指導をよろしくお願い申し上げます


(Jun Ohtani) #4

KibanaのあるマシンからElasticsearchへの接続ができているかは確認されていますか?
また、Elasticsearchのログは確認されていますか?

あと、エラーログや設定はMarkdownの```でくると見やすくできるので、活用してください。

こんな感じ

(齋藤哲也) #5

Ohtani様

ご指導ありがとうございます
kibanaからelasticsearchに関しては接続ができています
【確認方法】
telnet elasticsearch 9200
※上記のcliでkibanaからelasticsearchの9200にtelnetの接続ができています

また、elasticsearchの/var/log/elasticsearch.logには下記の様なlogが記録されていました
【elasticsearch.log】

[2016-08-21 01:00:00,002][INFO ][marvel.agent.exporter.local] local exporter [default_local] - cleaning up [1] old indices
[2016-08-21 01:00:00,095][ERROR][marvel.agent.exporter.local] local exporter [default_local] - failed to delete indices
RemoteTransportException[[Bird-Man][10.10.11.90:9300][indices:admin/delete]]; nested: IndexNotFoundException[no such index];
Caused by: [.marvel-es-1-2016.08.14] IndexNotFoundException[no such index]
    at org.elasticsearch.cluster.metadata.MetaDataDeleteIndexService$1.execute(MetaDataDeleteIndexService.java:91)
    at org.elasticsearch.cluster.ClusterStateUpdateTask.execute(ClusterStateUpdateTask.java:45)
    at org.elasticsearch.cluster.service.InternalClusterService.runTasksForExecutor(InternalClusterService.java:468)
    at org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:772)
    at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:231)
    at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:194)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
[2016-08-21 05:43:38,478][ERROR][license.plugin.core      ] [Robert da Costa] 
#
# License will expire on [Friday, September 09, 2016]. If you have a new license, please update it.
# Otherwise, please reach out to your support contact.
# 
# Commercial plugins operate with reduced functionality on license expiration:
# - marvel
#  - The agent will stop collecting cluster and indices metrics
#  - The agent will stop automatically cleaning indices older than [marvel.history.duration]

このような状況なのですが、どのような対策が考えられるでしょうか


(Jun Ohtani) #6

このログはKibanaとはおそらく関係ないかと。
Kibanaでエラーが出た時間帯でログは出てないでしょうか?

Kibanaのログだと、Esのサーバ(10.10.11.36)へのコネクションがおかしいと出ています。
Discoverを見ていると時々エラーが出るということでしょうか?
それとも、最初からエラーが出るんでしょうか?


(齋藤哲也) #7

Ohtani様

ご指導ありがとうございます
現状として、以下の2点で問題があると認識しています
1.kinabaのDiscoverのタブを選択をしており、リフレッシュ時間を30秒とかに設定しておくと、時々エラーが発生をして、そのエラーのmore infoのクリックすると、下記の様なerrorが出てきます
【エラー】

Error: unknown error
ErrorAbstract@http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:64853:29
Generic@http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:64899:22
respond@http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:66222:34
checkRespForFailure@http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:66183:15
http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:64801:10
processQueue@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:41883:31
http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:41899:40
$eval@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:43127:29
$digest@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:42938:37
$apply@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:43235:32
done@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:37684:54
completeRequest@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:37882:16
requestError@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:37833:25

2.Discoverのタブでlogstash-*のAvailable Fieldsでhostのindexをクリックして、Visualizeをクリックしてhostのの状況を可視化をしようとすると、下記の様エラーになります
【エラー】

Error: Request to Elasticsearch failed: {"error":{"root_cause":[{"type":"illegal_state_exception","reason":"Field data loading is forbidden on [host]"}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"logstash-2016.08.22","node":"z0aT3-4PSX6pALMasGgPUw","reason":{"type":"illegal_state_exception","reason":"Field data loading is forbidden on [host]"}}]}}
KbnError@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:61367:21
RequestFailure@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:61400:6
callResponseHandlers/<@http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:90178:39
__WEBPACK_AMD_DEFINE_RESULT__</</Promise.try@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:63911:20
__WEBPACK_AMD_DEFINE_RESULT__</</Promise.map/<@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:63880:17
__WEBPACK_AMD_DEFINE_RESULT__</</Promise.map@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:63879:27
callResponseHandlers@http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:90150:15
fetchWithStrategy/<@http://10.10.11.64:5601/bundles/kibana.bundle.js?v=10000:89651:17
processQueue@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:41883:29
scheduleProcessQueue/<@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:41899:28
$RootScopeProvider/this.$get</Scope.prototype.$eval@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:43127:17
$RootScopeProvider/this.$get</Scope.prototype.$digest@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:42938:16
$RootScopeProvider/this.$get</Scope.prototype.$apply@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:43235:14
done@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:37684:37
completeRequest@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:37882:8
requestLoaded@http://10.10.11.64:5601/bundles/commons.bundle.js?v=10000:37823:10

これもkibanaに問題ではなくelasticseachに問題でしょうか?
それとも、filebeats→logstash経由で正しくelasticsearchにdataが登録されていないことが原因なのでしょうか


(Jun Ohtani) #8

2に関してはhostというフィールドがAggregationに向いていないフィールドになっているかと。
おそらhost.rawというようなフィールドがあると思うでのそちらを使用してみてください。


(齋藤哲也) #9

ohtani様

ご指導ありがとう御座います
host.raw という項目はsettingsの中のfieldsにあるのですが、Discoverの項目の中にはhost.rawという項目はありません
これは、別途、index等の設定が必要なのでしょうか?


(Jun Ohtani) #10

Visualizeの画面では選択できます。

Discoverでは、基本的には表示できる項目が出ているだけです。
Available Fieldsの横にある設定ボタンをmissingのフィルタを外せば表示はされます。


(齋藤哲也) #11

ohtaniさん

頂いいたご指導で試した所、host.rawの項目を表示できました
そこで、Visualizeをクリックすると、hostの可視化も出来たのですが、再度、discoverの項目に行くと
host.rawが消えていました

これは都度、Hide Missing Fieldsのチェックをはずさないと行けないのでしょうか?
常時、Hide Missing Fieldsの項目させることはできないのでしょうか


(Jun Ohtani) #12

現状はないかと。必要そうであれば、KibanaのGitHubのIssueに追加をお願いします。


(system) #13