ロギング: SLF4J + Logback
System.out ではなくロガーを使う。
SLF4J
ロギングファサード。
Logback
高速なロギング実装。
ログレベル
TRACE < DEBUG < INFO < WARN < ERROR
ロギング
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.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 の使い分けを練習してください。