ログはバグの洗い出しやセキュリティ監視などあらゆる面で役に立つ。今後はデータ分析という文脈でもログは生きてくると思う。

Spring Bootではロギングライブラリとして Logbackが採用されており、以下がデフォルトのログ設定となっている。

  • コンソールへのログ出力
  • ログレベル:INFO

そのため、INFOレベルのログを出すだけでよければ何も設定することはない。ただ、現実的にはログ出力内容設定ログのファイル出力設定を検討しておいた方が良い。

ログ出力内容設定について

ログ出力内容はどのようなレベルでログを出すか、どのような詳細内容までログを出すか、という点になる。ログレベルは本番環境や開発環境で変えた方がいいケースもあるため、時間をかけて検討した方が良いと思う。Spring Bootでログを設定する場合はapplication.properties(もしくはapplication.yaml)に記載する。src/main/resources/配下にデフォルトで配置されているのでファイルを新規作成する必要はない。

ログレベルについて

ログレベルの設定はlogging.levelに設定する。logging.level.root、logging.level.org.springframework.web、logging.level.パッケージ名の3つ。logging.level.rootはアプリケーション全体のログレベルの設定で、パッケージには依存せず、全体のログが対象。logging.level.org.springframework.webはorg.springframework.webパッケージに限定したログの設定になる。logging.level.パッケージ名はそのパッケージに限定したログの設定。パッケージ単位で詳細にログ管理したいときに使う。主にこの3パターンの設定を考慮しておきたい。

次にプロパティに設定するログレベルについて確認する。ログレベルは主に6パターンある。TRACEが最も詳細であり、TRACEを設定すると、DEBUG以下も表示される。INFOを設定すると、TRACE、DEBUGは表示されないが、WARN以下は表示される。一般的に主な設定はTRACE、DEBUG、INFOかと思うし、TRACEレベルまで表示することは少ないというか、TRACEを設定する手間を考えるとSystem.out.pritlnで雑に表示させてしまっているし、なんならTRACEレベルの内容を確認するためにはブレークポイントで見ても良い気がする。細かくログ出力を書きすぎるのも考えものなので。

ログレベルの一覧

ログレベル概要備考
TRACE最も詳細のログ変数変更レベルなど細かいレベルのログ。
DEBUG開発者が開発で必要な内容を記録するログAPIのリクエストやクエリの実行内容や処理の分岐など。
INFOアプリケーションの正常処理を記録するログアプリの起動、ログイン成功など。
WARN問題はあるがアプリ動作に影響がない内容を記録するログファイルがないのでデフォルト値を設定した、など
ERRORエラーや例外処理発生を記録するログ。アプリは落ちないが、何かがおかしいDB接続失敗、ヌルポなど
FATALシステムを停止する可能性があるような重大エラーを記録するログOut Of Memoryなど。

上記がログレベルだが、設定値としてはDEBUGか、INFOではないだろうか。そして、ローカル環境、開発環境まではDEBUG、本番環境はINFOが良いのではないかと思う。で、application-dev.properties、application-prod.propertiesの2つを用意しておき、application.propertiesの設定で読み込むファイルを切り替えるようにすれば良いのではないかと思う。

開発環境のログ設定

開発用は基本的にDEBUGで良いと思う。ただ、もし詳細に確認したいパッケージの場合はTRACEにする。

logging.level.root=DEBUG
logging.level.org.springframework.web=DEBUG
logging.level.dev.itboot.mb=TRACE

本番環境のログ設定

本番環境は基本的にINFOになると思う。ログ出力をしすぎるとサーバ負荷も高くなってしまうので本番はINFOで良いと思う。もしバグが出た場合は詳細に見たいかもしれないがそれは開発環境で確認するのが良いだろう。INFOであってもWARN以上は出力されるので落ちる原因の調査には事足りると思う。

logging.level.root=INFO
logging.level.org.springframework.web=INFO
logging.level.dev.itboot.mb=INFO

ちなみに環境ごとに設定を切り替える場合はapplication-{profile}.propertiesで切り替えられるらしい(まだ試していないが)。たとえばapplication-dev.propertiesとapplication-prod.propertiesを作っておき、application.propertiesにspring.profiles.active=devと設定すればapplication-dev.propertiesを読み込んでくれる。jarファイルを動かすときにパラメータで切り替えることもできる。

ログの出力パターン設定について

どのようなログを出力するか、は最も重要なポイントだと思う。ファイルはlogging.pattern.file、コンソールはlogging.pattern.consoleに設定する。個人的には以下の設定をコピペしてもらえればいいんじゃないかと思う。%d{yyyy-MM-dd HH:mm:ss.SSS}はタイムスタンプ形式、パフォーマンスの時間なども監視できるのでmsまで。[%thread]はログを出力したスレッド名、%-5levelはログレベル、DEBUGとか、INFOとか。%logger{36}はロガーの名前で通常はクラス名。36は表示する文字数だけど最大が36文字なので36で良いと思う。%msgはメッセージ内容、%nは改行する。

# ファイル出力用ログフォーマット
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

# コンソール出力用ログフォーマット
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

こんな感じでログが出る↓

ログのファイル出力設定について

ログ出力がコンソールだけだと後で調査するときなどにログが流れてしまうので特に本番環境はファイル出力しておいた方が無難。logging.file.nameにログファイルの出力先を指定できる。これだとアプリケーションは以下のlogsファイルにapplication.logという名前のファイルにログが吐き出される。

logging.file.name=logs/application.log

本番環境だとログが流れないようにローテーションやマックスファイルサイズを指定しておくと安心かもしれない。容量を空けるためにファイル圧縮の検討もしておいた方がなお良いと思う。

logging.file.max-size=50MB
logging.file.total-size-cap=500MB
logging.file.max-history=30

色々と説明を書いたが、application.propertiesは以下をフォーマットにしてもらえば良いと思うのでよければコピペどうぞ。

application.properties

# アプリ名 ※オリジナル名
spring.application.name=AppName
# ログレベルの設定 ※本番は全てINFO
logging.level.root=DEBUG
logging.level.org.springframework.web=DEBUG
logging.level.dev.itboot.mb=TRACE

# ログファイルの名前とパス
logging.file.name=logs/application.log

# ファイル出力用ログフォーマット
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

# コンソール出力用ログフォーマット
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

# ログファイルのサイズやローテーション。※本番だけコメントアウト外す。ファイル圧縮も検討
# logging.file.max-size=50MB
# logging.file.total-size-cap=500MB
# logging.file.max-history=30