1. 概要

このチュートリアルでは、ローカル開発から持続可能なマルチコンテナソリューションまで、DockerでSpring Bootログにアクセスする方法について説明します。

2. 基本的なコンソール出力

まず、以前の記事からSpring BootDockerイメージを作成しましょう。

$> mvn spring-boot:build-image

次に、コンテナを実行すると、コンソールにSTDOUTログがすぐに表示されます。

$> docker run --name=demo-container docker.io/library/spring-boot-docker:0.0.1-SNAPSHOT
Setting Active Processor Count to 1
WARNING: Container memory limit unset. Configuring JVM for 1G container.

このコマンドは、Linuxシェル tail-fコマンドのようなログに従います。

次に、 application.properties ファイルに行を追加して、ログファイルアペンダーを使用してSpring Bootアプリケーションを構成しましょう。

logging.file.path=logs

次に、実行中のコンテナで tail -f コマンドを実行しても、同じ結果を得ることができます。

$> docker exec -it demo-container tail -f /workspace/logs/spring.log > $HOME/spring.log
Setting Active Processor Count to 1
WARNING: Container memory limit unset. Configuring JVM for 1G container.

単一コンテナソリューションについては以上です。 次の章では、構成されたコンテナからのログ履歴とログ出力を分析する方法を学習します。

3. ログファイル用のDockerボリューム

ホストファイルシステムからログファイルにアクセスする必要がある場合は、Dockerボリュームを作成する必要があります。

これを行うには、次のコマンドを使用してアプリケーションコンテナを実行できます。

$> mvn spring-boot:build-image -v /path-to-host:/workspace/logs

次に、 /path-to-hostディレクトリにあるspring.logファイルを確認できます。

Docker Compose に関する以前の記事から始めて、DockerComposeファイルから複数のコンテナーを実行できます。

Docker Composeファイルを使用している場合は、ボリューム構成を追加する必要があります。

network-example-service-available-to-host-on-port-1337:
image: karthequian/helloworld:latest
container_name: network-example-service-available-to-host-on-port-1337
volumes:
- /path-to-host:/workspace/logs

次に、記事Composeファイルを実行してみましょう。

$> docker-compose up

ログファイルは、 /path-to-hostディレクトリにあります。

基本的なソリューションを確認したので、より高度な dockerlogsコマンドについて見ていきましょう。

次の章では、SpringBootアプリケーションがログをSTDOUTに出力するように構成されていることを前提としています。

4. 複数のコンテナのDockerログ

一度に複数のコンテナーを実行するとすぐに、複数のコンテナーから混合ログを読み取ることができなくなります。

Docker Composeのドキュメントには、 dockerlogsコマンドをサポートするjson-fileログドライバーがデフォルトでコンテナーに設定されていることがわかります。

DockerComposeの例でどのように機能するかを見てみましょう。

まず、コンテナIDを見つけましょう。

$> docker ps
CONTAINER ID        IMAGE                           COMMAND                  
877bb028a143        karthequian/helloworld:latest   "/runner.sh nginx"       

次に、 dockerlogs-fコマンドを使用してコンテナログを表示できます。 json-file ドライバーにもかかわらず、出力はプレーンテキストのままであることがわかります—JSONはDockerによって内部的にのみ使用されます。

$> docker logs -f 877bb028a143
172.27.0.1 - - [22/Oct/2020:11:19:52 +0000] "GET / HTTP/1.1" 200 4369 "
172.27.0.1 - - [22/Oct/2020:11:19:52 +0000] "GET / HTTP/1.1" 200 4369 "

-f オプションは、 tail-fシェルコマンドのように動作します。生成されたログ出力をエコーします。

コンテナをSwarmモードで実行している場合は、代わりにdockerservicepsおよびdockerservicelogsコマンドを使用する必要があることに注意してください。

ドキュメントでは、 docker logs コマンドが制限された出力オプションをサポートしていることがわかります: json-file local、または[X152X ]journald。

5. ログ集約サービス用のDockerドライバー

docker logs コマンドは、インスタントウォッチングに特に役立ちます。複雑なフィルターや長期的な統計は提供されません。

そのために、Dockerはいくつかのログ集約サービスドライバーをサポートしています。 前の記事でGraylogを学習したので、このプラットフォームに適切なドライバーを構成します。

この構成は、daemon.jsonファイル内のホストに対してグローバルにすることができます。 Linuxホストの場合は/etc / docker に、Windowsサーバーの場合は C:\ ProgramData \ docker \configにあります。

daemon.json ファイルが存在しない場合は、作成する必要があることに注意してください。

{ 
    "log-driver": "gelf",
    "log-opts": {
        "gelf-address": "udp://1.2.3.4:12201"
    }
}

GraylogドライバーはGELFと呼ばれます—GraylogインスタンスのIPアドレスを指定するだけです。

単一のコンテナを実行しているときにこの構成をオーバーライドすることもできます

$> docker run \
      --log-driver gelf –-log-opt gelf-address=udp://1.2.3.4:12201 \
      alpine echo hello world

6. 結論

この記事では、DockerでSpring Bootログにアクセスするさまざまな方法を確認しました。

STDOUTにログを記録すると、単一コンテナーの実行からログを非常に簡単に監視できます。

ただし、コンテナーには適切なサーバーと同じ制約がないため、Dockerログ機能を利用したい場合は、ファイルアペンダーを使用するのが最善のオプションではありません。