この記事は最終更新日から1年以上が経過しています。
あるシステムでアクセスログの保存先に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秒くらい遅れて検索で返ってきました。
データ量があまり多くないからか結果は一瞬で返ってくるのでそのあたりは本番でも確認してみたいと思います。
この記事を書いた人
最近書いた記事
- 2021.12.10React NativeでWallet風UIを実装する
- 2018.11.19Elasticsearchで簡単な検索とscoreを調整する方法
- 2018.10.05ECSをEC2からFargateに切り替える際の注意点
- 2018.09.12AKB48グループ映像倉庫のWeb版をリリースしました