あるシステムでアクセスログの保存先にElasticsearchを使用しているということで、 何かに活用できないかデータを少し見せてもらいました。
AWSの機能でElasticsearch + Kibanaを立ち上げてFluentdでサーバからログを転送しているそうです。
ApacheのアクセスログをKibanaから確認します。 CSSやAjaxっぽいログも混じるので使えそうなデータのみに絞ります。

ログはJSON形式で保存されKibanaの画面からElasticsearchへクエリを発行することができます。 Kibanaではログのフィルタを Luceneクエリ という書式で指定します。
Pythonから
Pythonから呼ぶには
elasticsearch モジュールを利用します。
https://elasticsearch-py.readthedocs.io/en/master/
pip install elasticsearch
先ほどの画面のグラフの下を開くとKibanaがElasticsearchに発行しているクエリを見ることができます。 コピペしてそのまま動作するのでLuceneクエリをElasticsearchのクエリに変換する手間が省けます。

ソース
from elasticsearch import Elasticsearch
# この部分はKibanaから持ってくると楽
body = {
"query": {
"filtered": {
"query": {
"query_string": {
"query": "path:(artist,album,song) AND NOT(path:(fpg,search,ranking)) AND code:200",
"analyze_wildcard": True
}
}
}
},
"size": 10,
"sort": [
{
"@timestamp": {
"order": "desc",
"unmapped_type": "boolean"
}
}
],
}
es = Elasticsearch(ES_HOST, port=80)
res = es.search(
index='fpg-stg-t00.httpd.access.log*',
body=body)
print("Got %d Hits:" % res['hits']['total'])
for hit in res['hits']['hits']:
print("%(@timestamp)s %(path)s" % hit["_source"])
実行結果
Got 365 Hits:
2016-12-16T17:01:36+09:00 /data/song7636/?part=18
2016-12-16T17:00:53+09:00 /data/album5278/
2016-12-16T17:00:42+09:00 /data/album5878/
2016-12-16T17:00:36+09:00 /data/album5296/
2016-12-16T17:00:24+09:00 /data/art2819/
2016-12-16T16:58:55+09:00 /data/album5288/
2016-12-16T16:58:48+09:00 /data/album5878/
2016-12-16T16:57:21+09:00 /data/song4628/
2016-12-16T16:56:49+09:00 /data/album2878/
2016-12-16T16:56:43+09:00 /data/album5288/
まとめ
少し試してみたところ画面でアクセスしてから30秒くらい遅れて検索で返ってきました。 データ量があまり多くないからか結果は一瞬で返ってくるのでそのあたりは本番でも確認してみたいと思います。
松木佑徒