やりたいこと
Windows7 環境でアプリケーションのアクセスログをKibanaで可視化できるようにしてみたので、メモを書きます。
以下の方にお役に立れば幸いです。
* Spring bootを利用してアプリをできた状態
* サーバはTomcatを利用しています
* アプリの可視化をしていきたい
現時点のソフトのバージョンリスト
* Java 1.8
* Spring Boot 2.1.0
* Tomcat 9
* td-agent 3.2.1
* elasticsearch 6.5.3
* kibana 6.5.3
※ 初めて記事を書きますので、ご不明点、アドバイスがあれば、ぜひコメントしてください!
アプリ可視化のために、アクセスログ出力の設定
Spring bootからtomcatアクセスログ出力に関して、fintanの記事を参考しました。
logback-access.xmlは以下のように設定しました。
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>./log/access.log</file>
<encoder>
<pattern>host:%h	timeLog:%t{yyyy/MM/dd HH:mm:ss}	user:%u	method:%m	uri:%U%q	protocol:%H	status:%s	thread:%I</pattern>
</encoder>
</appender>
実際出力されたログ(LTSV形式):
host:127.0.0.1 timeLog:2018/12/16 17:35:07 user:user1@example.com method:GET uri:/questions/94 protocol:HTTP/1.1 status:200 thread:http-nio-8080-exec-4
host:127.0.0.1 timeLog:2018/12/16 17:35:07 user:user1@example.com method:GET uri:/questions/94 protocol:HTTP/1.1 status:200 thread:http-nio-8080-exec-4
host:127.0.0.1 timeLog:2018/12/16 17:35:07 user:user1@example.com method:GET uri:/questions/94 protocol:HTTP/1.1 status:200 thread:http-nio-8080-exec-4
host:127.0.0.1 timeLog:2018/12/15 17:35:07 user:user1@example.com method:GET uri:/questions/94 protocol:HTTP/1.1 status:200 thread:http-nio-8080-exec-4
host:127.0.0.1 timeLog:2018/12/15 17:35:07 user:user2@example.com method:GET uri:/questions/94 protocol:HTTP/1.1 status:200 thread:http-nio-8080-exec-4
host:127.0.0.1 timeLog:2018/12/15 17:35:07 user:user3@example.com method:GET uri:/questions/94 protocol:HTTP/1.1 status:200 thread:http-nio-8080-exec-4
host:127.0.0.1 timeLog:2018/12/15 17:35:07 user:user4@example.com method:GET uri:/questions/94 protocol:HTTP/1.1 status:200 thread:http-nio-8080-exec-4
...
環境構築
Fluentdのインストール
Fluentdのインストールはホームページからダウンロードします。
Installing Fluentd using .msi Installer (Windows)
上記リンクのStep 2まで動作確認ができればOKです。
Elasticsearchのインストール
Elasticsearchのインストールはホームページから最新のバージョンをダウンロードします。
Zipファイルを展開します。
展開先の参考例 C:\tool\elasticsearch-6.5.3
elasticsearchの起動ファイル C:\tool\elasticsearch-6.5.3\bin\elasticsearch.bat
動作確認
Elasticsearchを起動し、ブラウザで http://localhost:9200 を開くと、Elasticsearchの情報を表示できればOKです。
Kibanaのインストール
KibanaのインストールはElasticsearchと同じホームページから最新のバージョンをダウンロードします。
KibanaのバージョンはElasticsearchのバージョンと合わせた方がいいです。
違うバージョンで一部の機能が利用できないの可能性があります。
展開先の参考例
C:\tool\kibana-6.5.3
kibanaの起動ファイル C:\tool\kibana-6.5.3\bin\kibana.bat
動作確認
Kibanaを起動し、ブラウザで http://localhost:5601 を開くと、GUI 画面が表示できればOKです。
Fluentdの設定
設定はtd-agent.confファイルで行います。
C:\opt\td-agent\etc\td-agentの下にあります。
<source>
@type tail
path C:\****\log\access.log ← 読込対象ファイルのパス
pos_file C:\opt\td-agent\log\access.log.pos ← 読み込んだポジションの格納先
tag sample ← 読み込んだ内容にsampleタグを付ける
format ltsv ← ログデータの形式に合わせる
</source>
<match sample> ← マッチ対象はsampleタグ
@type elasticsearch ← Elasticsearchに送信するため
host localhost
port 9200
</match>
ElasticsearchとKibanaの設定
ElasticsearchとKibanaの設定について、今回はローカル環境で実施するため、デフォルドの設定はいいです。
elasticsearch-6.5.3\config\elasticsearch.yml ← elasticsearchの設定ファイル
kibana-6.5.3\config\kibana.yml ← kibanaの設定ファイル
可視化
環境構築をした上、作ったアプリにアクセスすると、Elasticsearchにデータが入るようになるので、Kibanaの「Management」→「Index Patterns」→「Create index pattern」で「fluentd」のインデックスを選択して、
「Configure settings」を「timelog」に設定して、「Create index pattern」を押下します。
それで、「fluentd」というインデックスがKibanaのDiscoveryで見えます。
ログデータのグラフ化はKibanaのvisualzeで設定しますが、今回は省略します。
豆知識
Elasticsearchはインデックスに登録するデータのうち、日付としてフォーマットされているフィールドを自動でdate
型にマッピングします。詳細はここに参照してください。
上記で出力されたアクセスログの「timeLog」の項目について、 Elasticsearchが日付として、自動認識してくれてます。
また、今回の実施環境では、以下のように各プロダクト、データのTimezoneがずれた状態で実施してしまったため、Kibanaでうまく表示できない問題が発生しました
- インデックスに登録したデータ → JST
- Elasticsearch → UTC
- KibanaのTimezone → JST
この状態でデータを登録し、Kibanaで表示すると、アクセスログの時間が日本時間とは異なる時刻で表示されてしまいました。
解決方法:
Kibanaの「Timezone for date formatting」設定を変更します。
変更場所:「Management」→「Advanced Settings」→「Timezone for date formatting」
変更内容:デフォルトの「browser」→「Etc/UTC」に変更