一般的な取得方法
private static final Logger logger = LoggerFactory.getLogger(TestSub1.class);
この場合、クラスファイル毎に記述が異なり、コピーする場合注意する必要がある。
TestSample1.java
package test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestSample1 {
private static final Logger logger = LoggerFactory.getLogger(TestSub1.class);
public void exec() {
logger.debug("Exec method was executed.");
}
}
thisを使って取得
private final Logger logger = LoggerFactory.getLogger(this.getClass());
thisを使用する場合、static
にすることができないが、どのクラスファイルでも記述が同じため、コピーすることができる。
TestSample2.java
package test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestSample2 {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public void exec() {
logger.debug("TestSample#Exec method was executed.");
}
}
クラス名取得メソッドを使用
private static final Logger logger = LoggerFactory.getLogger(Util.getClassName());
Util#getClassName
メソッドを使用することで、どのクラスファイルでも記述が同じため、コピーすることができる。またstatic
でも使用可能。
TestSample3.java
package test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestSample3 {
private static final Logger logger = LoggerFactory.getLogger(Util.getClassName());
public void exec() {
logger.debug("TestSample3#exec method was executed.");
}
}
Util.java
package test;
public class Util {
public static String getClassName() {
return Thread.currentThread().getStackTrace()[2].getClassName();
}
}
CDIの場合
@Produces
と@Inject
を使用して、Logger
にインスタンスを注入することが可能。
どのクラスファイルでも記述が同じため、コピーすることができる。
SampleManagedBean.java
package test.mb;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
@Named
@SessionScoped
public class SampleManagedBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private transient Logger logger;
public String execute() {
logger.info("SampleManagedBean#execute method was executed.");
return null;
}
}
LoggerFactoryProducer.java
package test.util;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Dependent
public class LoggerFactoryProducer {
@Produces
public Logger getLogger(InjectionPoint ip) {
return LoggerFactory.getLogger(ip.getMember().getDeclaringClass().getName());
}
}
以上