背景
前回の記事の続きです!
この記事は3/4回目です。
できること
この投稿は全4回に渡ってシリーズ化する予定です!
ほかの記事もよろしければぜひご覧ください。
- Elasticsearch編: ElasticsearchをDocker上で起動して、実際に動かしてみる
- Kibana編: KibanaをDocker上で起動して、データを可視化してみる
- Filebeat編: Filebeatを利用して、ログファイルをKibanaで表示してみる
- Spring Boot編: 簡単なSpring Webアプリケーションをローカルで実行、ログを作成してそれをKibanaで可視化する
デモ編: とりあえず完成品を動かしてみる
Filebeatとは
Filebeatは、ログデータを転送して一元管理するための軽量なシッパーです。サーバーにエージェントとしてインストールされたFilebeatは、指定されたログファイルまたはロケーションを監視し、ログイベントを収集して、インデックス作成のためにElasticsearchまたはLogstashに転送します。(訳)
今回の目的ではざっくり、ファイルの変化を検出して、新しく追加されたデータをElasticsearchに送るツールと捉えてもらって大丈夫です。
手順
それでは早速filebeatをDocker上で起動していきます。
前提
1. ファイルの準備
以下の様なフォルダ構成にします。(今回追加するファイル・フォルダのみに焦点をあてて説明します)
ちょっと今までよりも色々なファイルを準備する分、大変かもしれませんが頑張りましょう!
- /{projectディレクトリ}/
- elasticsearch/
- elasticsearch.yml
-
filebeat/
-
config/
- filebeat.docker.yml
-
logs/
- logging-demo.log
- Dockerfile
-
config/
- docker-compose.yml
- elasticsearch/
2. dockerの準備
今回はイメージを直接利用するのではなく、少しカスタマイズしたいのでDockerfileを記述していきます。
FROM docker.elastic.co/beats/filebeat:7.13.0
COPY config/filebeat.docker.yml /usr/share/filebeat/filebeat.yml
USER root
RUN chown root:filebeat /usr/share/filebeat/filebeat.yml
USER filebeat
ここでは主に、ローカルの設定ファイルをコンテナ内の必要な場所にコピーする処理を追記しています。
次に、docker-compose.ymlファイルを以下の様に追記します
version: '3.2'
services:
...
filebeat:
build:
context: filebeat/
hostname: filebeat101
container_name: con-filebeat
networks:
- elastic
volumes:
- type: bind
source: ./filebeat/logs
target: /usr/share/filebeat/logs
depends_on:
- elasticsearch
...
networks:
elastic:
driver: bridge
ほとんど前回までに出てきたものと同じ様な設定だと思います。
imageの代わりにbuild.contextでDockerfileのあるパスを指定してあげることで、Dockerfileからイメージをビルドしてコンテナを作成する様になります。
3. filebeatの設定ファイルの準備
filebeat.docker.ymlを以下の様に編集します
filebeat.inputs:
- type: log
paths:
- /usr/share/filebeat/logs/logging-demo.log
setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"
output.elasticsearch:
hosts:
- "elasticsearch:9200"
index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"
この設定は最初のセクションでfilebeatが読み込むべきログファイルを指定します。
次のセクションで、index templateを設定していきます。各ログデータは特定のindexと呼ばれる識別子を持っており、index templateとはこのログファイルから抽出したデータを検索する際の共通の識別子です(今回はデフォルトをそのまま使っているので省いてしまっても構いません)。詳しくは公式の説明をご確認ください。
最後のセクションでは、データの出力先を指定しています。ここではコンテナの具体的なIPアドレスがわからないため、Dockerfileのサービス名(elasticsearch)をホストとして利用しています。
indexの設定では、各ログデータにつけるindex(識別子)のパターンを指定しています。今回はこれもデフォルトと同じで、filebeatのバージョンとタイムスタンプからindexを生成するようにしています。
その他の設定も気になる方はこちらからご覧ください。
3. ログファイルの準備
最後にfilebeatが読み込むためのログファイルを準備します。
なんでもいいのですが、この記事の最終目的であるSpring Bootアプリケーションのログモニタリングを意識して、Spring Bootのログフォーマットに近いログを適当に用意したのでコピペして使ってみてください。
2021-06-26 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
2021-06-26 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-06-26 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms
2021-06-26 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2021-06-26 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*
4. 実行されているか確認する
以下のコマンドを実行してしばらく待機ます(起動まで2~5分程かかります)。
docker-compose up -d
その後、filebeatがログを読み込んでElasticsearchにデータを送信できているか確認するために、filebeatによって作成されたインデックスパターンのログが存在するか検証するリクエストを送ってみましょう。
以下のコマンドをターミナルから入力して実行してみてください。
curl -XGET "http://localhost:9200/filebeat-*/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"match_all": { }
},
"sort": [
{
"@timestamp": "desc"
}
]
}'
以下の様なレスポンスが返ってきたら成功です。
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
...
4. Kibanaでログデータを表示する
これをKibanaで表示するにはもう少し作業が必要になります。
初回のみKibanaに手動でindex patternを登録する必要があるので、Kibana (http://localhost:5601) にアクセスして、ホーム左上のアイコンからStack Management > Index Patterns へと進んでCreate Index Patternを選択してください。
次に、"sel"の欄にfilebeat-*と選択して次へ進んでください。
その後、time fieldの欄のドロップダウンから@timestampを選択し、index patternを作成してください。
これで無事準備が整ったので、メニューからAnalytics > Discoverへと進みましょう。
左にあるドロップダウンから作成されたindex patternが選択されていることを確認します。
その後、検索範囲をfilebeatを実行した日の0:00 ~ 翌日の0:00に設定して再検索してみましょう。
上の画像のようにグラフや検索結果が出てきたら見事成功です。お疲れ様でした!!
最後にコンテナを消去して綺麗にしておきましょう。
docker-compose down -v --rmi local
次回はいよいよ最後、Spring Bootアプリケーションのログをこれらのツールを利用してモニタリングしていきます。
Elastic StackをDocker上で実行してログモニタリングサービスを作成するまで④ - Spring Boot編
参考
- filebeat configuration: https://www.elastic.co/guide/en/beats/filebeat/current/configuring-howto-filebeat.html
- index template: https://www.elastic.co/guide/en/beats/filebeat/current/configuration-template.html
- kibana index pattern registration: https://www.elastic.co/guide/en/kibana/current/index-patterns.html