5.6. ロギング
Seam の前は最も単純なログメッセージでさえ冗長なコードが必要でした。
private static final Log log = LogFactory.getLog(CreateOrderAction.class);
public Order createOrder(User user, Product product, int quantity) {
if ( log.isDebugEnabled() ) {
log.debug("Creating new order for user: " + user.username() +
" product: " + product.name() + " quantity: " + quantity);
}
return new Order(user, product, quantity);
}
Seam はこうしたコードを大幅に簡素化するロギング API を提供します。
@Logger private Log log;
public Order createOrder(User user, Product product, int quantity) {
log.debug("Creating new order for user: #0 product: #1 quantity: #2",
user.username(), product.name(), quantity);
return new Order(user, product, quantity);
}
log 変数を静的に宣言したかどうかに関係なく、 エンティティ Bean コンポーネント (log 変数が静的でなければならない) 以外ならいずれでも動作します。
文字列連結は
debug() メソッド内部で起こるため、 冗長な if ( log.isDebugEnabled() ) による保護は不要です。 Seam は log のインジェクト先を認識できるため、 通常はログカテゴリを明示的に指定する必要もありません。
User と Product が現在のコンテキストで有効な Seam コンポーネントならコードはさらに簡潔になります。
@Logger private Log log;
public Order createOrder(User user, Product product, int quantity) {
log.debug("Creating new order for user: #{user.username}
product: #{product.name} quantity: #0", quantity);
return new Order(user, product, quantity);
}
Seam ロギングは出力の送信先を log4j または JDK ロギングのどちらにするのかを自動的に選択します。 log4j がクラスパスにある場合はこれが使用されます。そうでない場合は Seam は JDK ロギングを使用します。