Java 逆引き集 | ロギングの基本(slf4j + Logback 等) — 運用ログ

Java Java
スポンサーリンク

ロギングの基本(slf4j + Logback 等) — 運用ログ

アプリケーションの「動作記録」を残すのがロギング。
print文でのデバッグから卒業し、slf4j + Logback を使うと、運用に耐えるログが簡単に書けます。初心者向けに、基本のコード例とテンプレートを整理します。


ロギングの役割

  • 開発中: デバッグ情報を確認。
  • 運用中: 障害調査、監査、性能分析。
  • 特徴: 出力レベルを切り替え、ファイルやコンソールに柔軟に出力できる。

slf4j(ログのAPI)と Logback(実装)

  • slf4j: ロギングの「共通インターフェース」。コードは slf4j に依存。
  • Logback: 実際にログを出力する「実装」。設定ファイルで出力先やフォーマットを制御。
  • メリット: 実装を差し替えてもコードはそのまま。log4j2 などにも切り替え可能。

基本コード例

1. ロガーの取得

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class App {
    private static final Logger log = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) {
        log.info("アプリ開始");
        log.debug("詳細情報: args={}", args.length);
        try {
            int x = 10 / 0;
        } catch (Exception e) {
            log.error("エラー発生", e);
        }
    }
}
Java
  • ポイント:
    • LoggerFactory.getLogger(クラス) でロガーを取得。
    • log.info, log.debug, log.error などレベルごとに出力。
    • {} プレースホルダで変数を埋め込める。

2. ログレベルの意味

レベル用途
TRACE最も詳細。ステップごとの追跡。
DEBUG開発時の詳細情報。
INFO通常の動作記録。
WARN注意すべき事象。
ERROR重大なエラー。

👉 運用では INFO 以上を出力、開発時は DEBUG まで出すのが一般的。


3. Logback の設定例(logback.xml)

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
Java
  • pattern: 出力フォーマット。日時・レベル・クラス名・メッセージ。
  • root level: 全体のログレベル。ここを DEBUG にすると詳細まで出る。

例題で練習

例題1: ユーザー登録処理のログ

public void registerUser(String name) {
    log.info("ユーザー登録開始: {}", name);
    try {
        // 登録処理
        log.debug("DBに保存中: {}", name);
        log.info("ユーザー登録成功: {}", name);
    } catch (Exception e) {
        log.error("ユーザー登録失敗: {}", name, e);
    }
}
Java

👉 正常系は INFO、詳細は DEBUG、例外は ERROR。


例題2: バッチ処理の進捗ログ

for (int i = 0; i < tasks.size(); i++) {
    log.info("タスク {}/{} 実行中", i+1, tasks.size());
    try {
        tasks.get(i).run();
    } catch (Exception e) {
        log.warn("タスク失敗: index={}", i, e);
    }
}
Java

👉 進捗は INFO、失敗は WARN。


例題3: 外部API呼び出しのログ

log.info("API呼び出し開始: url={}", url);
var response = client.get(url);
log.debug("レスポンス詳細: {}", response);
if (response.isError()) {
    log.error("APIエラー: {}", response.getStatus());
}
Java

👉 呼び出し開始は INFO、詳細は DEBUG、エラーは ERROR。


テンプレート集

ロガー定義

private static final Logger log = LoggerFactory.getLogger(クラス名.class);
Java

ログ出力

log.info("処理開始: {}", param);
log.debug("詳細: {}", detail);
log.warn("注意: {}", warning);
log.error("エラー: {}", error, exception);
Java

設定ファイル(logback.xml)

<root level="INFO">
  <appender-ref ref="STDOUT"/>
</root>
Java

まとめ

  • slf4j: ロギングの共通API。
  • Logback: 実装。設定ファイルで制御。
  • ログレベル: TRACE/DEBUG/INFO/WARN/ERROR を使い分ける。
  • 実務: INFOで通常記録、DEBUGで詳細、ERRORで障害。

👉 練習課題として「注文処理クラス」を作り、開始・成功・失敗をログに出すと、ログレベルの使い分けが体感できます。

タイトルとURLをコピーしました