ロギング: SLF4J + Logback

System.out ではなくロガーを使う。

SLF4J
ロギングファサード。
Logback
高速なロギング実装。
ログレベル
TRACE < DEBUG < INFO < WARN < ERROR
Flight Recorder

ログは「飛行記録装置(ブラックボックス)」。 何かがおかしくなったとき、何が起きたか後から確認できる。 System.out は消えるが、ログは残る。

ロギング

SLF4J Logger
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserService {
// ロガーの取得
private static final Logger log =
LoggerFactory.getLogger(UserService.class);
public User findById(Long id) {
log.debug("Finding user with id: {}", id);
try {
User user = repository.findById(id);
log.info("Found user: {}", user.getName());
return user;
} catch (Exception e) {
log.error("Failed to find user: {}", id, e);
throw e;
}
}
}
出力例
10:30:15 [main] DEBUG UserService - Finding user with id: 1\n10:30:15 [main] INFO UserService - Found user: Alice
Bad
// ❌ Bad: System.out で出力
System.out.println("User found: " + user);
e.printStackTrace();
Good
// ✅ Good: ロガーを使用
log.info("User found: {}", user);
log.error("Error occurred", e);

設定

Log levels, logback.xml
// ログレベル(重要度順)
log.trace("Very detailed"); // 最も詳細
log.debug("Debugging info"); // 開発時
log.info("Normal info"); // 運用情報
log.warn("Warning"); // 警告
log.error("Error!", e); // エラー
// Logback 設定 (logback.xml)
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>app.log</file>
<encoder>
<pattern>%d %level [%thread] %logger{10} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<logger name="com.example" level="DEBUG"/>
</configuration>
Tip: 本番は INFO、開発は DEBUG。

合格ライン

SLF4J を使える
ログレベルを使い分けられる

参考リンク

演習課題

課題1: SLF4J
SLF4J + Logback でログ出力を設定してください。
課題2: ログレベル
DEBUG, INFO, WARN, ERROR の使い分けを練習してください。

次のステップ