Spring Bootは複数のロギングフレームワークをサポートしており、標準ではSLF4J(Simple Logging Facade for Java)を介してLogbackが使用されます。本記事では、SLF4Jを用いたログ出力の基本から設定方法まで解説します。
ログ出力の構造
典型的なSpring Bootのログ出力例を以下に示します:
2024-02-25T15:01:11.515+08:00 INFO 3272 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path ''
- タイムスタンプ:ISO 8601形式で、ミリ秒とタイムゾーン(例:UTC+8)を含む
- ログレベル:INFO、WARN、ERRORなど(後述)
- PID:プロセス識別子(例:3272)
- スレッド名:例:main
- ロガー名:クラス名の略記(例:o.s.b.w.embedded.tomcat.TomcatWebServer)
- メッセージ:実際のログ内容
ログレベルの階層
ログレベルは重要度が高い順に以下の通りです:
- ERROR:重大なエラー
- WARN:警告(エラーではないが注意が必要)
- INFO:一般的な情報(アプリケーションの状態など)
- DEBUG:開発時の詳細情報
- TRACE:最も詳細なトレース情報
デフォルトでは、Spring BootはINFOレベル以上のログのみを出力します。必要に応じて、application.propertiesでパッケージやクラス単位でレベルを調整可能です:
logging.level.com.example.c0101.controller=DEBUG
ログの出力方法
KotlinでSLF4Jロガーを初期化するには、次のようにします:
import org.slf4j.LoggerFactory
class SampleService {
companion object {
private val logger = LoggerFactory.getLogger(SampleService::class.java)
}
fun process() {
logger.error("重大な問題が発生しました")
logger.warn("推奨されない操作が検出されました")
logger.info("処理が正常に完了しました")
logger.debug("内部ステータス: {}", status)
logger.trace("メソッド entry point")
}
}
getLogger()にクラスオブジェクトを渡すことで、ログ出力時に完全修飾クラス名が自動的に表示されます。文字列を渡すとその文字列がロガー名として使われますが、通常はクラス参照の使用が推奨されます。
ログの永続化設定
コンソールだけでなく、ファイルにもログを保存できます。
出力ディレクトリの指定
logging.file.path=logs
これにより、現在のプロジェクト直下にlogsディレクトリが作成され、その中にログファイル(例:spring.log)が出力されます。
ファイル名の明示的指定
logging.file.name=myapp.log
この設定はlogging.file.pathより優先され、カレントディレクトリにmyapp.logが作成されます。
ログのローテーション設定
Logbackベースのローテーションポリシーを以下のように設定できます:
logging.logback.rollingpolicy.max-history=7
logging.logback.rollingpolicy.max-file-size=10MB
max-history:保持するログファイルの最大日数(例:7日)max-file-size:1ファイルあたりの最大サイズ(例:10MB)。超過時は圧縮されたアーカイブ(例:myapp.log.2024-02-25.0.gz)として保存
これらの設定により、ディスク容量を効率的に管理しながら必要なログを保持できます。