はじめに
前回の記事で、SpringBootWebアプリケーションをコンテナ化しました。
ここで作成したコンテナでは、このままだとアプリケーションログが永続化されないので、コンテナ外に保存し永続化します。
application.propertiesを修正
<project-root>\src\main\resources\application.properties
にてログ出力先を指定します。
以下を追記します。
/app/logs/application.log
にログが出力されるようになります。
※コンテナ内のパスになります
logging.file.name=/app/logs/application.log
デフォルトでは[INFO]
レベルのログしか出力しないので[ERROR]
以上を出力したいのでさらに以下記述を上記同様にapplication.properties
に追加します。
logging.level.root=INFO
logging.level.org.springframework=ERROR
さらにスタックトレースも出力してほしいので以下も追記します。
logging.exception-conversion-word=%wEx
ロギングのフォーマットもここで設定可能ですが、今回はスキップします。
コンテナ起動
コンテナ外部のディレクトリをマウントした状態でコンテナを起動します。
docker run -d -p 8080:8080 -v /logs/test-container:/app/logs --name my-app test-container
上記コマンドにより、ホスト側の/logs/test-container
にapplication.properties
にて指定したログの出力先がマウントされます(永続化される)。
確認
$ cat /logs/test-container/application.log
2025-03-10T13:55:07.857Z INFO 1 --- [backend] [main] com.example.demo.BackendApplication : Starting BackendApplication v0.0.1-SNAPSHOT using Java 21 with PID 1 (/app/backend-0.0.1-SNAPSHOT.jar started by root in /app)
2025-03-10T13:55:07.863Z INFO 1 --- [backend] [main] com.example.demo.BackendApplication : No active profile set, falling back to 1 default profile: "default"
2025-03-10T13:55:09.357Z INFO 1 --- [backend] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2025-03-10T13:55:09.358Z INFO 1 --- [backend] [main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.36]
2025-03-10T13:55:09.399Z INFO 1 --- [backend] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2025-03-10T13:55:10.062Z INFO 1 --- [backend] [main] com.example.demo.BackendApplication : Started BackendApplication in 3.147 seconds (process running for 4.078)
WARN以上を確認できませんでしたが、問題なく取れました。
デフォルトではorg.springframework.web
は404NotFoundなどはWARNレベルに出力しないようです。
以下を設定すれば取れました。
logging.level.org.springframework.web=WARN
2025-03-10T14:12:01.981Z WARN 1 --- [backend] [http-nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `int` from String "a": not a valid `int` value]
おわりに
やっぱり手を動かしながらだと理解度が桁違いですね