背景
前回の記事の続きです!
この記事は4/4回目、最終回です。
できること
この投稿は全4回に渡ってシリーズ化する予定です!
ほかの記事もよろしければぜひご覧ください。
- Elasticsearch編: ElasticsearchをDocker上で起動して、実際に動かしてみる
- Kibana編: KibanaをDocker上で起動して、データを可視化してみる
- Filebeat編: Filebeatを利用して、ログファイルをKibanaで表示してみる
- Spring Boot編: 簡単なSpring Webアプリケーションをローカルで実行、ログを作成してそれをKibanaで可視化する
デモ編: とりあえず完成品を動かしてみる
Spring Bootとは
Spring Boot は、実行可能なスタンドアロンの本番レベルの Spring ベースのアプリケーションを作成できます。規約に従うことにより、Spring プラットフォームとサードパーティのライブラリを最小限の手間で使い始めることができ、ほとんどの Spring Boot アプリケーションは、Spring の設定が不要です。
込み入った設定をせずともいい感じにSpringアプリケーションが作成できるツールという認識でOKです。
手順
前提
それでは早速デモ用のSpring Bootアプリケーションを作成していきます。
今回はアプリケーションをローカルで動かしていきますが、Spring BootもDockerで動かしてみたいという方はこちらの記事が大変参考になりそうです!
1. Spring Initializerから新規プロジェクトを作成
spring initializerのページから、Spring Bootアプリケーションを作成してください(もちろん統合開発環境から直接作ってもOK)。今回は以下の様な設定にしましたが、適宜お好みで変えてください。
依存関係にWeb, lombokを入れるのを忘れないようにしてください。
作成したら、プロジェクトのルートディレクトリに配置してください。
最終的に以下の様なフォルダ構成になっていると思います。
- /{projectディレクトリ}/
- elasticsearch/
- elasticsearch.yml
- filebeat/
- config/
- filebeat.docker.yml
- logs/
- logging-demo.log
- Dockerfile
- config/
- logging-demo/
- ... ファイルたくさん
- docker-compose.yml
- elasticsearch/
2. リクエストを受け付けるコントローラを作成
com.example.{プロジェクト名}ディレクトリに"controller"という名前でパッケージを作成し、その下にコントローラークラス(この例ではDemoController)を作成しましょう。
3. エンドポイントを作成
次に、Getリクエストを送ったら"Helo, World"と返ってくるだけのエンドポイントを作成しましょう。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/")
public String getHello(){
return "Hello, World";
}
}
作成したら、きちんと動くか実際にリクエストを送って確かめてみましょう。
アプリケーションを実行したあと Spring Application (http://localhost:8080) にアクセスして Hello, World と返ってくるか確認してください。
確認できたら一旦停止しておきましょう。
4. ログを出力する
現在の時刻と共に"return response"というメッセージをログに残すようにコードを修正しましょう。
今回はSlf4j, Logbackというライブラリを使用します。(lombokがpomファイルに記述されていれば動作します)
@RestController
@Slf4j
public class DemoController {
@GetMapping("/")
public String getHello(){
log.info("{}: return response", LocalDateTime.now());
return "Hello, World";
}
}
再びアプリケーションを実行し、Spring Application (http://localhost:8080) にアクセスしてきちんとログが標準出力に表示されているか確認してください。
確認できたら再び停止しておきましょう。
ここまで出来たら、次にログファイルを生成しましょう。今回は src/main/resources/appication.yml というファイルに追記して設定を変更していきます。
spring.application.name={プロジェクト名}
logging.pattern.console="%clr(%d{${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${logging.pattern.level:}) %clr(${PID:}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%logger){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}"
logging.pattern.file="%d{${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}} ${logging.pattern.level:} ${PID:} --- [%t] %logger : %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}"
logging.pattern.level="%5p [${spring.application.name:},%mdc{traceId},%mdc{spanId}]"
logging.file.name=logs/${spring.application.name}.log
これはほぼデフォルトの設定と同じ表示形式ですが、今はおまじないみたいなものと思ってもらって構いません笑
(Spring Applicationのログについてもっと知りたい方はこちら)
全て終わったら今一度アプリケーションを実行し、Spring Application (http://localhost:8080) にアクセスしたあと指定したディレクトリ(src/main/resources/logs/)にログファイルがきちんと作成されているか確認してみましょう。
お疲れ様です!
確認ができたら一旦ログファイルを消去しましょう。(logフォルダは消さないでください)
ここまででアプリケーションの準備が完了したので、仕上げにdocker-compose.ymlを少し編集していきます。
5. filebeatが読み込むログファイルの変更
ルートプロジェクトに戻って、docker-compose.ymlを開きましょう。
まずは、filebeat.volumes.sourceの設定を ./filebeat/logs から ./logging-demo/logs に変更します。
...
filebeat:
...
volumes:
- type: bind
source: ./logging-demo/logs
target: /usr/share/filebeat/logs
..
最後に、filebeat/config/filebeat.docker.ymlファイルの filebeat.inputs.pathsが/usr/share/filebeat/logs/logging-demo.logになっているか確認しましょう(サンプルデータのログファイル名をlogging-demo.logにしていた方は変更の必要はありません)。
filebeat.inputs:
- type: log
paths:
- /usr/share/filebeat/logs/logging-demo.log
...
全て完了したら、まず以下のコマンドでElastic Stackを起動させましょう。
docker-compose up -d
つづけてSpring Bootアプリケーションを実行しましょう。
その後しばらく待ってKibanaし、前回のドキュメントの手順4と全く同様の手続きで、Kibana上からデータがきちんと登録されていることを確認し、index patternを設定しましょう。
最終的にKibanaのDiscoverから以下のようなグラフとログデータが表示されるところまで進めてください。
そこまできたら、検索窓にreponseと打ち込んでrefreshしてみましょう。
このキーワードに一致するログはまだ見つからないはずです。
最後に、http://localhost:8080 にもう一度アクセスしてみましょう。
すると、アプリケーション側で yyyy-MM-ddThh:mm:ss.SSS: return response
というようなフォーマットのログが生成され、それがKibanaに反映されるはずです。30秒程待って、もう一度Kibanaを開きrefreshボタンをクリックしてみましょう。(デフォルトではfilebeatがログを読みこむ時間は30秒おきになっています)
この様に検索結果が変わって新しいログを取得できた方、おめでとうございます!!
これで最終目標である「簡単なSpring Webアプリケーションをローカルで実行、ログを作成してそれをKibanaで可視化する」を達成することができました!
最後にSpringアプリケーションを停止しておきましょう。
コンテナも消去して綺麗にしておいてくださいね。
docker-compose down -v --rmi local
長いシリーズに渡ってこの記事を読んでくださりありがとうございました〜
終わりに
一つ一つは簡単でしたが、たびたび設定のミスがおきたため予想外に時間がかかってしまいました。
自分にとって未知の技術は根気よく学んでいかないとうまくいきませんね。。。
参考
- Spring Boot on Docker: https://qiita.com/tkani/items/ed56229330f00a333d5e
- spring initializer: https://start.spring.io/
- spring log settings: https://qiita.com/tag1216/items/b898b8fb58920bf335b2